链表的基本运算 --线性表

C语言实现链表的插入、删除、查找运算

  1 /*
  2  *实现链表的插入、删除、查找运算
  3  */
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <malloc.h>
  7 
  8 #define flag 0
  9 typedef int ElemType;
 10 
 11 typedef struct Lnode    //链式存储结构定义
 12 {
 13     int data;            //定义数据域
 14     struct Lnode *next;          //定义指针域
 15 }Lnode,*LinkList;      //定义结点和头指针类型名
 16 
 17 Lnode *Get_LinkList(LinkList L,int i)
 18 {        //在带头结点单链表中查找第i个数据元素,找到返回其指针,否则返回空
 19     Lnode *p = L;
 20     int j=0;
 21     while(p != NULL  &&  j < i)
 22     {
 23         p = p->next;
 24         j++;
 25     }
 26     return p;
 27 }
 28 
 29 int Locate_LinkList(LinkList L,int x)
 30 {        //在带头结点单链表中查找值等于给定值的结点
 31     LinkList p;
 32     int j = 1;
 33     p = L->next;
 34     while (p != NULL  &&  p->data != x)
 35     {            //若首结点不是查找结点且可以链接刀下一结点
 36         p = p->next;
 37         j++;
 38     }
 39     if(p)
 40     {
 41         printf("%d在链表中,是第%d个元素。\n",p->data,j);
 42         return j;
 43     }
 44     else
 45     {
 46         printf("该数值不在链表中。\n");
 47         return 0;
 48     }
 49 }
 50 
 51 int Insert_LinkList(LinkList &L, int i, int x)
 52 {        //在带头结点单链表的第i个位置之后插入值为x的元素
 53     Lnode *p,*s;
 54     p = Get_LinkList(L,i);        //查找第i个元素
 55     if (p == NULL)
 56     {
 57         printf("参数i输入有误\n");
 58         return 0;
 59     }
 60     else
 61     {
 62         s = (Lnode *)malloc(sizeof(Lnode));        //申请、填充结点
 63         s->data = x;
 64         s->next = p->next;            //新结点插入在第i个结点的后面
 65         p->next = s;
 66         return 1;
 67     }
 68 }
 69 
 70 int Delete_LinkList(LinkList L,int i)
 71 {        //删除带头结点单链表上的第i个数据结点
 72     LinkList p,s;
 73     p = Get_LinkList(L,i-1);        //查找第i-1个结点
 74     if (p == NULL)
 75     {
 76         printf("待删除结点前结点不存在!\n");
 77         return -1;
 78     }
 79     else if (p->next == NULL)
 80     {
 81         printf("该节点不存在!\n");
 82         return 0;
 83     }
 84     else
 85     {
 86         s = p->next;            //s指向第i个结点
 87         p->next = s->next;        //从链表中删除
 88         free(s);                //释放s
 89         return 1;
 90     }
 91 }
 92 
 93 void Create_LinkList(LinkList &L, int n)
 94 {        //前插法创建带头结点单链表
 95     int i;
 96     LinkList p;
 97     L = (LinkList)malloc(sizeof(Lnode));
 98     L->next = NULL;            //生成头结点
 99     for (i = n; i > 0; --i)
100     {
101         p = (LinkList)malloc(sizeof(Lnode));     //生成新结点
102         p->data = i;            //填充数据
103         p->next = L->next;        //将*p插入原开始结点之前,头结点之后
104         L->next = p;
105     }
106 }
107 
108 void Display_LinkList(LinkList L)
109 {
110     LinkList p;
111     p = L;
112     while(p->next)
113     {
114         printf("%d ",p->next->data);
115         p = p->next;
116     }
117 }
118 
119 int main()
120 {
121     printf("初始化\n建立单链表如下: \n");
122     LinkList L;
123     int x,y,cord,i;
124     Create_LinkList(L,10);
125     Display_LinkList(L);
126     do
127     {
128         printf("\n                     主菜单                    \n");
129         printf("\n             1     尾插法插入元素到指定位置    \n");
130         printf("\n             2    删除某一指定元素        \n");
131         printf("\n             3    查找指定元素                \n");
132         printf("\n             0    结束程序                    \n");
133         printf("----------------------------------------------\n");
134         printf("请输入你选择的菜单号<1,2,3,0>: ");
135         scanf("%d",&cord);
136         switch(cord)
137         {
138             case 1:
139                 printf("请输入插入元素位置前序号 i: ");
140                 scanf("%d",&x);
141                 printf("请输入插入的数据 y: ");
142                 scanf("%d",&y);
143                 Insert_LinkList(L,x,y);            //在第i个结点后插入
144                 printf("单链表输出如下:\n");
145                 Display_LinkList(L);
146                 break;
147             case 2:
148                 printf("请输入删除元素序号 x: ");
149                 scanf("%d",&x);
150                 Delete_LinkList(L,x);
151                 printf("单链表输出如下:\n");
152                 Display_LinkList(L);
153                 break;
154             case 3:
155                 printf("请输入查找元素值x :");
156                 scanf("%d",&x);
157                 i = Locate_LinkList(L,x);
158                 break;
159             case 0:
160                 exit(0);
161                 break;
162             default:
163                 printf("输入有误!");
164         }
165     }
166     while(cord <= 3 && cord >= 0);
167 }

 

运行结果截图

 

posted @ 2017-10-16 20:00  黎先生  阅读(1291)  评论(0编辑  收藏  举报