循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。
循环链表的运算与单链表的运算基本一致。所不同的有以下几点:
1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。
2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
char name[32];
struct node *next;
}no;
unsigned int len=sizeof(no);
no* CreatList(unsigned int num){
int i;
no *head,*cur,*prev;
head=(no *)malloc(len);
if(head==NULL){
printf("Alloc Failed!\n");
return NULL;
}
prev=head;
head->name[0]='\0';
// strcpy(head->name,"HEAD");
head->next=NULL;
for(i=1;i<=num;i++){
cur=(no*)malloc(len);
if(cur==NULL){
printf("Alloc Failed!\n");
return NULL;
}
prev->next=cur;
printf("Pls input the name:");
scanf("%s",cur->name);
fflush(stdout);
cur->next=NULL;
prev=cur;
}
prev->next=head;
// printf("Create List OK\n");
return head;
}
void Print(no *head){
no *cur;
cur=head->next;
while(cur!=head){
printf("[%s]",cur->name);
cur=cur->next;
}
printf("\n");
}
no* Search(no* head,char *dest,unsigned int tag){//1:前节点 2:当前节点
char *str;
no *cur,*prev;
cur=head->next;
prev=head;
while(cur!=head){
str=cur->name;
if(strcmp(str,dest)==0){
// printf("Find the target\n");
if(tag==1)
return prev;
else if(tag==2)
return cur;
}
cur=cur->next;
prev=prev->next;
}
if(cur==head){
printf("Not Find the target!\n");
return NULL;
}
}
/*Search2是Search的改进版,此函数返回的是一个数组,可以同时返回两个值,包含prev和cur两个节点【使用static静态局部变量no *ret[2]】*/
no** Search2(no* head,char *dest){
static no* ret[2];//ret[0]:prev ret[1]:cur
char *str;
ret[1]=head->next;
ret[0]=head;
while(ret[1]!=head){
str=ret[1]->name;
if(strcmp(str,dest)==0){
return ret;
}
ret[1]=ret[1]->next;
ret[0]=ret[0]->next;
}
if(ret[1]==head){
printf("Not Find the target!\n");
return NULL;
}
}
void Insert(no *head,char *dest){
no *insert,*search,*prev;
insert=(no *)malloc(len);
if(insert==NULL){
printf("Alloc Failed!\n");
exit(0);
}
strcpy(insert->name,dest);
printf("Pls input insert who's name front:");
scanf("%s",dest);
search=Search(head,dest,2);
insert->next=search;
prev=Search(head,dest,1);
prev->next=insert;
}
void Delete(no *head,char *dest){
no *cur,*prev;
cur=Search(head,dest,2);
if(cur==NULL) exit(0);
prev=Search(head,dest,1);
if(prev==NULL) exit(0);
prev->next=cur->next;
}
int main(){
no *head,*search;
unsigned int num=3;
char dest[32];
char s[3+1];
memset(dest,0X00,sizeof(dest));
head=CreatList(num);
Print(head);
printf("Pls input search name:");
scanf("%s",dest);
/*使用Search2函数测试案例
search=Search2(head,dest);
printf("prev:%s\n",&(*search)->name);//ret[0]的结果
printf("cur:%s\n",&(*(search+1))->name);//ret[1]的结果
*/
while(1){
search=Search(head,dest,2);
if(search==NULL){
printf("again?(yes/no) : ");
scanf("%s",s);
if(strcmp(s,"yes")==0){
printf("Pls input search name:");
scanf("%s",dest);
}else break;
}else break;
}
while(1){
memset(dest,0X00,sizeof(dest));
printf("Pls input insert name:");
scanf("%s",dest);
if(strcmp(dest,"over")==0)
break;
Insert(head,dest);
}
Print(head);
while(1){
memset(dest,0X00,sizeof(dest));
printf("Pls input delete name:");
scanf("%s",dest);
if(strcmp(dest,"over")==0)
break;
Delete(head,dest);
}
Print(head);
}