c语言数据结构实现循环链表,【数据结构】循环单链表的实现(C语言)

循环单链表应掌握以下基本操作:

1、建立一个空的循环单链表。

2、获得循环单链表的最后一个结点的位置。

3、输出循环单链表中各结点的值。

4、在循环单链表中查找值为x的结点。

5、在循环单链表中第i个结点后插入值为x的新结点。

6、在循环单链表中删除值为x 的结点。

以下是头文件:(可以有选择的看,有很多算法)

#ifndef CIRCLE_HEAD_LINK_H_INCLUDED

#define CIRCLE_HEAD_LINK_H_INCLUDED

#include

#include

typedef int datatype;

typedef struct circle_link

{

datatype info;

struct circle_link *next;

}N;

/*创建一个空链表*/

N *init()

{

return NULL;

}

/*创建一个循环单链表*/

N *creat(N *head)

{

printf("以输入-1为结束\n");

int x;

N *p,*q,*h=head;

scanf("%d",&x);

while(x!=-1)

{

p=(N*)malloc(sizeof(N));

p->info=x;

p->next=NULL;

if(!h)

{

q=p;

h=p;

}

else

{

q->next=p;

q=p;

}

scanf("%d",&x);

}

p->next=h;

printf("\n创建完成\n");

return h;

}

/*打印循环单链表*/

void display(N *head)

{

N *p=head;

/*打印第一个结点之后在进入循环*/

if(!head)

{

printf("该循环单链表是空的\n");

}

else

{

printf("%d  ",p->info);

p=p->next;

while(p!=head)

{

printf("%d  ",p->info);

p=p->next;

}

}

printf("%d  ",p->info);

printf("\n打印完成\n");

}

/*获得循环单链表最后一个结点的位置*/

N *rear(N* head)

{

N *p=head;

if(!head)

{

return NULL;

}

else

{

while(p->next!=head)

{

p=p->next;

}

return p;

}

}

/*在循环单链表中查找值为x的结点*/

N* find(N* head,int x)

{

N *p=head,*q;

if(!head)

{

printf("该循环单链表为空\n");

return NULL;

}

while(p->next!=head && p->info!=x)

{

p=p->next;

}

if(p->info==x)

{

return p;

}

else

{

return NULL;

}

}

/*在循环单链表中第i个结点后插入一个值为x的结点*/

N *insert(N *head,int x,int i)

{

N *p,*q,*myrear;

int j;

p=(N*)malloc(sizeof(N));

p->info=x;

if(i<0)

{

printf("无法找到指定的插入位置\n");

free(p);

return head;

}

else if(i==0 && !head)

{

p->next=p;

head=p;

return head;

}

else if(i==0 && head)

{

myrear=rear(head);/*找到循环单链表中的最后一个结点*/

p->next=head;

myrear->next=p;

head=p;

return head;

}

else if(i>0 && !head)

{

printf("该列表是空列表,无法找到插入位置\n");

free(p);

return head;

}

else if(i>0 && head)

{

q=head;

j=1;

while(i!=j && q->next!=head)

{

q=q->next;j++;

}

if(i!=j)

{

printf("表中不存在第%d个结点,无法进行插入",j);

free(p);

return head;

}

else

{

p->next=q->next;

q->next=p;

return head;

}

}

}

/*在循环单链表中删除一个值为x的结点*/

N *dele(N *head,int x)

{

N *pre,*q;

if(!head)

{

printf("\n该链表为空,无法进行删除操作");

return head;

}

else

{

q=head;

while(q->next!=head && q->info!=x)

{

pre=q;

q=q->next;

}

if(q->info!=x)

{

printf("没有找到值为%d的结点\n",x);

}

else

{

if(q!=head)

{

pre->next=q->next;free(q);

}

else

{

if(head->next==head)/*该循环单链表中只有一个结点*/

{

free(q);

head=NULL;

}

else/*删除第一个结点*/

{

pre=rear(head);

pre->next=head->next;

head=head->next;

free(q);

}

}

}

}

return head;

}

/*单链表的打印*/

void display_dan(N *head)

{

N *p=head;

if(!head)

{

printf("该单链表是空的\n");

}

else

{

while(p)

{

printf("%d  ",p->info);

p=p->next;

}

}

}

/*创建一个循环单链表*/

N *creat_dan(N *head)

{

N *p,*q;

int x;

printf("以输入-1表示结束\n");

scanf("%d",&x);

while(x!=-1)

{

p=(N*)malloc(sizeof(N));

p->info=x;

p->next=NULL;

if(!head)

{

head=p;

q=p;

}

else

{

q->next=p;

q=p;

}

scanf("%d",&x);

}

return head;

}

/*单链表找最后一个结点*/

N *rear_dan(N *head)

{

N *p=head;

if(!head)

{

printf("该链表为空\n");

return head;

}

else

{

while(p->next)

{

p=p->next;

}

return p;

}

}

#endif // CIRCLE_HEAD_LINK_H_INCLUDED

下面是主程序:

#include "stdio.h"

#include "circle_head_link.h"

int main()

{

int x,i;

N *h,*h1,*h2,*rear_1,*rear_2;

while(1)

{

printf("\n已对一个循环单链表进行初始化\n");

h=init();

printf("创建一个循环单链表\n");

h=creat(h);

printf("查找一个值为x的结点\n");

scanf("%d",&x);

if(find(h,x))

{

printf("%d",(find(h,x)->info));

}

else

{

printf("不存在info域为该值的结点!\n");

}

printf("\n在第i个结点后插入值为x的结点,下面请输入i和x\n");

scanf("%d%d",&i,&x);

h=insert(h,x,i);

display(h);

printf("\n删除循环单链表中值为x的结点,下面请输入x\n");

scanf("%d",&x);

h=dele(h,x);

display(h);

printf("\n重新创建两个单链表,并将两个单链表变成一个循环单链表\n");

printf("第一个单链表\n");

h1=init();

h1=creat_dan(h1);

display_dan(h1);

rear_1=rear_dan(h1);

printf("\n第二个单链表\n");

h2=init();

h2=creat_dan(h2);

display_dan(h2);

printf("\n合成以后\n");

rear_2=rear_dan(h2);

rear_1->next=h2;

rear_2->next=h1;

display(h1);

}

return 0;

}

你可能感兴趣的:(c语言数据结构实现循环链表)