循环单链表

来源:互联网 发布:机房 蓝屏 网络攻击 编辑:程序博客网 时间:2024/05/19 07:10
#include<stdio.h>#include<stdlib.h>typedef struct node{int data;    struct node*next;}Snode;Snode* creat()//创建头结点{int n,i,x;Snode *s,*t;    Snode *head; head=(Snode*)malloc(sizeof(Snode));head->next=NULL;head->data=0;t=head;printf("请输入要插入的结点数:\n");   scanf("%d",&n);   if(n!=0)   {printf("请输入%d个结点数的值\n",n);    for(i=0;i<n;i++)    {        scanf("%d",&x);      s=(Snode*)malloc(sizeof(Snode));  s->data=x;  s->next=t->next;  t->next=s;  t=s;    }t->next=head;//和循环双向链表一样 在这改就行了   }   return head;}int lenth(Snode *l)//求链表的长度{    int len=0;Snode *s=l;while(s->next!=l){len++;s=s->next;}return len;}Snode *get(Snode *l,int i)//取单链表表中第i个结点地址{  int len=0;  Snode *s=l;while(s->next!=l&&len!=i){len++;s=s->next;}return s;}void insnode(Snode *l,int i,int x)//把x的值插入到指定的位置i{       Snode *s,*t;    if(i<=lenth(l))     {         s=(Snode*)malloc(sizeof(Snode)); s->data=x; t=get(l,i-1); s->next=t->next; t->next=s; } else printf("链表中没有第%d个位置\n",i);}void delnode(Snode *l,int i)//删除指定位置i的结点{   Snode *s,*t;     if(i<=lenth(l))     { t=get(l,i-1); s=t->next; t->next=s->next; free(s); } else printf("链表中没有第%d个位置\n",i);}int locate(Snode *l,int x)//按值查找{    int flag=-1;   Snode *s=l;   while(s->next!=l)//同上要改{if(s->data==x){flag=1;break;}else s=s->next;}   return flag;}void  display(Snode *l)//显示链表{     Snode *s=l->next; while(s!=l)//同上也要改 {       printf("%d ",s->data);   s=s->next; } printf("\n");}int  main(){Snode *s; int i,x; char c; while(1) { printf("************************\n"); printf("*                      *\n"); printf("*    1 链表初始化      *\n"); printf("*    2 链表指定插入    *\n"); printf("*    3 链表指定删除    *\n"); printf("*    4 链表按值查询    *\n"); printf("*    5 退出            *\n"); printf("************************\n"); c=getchar(); if(c=='5')break; else switch(c) {  case '1':s=creat();;            printf("初始化后的链表:\n");        display(s);break;      case '2':printf("请输入要插入的位置和值\n");         scanf("%d%d",&i,&x);         insnode(s,i,x);             printf("插入指定位置值后的链表:\n");         display(s); break;  case '3':printf("请输入要删除的位置\n");         scanf("%d",&i); delnode(s,i);             printf("删除指定位置值后的链表:\n");         display(s); break;  case '4':printf("请输入要按值查询的值\n");         scanf("%d",&x); if(locate(s,x)!=-1) printf("在链表中查到了\n"); else  printf("没有查到\n"); break;     } getchar();}return 0;}

原创粉丝点击