实验3  链表基本操作

实验目的

1.  定义单链表的结点类型。

2.  熟悉对单链表的一些基本操作和具体的函数定义。

3.  通过单链表的定义掌握线性表的链式存储结构的特点。

4.  掌握循环链表和双链表的定义和构造方法。

实验内容

该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。程序中的单链表(带头结点)结点为结构类型,结点值为整型。

/* 定义DataType为int类型 */

typedef int DataType;

/* 单链表的结点类型 */

typedef struct LNode

{DataType data;

struct LNode *next;

}LNode,*LinkedList;

/* 初始化单链表 */

LinkedList LinkedListInit()

/* 清空单链表 */

void LinkedListClear(LinkedList L)

/* 检查单链表是否为空 */

int LinkedListEmpty(LinkedList L)

/* 遍历单链表 */

void LinkedListTraverse(LinkedList L)

/* 求单链表的长度 */

int  LinkedListLength(LinkedList L)

/* 从单链表表中查找元素 */

LinkedList  LinkedListGet(LinkedList L,int  i)

/* 从单链表表中查找与给定元素值相同的元素在链表中的位置 */

LinkedList  LinkedListLocate(LinkedList  L, DataType  x)

/* 向单链表中插入元素 */

void  LinkedListInsert(LinkedList L,int i,DataType  x)

/* 从单链表中删除元素 */

void LinkedListDel(LinkedList  L,DataType x)

/* 用尾插法建立单链表 */

