循环单链表应掌握以下基本操作:
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;
}