① 怎么用c++建立单循环链表
#include <iostream.h>
#include <蠢伍stdio.h>
#include <stdlib.h>
typedef struct node
{
int date;
struct node *next;
}slnode,*Linklist;
void creat_list(Linklist H)//创建链表,由于实参传值使L指向了一个空节点从而成为头节点指针
{
Linklist p, p1;
int n;
cout<<"请输入结点数"<<endl;
cin>>n;
H->date=n;
cout<<"请输入结点数据"<<endl;
p1 = H;//使p1具有了空间
for(int i=0;i<n;i++)
{
p=(Linklist)malloc(sizeof(slnode));
p->next = NULL;
cin>>p->date;
H->next = p;
H=p;//L指向了最后节点的数据域
};
H=p1;//使尾指针指向了最后节点的数据域
}
void display_list(Linklist H)//输出链表
{
cout<<"输出"<<endl;
Linklist p;
p = H-> next;
for(int i=0;i<H->date;i++)
{
cout<<p->date;
cout <<缺档皮 ' ';cout<<' ';
p = p -> next;伏差
}
}
void main()
{
slnode a;//a是空结构变量
Linklist p;//p是指针
p = &a;//p指向了一个空节点
creat_list(p);//传的是结构变量的地址
display_list(p);
}
② 如何用c语言编写一个链表
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct Node
{
int data;//数据域
struct Node * next;//指针域
};
/*************************************************************************************
*函数名称:Create
*函数功能:创建链表.
*输入:各节点的data
*返回值:指针head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函数名称:insert
*函数功能:在链表中插入元素.
*输入:head 链表头指针,p新元素插入位置,x 新元素中的数据域内容
*返回值:无
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函数名称:del
*函数功能:删除链表中的元素
*输入:head 链表头指针,p 被删除元素位置
*返回值:被删除元素中的数据域.如果删除失败返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函数名称:print
*函数功能:打印链表中的元素
*输入:head 链表头指针
*返回值:无
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函数名称:main
*函数功能:主函数创建链表并打印链表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}
③ C语言建立循环链表
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct list
{
int num;
struct list *next;
}List;
int n=0;
List *creat()
{
List *head,*p1,*p2;
int i;
if((head=(List *)malloc(sizeof(List)))==NULL)
{
printf("Error");
exit(0);
}
p1=p2=head;
printf("输入创建链表的长度:");
scanf("%d",&head->num);//创建列表,带头结点,头结点数据域表示输入的个数
if(head->num==0)
{
head->next=NULL;
printf("已创建带头结点的空链表");
}
else
{
printf("输入数据:\n");
for(i=0;i<head->num;i++)
{
if((p1=(List *)malloc(sizeof(List)))==NULL)
{
printf("Error");
exit(0);
}
scanf("%d",&p1->num);
p2->next=p1;
p2=p1;
}
p1->next=head;
}
return(head);
}
void print(List *head)
{
List *p;
p=head->next;
for(;p!=head;)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
void main()
{
List *head;
head=creat();
print(head);
}
④ 关于C语言版数据结构中的单循环链表
void showlist(linklist head){//遍历输出链表
listnode *p;
p=head;
if(p->next=head){//这行里的p->next=head应写成p->next==head
printf("list is empty!\n");
return;
}
else{
while((p=p->next)!=head){
printf("%d ",p->data);
}
}
}
⑤ 如何创建一个空的c语言双向循环链表
只是双向给你参考... 加个循环对你应该问题不大吧...
⑥ 线性表 单向循环链表的操作(C语言)
这是将数模昌据写入链表 你的程序比较乱而且旦御扒没有注释改拆樱起来比较费劲,
你第二个函数的功能是计算一个节点数据中字符串的长度还是计算链表中元素的个数?表达不明确!
SLNode *LinkedListInit()
{
int N
LinkedList L;
L=(LinkedList)malloc(sizeof (SLNode));
do{
printf("Please Enter Data:");
scanf("%d",&L->data);//添加数据到链表
L->next=L;
printf("停止输入数据请按0继续请按1!");
printf("Enter:");
scanf("%d",&N);
}while(N!=0);
return L;
}
⑦ 【悬赏】C语言,数据结构,循环链表问题!
1、指针指向一个结点是指枣行闷利用此指针可以直接访问这个结点,包括这带亏个结点的data和next所以指针指向最后一个结点,代表这个指针是最后一个结点的地址
2、循环链表是最后一个结点的next域指向头结点,上面的方法是尾插法建链表,新建的结点插在表尾,即为最后一个结点,所以每建一个,其next域就应修改为head
3、//La和Lb是两个仅设尾凳弯指针的循环链表
//将Lb合并到La的表尾,由La指示新表
void MergeList(LinkList * La,LinkList Lb)
{
LinkList p = Lb->next;
Lb->next = (* La)->next;
(* La)->next = p->next;
free(p);
(* La) = Lb;
}
⑧ 用C语言编写一个程序,建立双向循环链表,并实现它的插入操作、删除操作
望笑纳~
//CreateList_L.cpp
//To create a LinkList
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
# define TRUE 1
# define FALSE 0
# define OK 1
# define ERROR 0
# define INFEASIBLE -1
# define OVERFLOW -2
typedef struct DuLNode
{ int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
// 初始条件:L已存在。操作结果:返回L中数据元素个数
int ListLength(DuLinkList L)
{
int i=0;
DuLinkList p=L->next; // p指向第一个结点
while(p!=L) // p没到表头
{
i++;
p=p->next;
}
return i;
}
// 由双链循环线性表L的头结点出发,正序输出每个数据元素
void ListTraverse(DuLinkList L)
{
DuLinkList p=L->next;
while(p!=L)
{
cout<<p->data<<"\t";
p=p->next;
}
cout<<endl;
}
// 由双链循环线性表L的头结点出发,逆序输出每个数据元素
void ListTraverseBack(DuLinkList L)
{
DuLinkList p=L->prior;
while(p!=L)
{
cout<<p->data<<"\t";
p=p->prior;
}
cout<<endl;
}
//To Creatre a DuLinkList L with HeadNode
void CreateList_DuL(DuLinkList &L)
{
int n;
int i;
DuLNode *p;
L=(DuLinkList)malloc(sizeof(DuLNode));
L->next=L->prior=L;
cout<<"CreateList_L"<<endl<<"================"<<endl;
cout<<"Please input the Init DuLinkNode Number: <eg. 5> ";
cin>>n;
cout<<"Please input the data for DuLinkList Nodes: <eg. 34,67,3,-9,45,...>"<<endl;
for(i=n;i>0;--i)
{
p=(DuLinkList)malloc(sizeof(DuLNode));
cin>>p->data; //Reverse order inputing for Creating a LinkList
p->prior=L;
p->next=L->next;
L->next->prior=p;
L->next=p;
}
if(n)
{
cout<<endl;
cout<<"Success to Create a DuLinkList !"<<endl;
ListTraverse(L);
cout<<endl;
}
else cout<<"A NULL DuLinkList have been created !"<<endl;
}
//ListInsert_Dul()
int ListInsert_DuL(DuLinkList &L)
{
DuLNode *p=L,*s;
int j=0;
int i;
int e;
cout<<"======"<<"before insert:"<<"======"<<endl;
ListTraverse(L);
cout<<"input the location you want to insert:";
cin>>i;
while (i<1||i>ListLength(L)+1)
{
//i值不合法
cout<<"illeagle location,please input the correct location:";
cin>>i;
}
cout<<"input the number you want to insert:";
cin>>e;
while(j<i)
{ p=p->next;
++j;
}
if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
{
cout<<endl<<"Allocate space failure ! " ;
return (ERROR);
}
s->data=e;
s->prior=p->prior;
s->next=p;
if(i==1)
L->next=s;
p->prior->next=s;
p->prior=s;
cout<<"has insert:"<<e<<endl;
ListTraverse(L);
cout<<"======"<<"after insert:"<<"======"<<endl<<endl;
return (OK);
}
// 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长
int ListDelete(DuLinkList L)
{
DuLinkList p;
int j=1; // j为计数器
int e;
int i;
cout<<"input the location of the number you want to delete"<<endl;
cin>>i;
while(i<0||i>ListLength(L))
{
//i值不合法
cout<<"illeagle location,please input the correct location:";
cin>>i;
}
p=L->next; // p指向第一个结点
while(p!=L&&j<i) // 顺指针向后查找,直到p指向第i个元素或p指向头结点
{
p=p->next;
j++;
}
if(p==L||j>i) // 第i个元素不存在
{
cout<<"第i个元素不存在"<<endl;
return ERROR;
}
else
{
cout<<"======"<<"before delete:"<<"======"<<endl;
ListTraverse(L);
e=p->data; // 取第i个元素
if(!p) // p=NULL,即第i个元素不存在
return ERROR;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
cout<<"has delete:"<<e<<endl;
ListTraverse(L);
cout<<"======"<<"after delete:"<<"======"<<endl<<endl;
return OK;
}
}
void menu(int c)
{
cout<<"================================================="<<endl;
cout<<"\t\t1----建立"<<endl;
cout<<"\t\t2----插入"<<endl;
cout<<"\t\t3----删除"<<endl;
cout<<"\t\t4----逆置"<<endl;
//cout<<"\t\t5----菜单"<<endl;
cout<<"\t\t0----退出"<<endl;
cout<<"================================================="<<endl;
cout <<endl<<"input you choice number:";
}
void main()
{
DuLinkList L;
int c=1;
while(c!=0)
{
switch(c)
{
case 0:
break;
case 1:
CreateList_DuL(L);
break;
case 2:
ListInsert_DuL(L);
break;
case 3:
ListDelete(L);
break;
case 4:
ListTraverseBack(L);
break;
default:
cout<<"infeasible choice,input again:"<<endl;
menu(c);
cin>>c;
}
if(c!=0)
{
menu(c);
cin>>c;
}
}
}
⑨ 小女跪求用c语言 循环链表 编写的约瑟夫环!!
#include<stdio.h>
#include<stdlib.h>
//声明循环链表结构体
typedefstructLNode
{
intnum;//数据域
structLNode*next;//结构体指针
}LNode;//结点类型
//创建结点
LNode*Create_node(intLnum)
{
LNode*Lp;//创建结点指针
Lp=(LNode*)malloc(sizeof(LNode));//分配动态储存空间
Lp->num=Lnum;//*Lp指向num,把num的值传给Lnum
Lp->next=NULL;//*Lp指向下一个元素结点为空,确定*Lp是头结点指针
returnLp;//返回头结点指针
}
//创建循环链表
LNode*Create_Linklist(LNode*pHead,intLsum)
{
intk;
LNode*p,*temp;//创建两个指针
for(k=1;k<=Lsum;k++)//遍历整个链表
{
p=Create_node(k);
//如果链表为空,创建链表第一个结点,其next指针指向自身
if(pHead==NULL)
{
temp=p;//把p的值传给temp
pHead=p;//把p的值传给pHead
temp->next=pHead;//让*temp指向的下一个位置为pHead
}
//否则,执行插入节点操作
else
{
p->next=temp->next;//空白指针跟着*p后面,一个接一个插入
temp->next=p;
temp=p;//把p的值再传给temp
}
}
//测试是否生成循环链表成功!
p=pHead;
k=1;//初始化k的值
while(p->next!=pHead)//用循环输出链表中的元素
{
printf("第%d个小孩的编号为:%d ",k,p->num);
p=p->next;//指针移向下一个位置
k++;
}
printf("第%d个小孩的编号为:%d ",k,p->num);//确保最后一个元素能显示出来
returnpHead;//返回头指针
}
//执行出列操作
voidDelete_Linklist(LNode*pHead,intLstart,intLdel)
{
inti,count=1;//count为计数器
LNode*p,*temp;
p=pHead;
//找到第M个孩子所在的位置
for(i=1;i<Lstart;i++)
p=p->next;
//只剩1个结点时终止循环
while(p->next!=p)
{
//找到要出列的孩子的位置
for(i=1;i<Ldel;i++)
{
temp=p;
p=p->next;
}
//执行出列操作
temp->next=p->next;//让*temp指向*p后面的结点
printf("第%d个出列的小孩的编号为:%d ",count,p->num);
free(p);//释放*p
count++;
//出列者的下一个孩子作为新的第一个报数者
p=temp->next;
宏扰}
printf("第%d个出列的小孩的编号为:%d ",count,p->num);
free(p);
//所有人均出列,头结点释放后赋空值,避免出现悬垂指针
pHead=NULL;
}
/*主函数*/
intmain()
{
intn,b,k;
LNode*pHead=NULL,*p;//执行初始化操作
哗绝旅//输入字符的合法性验证暂时忽略
printf("请输入小孩的个数: ");
scanf("%d",&n);
printf("请输入开始报数的小孩编号: ");
scanf("%d",&b);
printf("请输入报数数目: ");
scanf("%d",&k);
p=Create_Linklist(pHead,n);//调用创建链表函数
Delete_Linklist(p,b,k);//调用删乱凳除链表函数
return0;
}
⑩ c语言建立链表的问题,请讲循环语句中的几句详细解释下。
while(x!
=
-1) {
//
只要数据值不是-1就继续。
s
=
(struct
node
*)malloc(sizeof(struct
node));
//为结构数据s申请存储空间。
s->data
=
x;
//存入数据。
r->next
=
s;
//前一个链表的指针指向本结构。
r
=
s;
//
作为临时的s正式加入链表行列。
scanf("%d",&x);//读入新数据。
}
r->next=NULL;//
链表的最后成员的指针指向NULL,表明链表的末尾。