C语言-----循环单链表

循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。
循环链表的运算与单链表的运算基本一致。所不同的有以下几点:
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值