LinkedList  LinkedListCreat( )


  1 #include <stdio.h>
  2 #include <malloc.h>
  3 #include <stdlib.h>
  4
  5 /* 定义DataType为int类型 */
  6 typedef int DataType;
  7
  8 /* 单链表的结点类型 */
  9 typedef struct LNode{
 10     DataType data;
 11     struct LNode *next;
 12 }LNode,*LinkedList;
 13
 14 /* 1. 初始化单链表 */
 15 LinkedList LinkedListInit()
 16 {
 17     LinkedList head = (LNode*)malloc(sizeof(LNode));
 18     head->next = NULL;
 19     return head;
 20 }
 21
 22 /* 2. 清空单链表 */
 23 void LinkedListClear(LinkedList L)
 24 {
 25     //L为头指针
 26     while(L->next!=NULL){    //依次清空节点,直到头指针指向的下一个节点的地址为空
 27         LinkedList t;
 28         t = L->next;
 29         L->next = t->next;
 30         free(t);
 31     }
 32     return ;
 33 }
 34
 35 /* 3. 检查单链表是否为空 */
 36 int LinkedListEmpty(LinkedList L)
 37 {
 38     if(L->next==NULL)    //头指针指向的下一个节点地址为空,说明链表为空。否则不为空。
 39         return 1;
 40     else
 41         return 0;
 42 }
 43
 44 /* 4. 遍历单链表 */
 45 void LinkedListTraverse(LinkedList L)
 46 {
 47     LinkedList p = L->next;
 48     while(p){
 49         printf("%d ",p->data);    //遍历输出节点
 50         p = p->next;
 51     }
 52     printf("\n");
 53     return ;
 54 }
 55
 56 /* 5. 求单链表的长度 */
 57 int  LinkedListLength(LinkedList L)
 58 {
 59     LinkedList p = L->next;
 60     int len=0;
 61     while(p){
 62         len++;    //遍历一个节点长度+1
 63         p = p->next;
 64     }
 65     return len;
 66 }
 67
 68 /* 6. 从单链表表中查找元素 */
 69 LinkedList  LinkedListGet(LinkedList L,int  i)
 70 {
 71     int j=1;
 72     LinkedList p = L->next;
 73     while(p){
 74         if(j==i)
 75             return p;
 76         p = p->next;
 77         j++;    //遍历一个节点长度+1
 78     }
 79     return NULL;
 80 }
 81
 82 /* 7. 从单链表表中查找与给定元素值相同的元素在链表中的位置 */
 83 int LinkedListLocate(LinkedList  L, DataType  x)
 84 {
 85     int i=1;
 86     LinkedList p = L->next;
 87     while(p){
 88         if(p->data==x)
 89             return i;
 90         p = p->next;
 91         i++;
 92     }
 93     return 0;
 94 }
 95
 96 /* 8. 向单链表中插入元素 */
 97 void  LinkedListInsert(LinkedList L,int i,DataType  x)
 98 {
 99     int j=1;
100     LinkedList p = L->next;
101     while(p && j!=i-1){    //找到i的前一个元素
102         p = p->next;
103         j++;    //遍历一个节点+1
104     }
105     //找到位置
106     if(j==i-1){
107         LinkedList q = (LinkedList)malloc(sizeof(LNode));
108         q->data = x;
109         q->next = p->next;
110         p->next = q;
111     }
112     return ;
113 }
114
115 /* 9. 从单链表中删除元素 */
116 void LinkedListDel(LinkedList  L,DataType x)
117 {
118     LinkedList p = L->next;
119     while(p->next->data!=x){    //找到值为x的前一个元素
120         p = p->next;
121     }
122     //找到位置
123     if(p->next->data==x){
124         LinkedList q = p->next;
125         p->next = q->next;
126         free(q);
127     }
128     return ;
129 }
130
131 /* 10. 用尾插法建立单链表 */
132 LinkedList  LinkedListCreat( LinkedList L,DataType a[],int n )    //讲数组a中的元素以尾插法放入链表中
133 {
134     LinkedList p = L;
135     int i;
136     for(i=1;i<=n;i++){
137         LinkedList q = (LinkedList)malloc(sizeof(LNode));
138         q->data = a[i];
139         q->next = NULL;
140         p->next = q;
141         p = q;
142     }
143     return L;
144 }
145
146 int Menu()
147 {
148     int in;
149     printf("[0] 请先初始化一个链表\n");
150     printf("[1] 用尾插法建立单链表\n");
151     printf("[2] 检查单链表是否为空\n");
152     printf("[3] 遍历单链表\n");
153     printf("[4] 求单链表的长度\n");
154     printf("[5] 从单链表表中查找元素\n");
155     printf("[6] 从单链表表中查找与给定元素值相同的元素在链表中的位置\n");
156     printf("[7] 向单链表中插入元素\n");
157     printf("[8] 从单链表中删除元素\n");
158     printf("[9] 清空单链表\n");
159     printf("[10] 按其他键退出\n");
160     scanf("%d",&in);
161     return in;
162 }
163 LinkedList Reply(LinkedList head,int in)
164 {
165     int i,n;
166     switch(in){
167         case 0:    //初始化一个链表
168             head = LinkedListInit();
169             printf("初始化成功!\n");
170             break;
171
172         case 1:    //用尾插法建立单链表
173             int a[1001];
174             printf("请问你要输入多少个数据?:(最多1000个)\n");
175             scanf("%d",&n);    //输入链表大小
176             printf("请依次输入数据:\n");
177             for(i=1;i<=n;i++)
178                 scanf("%d",&a[i]);
179             head = LinkedListCreat(head,a,n);
180             printf("链表建立成功!\n");
181             break;
182
183         case 2:    //检查单链表是否为空
184             if(LinkedListEmpty(head))
185                 printf("链表为空\n");
186             else
187                 printf("链表不为空\n");
188             break;
189
190         case 3:    //遍历单链表
191             LinkedListTraverse(head);
192             break;
193
194         case 4:    //求单链表的长度
195             printf("链表长度为:%d\n",LinkedListLength(head));
196             break;
197
198         case 5:    //从单链表中查找元素
199             printf("你要查找链表中第几个元素值?\n");
200             scanf("%d",&n);
201             LinkedList p;
202             p = LinkedListGet(head,n);
203             printf("第%d个元素值是:%d\n",n,p->data);
204             break;
205
206         case 6:    //从单链表表中查找与给定元素值相同的元素在链表中的位置
207             printf("你要查找的元素值是?\n");
208             scanf("%d",&n);
209             printf("它是第%d个元素\n",LinkedListLocate(head,n));
210             break;
211
212         case 7:    //向单链表中插入元素
213             printf("请问你要在第几个元素的位置插入?\n");
214             scanf("%d",&i);
215             printf("请问你要插入的元素值为多少?\n");
216             scanf("%d",&n);
217             LinkedListInsert(head,i,n);
218             printf("插入成功!\n");
219             printf("插入之后的链表结构为:\n");
220             LinkedListTraverse(head);
221             break;
222
223         case 8:    //从单链表中删除元素
224             printf("请问你要删除值为多少的元素?\n");
225             scanf("%d",&n);
226             LinkedListDel(head,n);
227             printf("删除成功!\n");
228             printf("删除之后的链表结构为:\n");
229             LinkedListTraverse(head);
230             break;
231
232         case 9:    //清空单链表
233             LinkedListClear(head);
234             printf("清空成功!\n");
235             break;
236
237         default:
238             printf("Bye~\n");
239             exit(1);
240     }
241     return head;
242 }
243 int main()
244 {
245     int in;    //存储输入命令
246     LinkedList head;
247     while(1){
248         in = Menu();
249         head = Reply(head,in);    //响应命令
250         printf("\n");
251         system("pause");
252         system("cls");
253     }
254     return 0;
255 }

