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

Posted 黎先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的基本运算 --线性表相关的知识,希望对你有一定的参考价值。

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 }

 

运行结果截图

 

以上是关于链表的基本运算 --线性表的主要内容,如果未能解决你的问题,请参考以下文章

YTU 2990: 链表的基本运算(线性表)

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

程序员“修炼成神”的必经之路——数据结构(第2章 线性表)

<链表C ++中结构成员的运算符重载

使用C语言编写程序,实现顺序表的基本运算——插入和删除。

《数据结构》第二章 | 线性表 知识梳理(应对期末考)