Freecode : www.cnblogs.com/yym2013

数据结构 【实验3 链表基本操作】相关推荐

  1. 数据结构实验 二叉树的基本操作

    数据结构实验 二叉树的基本操作 实验环境: Visual C++ 实验目的: 1.掌握二叉树的定义: 2.掌握二叉树的基本操作,如二叉树的建立.遍历.结点个数统计.树的深 度计算等. 实验内容: 用递 ...

  2. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  3. SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除

    提交代码 数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Proble ...

  4. SDUT—2054数据结构实验之链表九:双向链表 (基本建立)

    点击打开链接 数据结构实验之链表九:双向链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Des ...

  5. SDUT_2121数据结构实验之链表六:有序链表的建立 (对建立的单项链表结构进行排序)

    点击打开链接 数据结构实验之链表六:有序链表的建立 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  6. SDUT_2119 数据结构实验之链表四:有序链表的归并

    点击打开链接 数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  7. SDUT_2118 数据结构实验之链表三:链表的逆置

    点击打开链接 数据结构实验之链表三:链表的逆置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem De ...

  8. SDUT _2117 数据结构实验之链表二:逆序建立链表

    点击打开链接 数据结构实验之链表二:逆序建立链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem D ...

  9. SDUT_2116 数据结构实验之链表一:顺序建立链表

    点击打开链接 数据结构实验之链表一:顺序建立链表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem D ...

最新文章

  1. 四月青少年编程组队学习(Python一级)Task02
  2. 深入理解Python闭包概念
  3. 令人笑喷的56个代码注释,你写过多少?
  4. SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中...
  5. 机械之家再获3000万A+轮投资,58产业基金领投
  6. 点击input框,添加阴影效果
  7. CF39C-Moon Craters【dp】
  8. akka 消息发送接收_Akka型演员:探索接收器模式
  9. C语言之字符串探究(四):读越界、写越界
  10. 华为发布国行版P40系列,售价4188元起;大疆回应“至少50%的裁员清扫计划”;Firefox 75发布 | 极客头条...
  11. gulp安装报错Local version: Unknown
  12. webapp开发框架
  13. 织梦DedeCms网站更换域名后文章图片路径批量修改
  14. jQuery ajax 文件下载
  15. 浅谈服务器选择固态硬盘的几个优缺点
  16. 使用 docker 进行iost 测试链节点搭建
  17. 五个思路,教你如何建立金融业的数据分析管理模型
  18. 犀牛建模软件的学习了解
  19. 数字逻辑手写实验报告
  20. MIPS指令集中LB和LW的区别

热门文章

  1. 【Java】接口(interface)VS抽象类
  2. zabbix中php信息缺失之后的安装
  3. 《Python游戏编程入门》——1.2 初识Python
  4. IPC-----消息队列
  5. 百度pcs 如何获取Access Token
  6. kubeadm部署k8s_用 kubeadm 部署生产级 k8s 集群
  7. python怎么编辑文件_如何使用python中的方法对文件进行修改文件名
  8. 自动调试自动编译五分钟上手
  9. 《sql语句练习1》
  10. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)