数据结构 【实验3 链表基本操作】

实验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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一次找工作感受!

20号南京有招聘会,我和几个同学就去了,去体验一下找工作是什么样子的,可能大家从第二天的报纸上已经看到了,不过如果你没有去现场,那种人山人海,直接要排山倒海,招聘单位写的什么基本上看不清了.. 转到上午10点一份没投,心里那个急,心想只要能要就行了,好像投出去就找到工作一样…

猪肉上的红章和蓝章有啥不同?| 今日趣图

全世界只有3.14 %的人关注了青少年数学之旅亲眼看到金字塔你才会意识到它有多大&#xff01;&#xff08;图源光消失的地方&#xff0c;侵权删&#xff09;你女朋友的脸皮有多厚&#xff1f;&#xff08;图源程序员新视界&#xff0c;侵权删&#xff09;猪肉上的红章和蓝章有啥…

CSS工具列表

用户界面 I Like Your Color输入URL然后它会抓出其中的颜色并用16进制表示。CSS Multi-element Rollover Generator使用CSS和一个图片创建出一个翻转按钮的样式。CSS Rounded Box GeneratorRuthsarian Layouts6个CSS页面布局模板&#xff0c;包括颜色、标题等。Bluerobot Layou…

【开源】这可能是封装微信 API 最全的 .NET SDK 了

缘起今年公司某个项目需要全面接入微信支付 V3 版 API。起初觉得&#xff0c;2014 年微信支付就已上线了 V3 版 API&#xff0c;这都 2021 年了&#xff0c;就算官方不给力&#xff0c;怎么着社区也该有几个造好的 .NET 的轮子了吧&#xff1f;于是兴冲冲地到 NuGet 上开始搜索…

【Vegas原创】变换VS2005默认浏览器方法

右键任何aspx文件&#xff0c;在浏览方式中选择

如何避免和人尬聊?

全世界只有3.14 %的人关注了青少年数学之旅想要和别人有聊不完的话题&#xff1f;当然是多读书多看新闻了解新鲜有趣的事物啦如果你没有时间去阅读那么关注以下公号将会让你收获更多信息~长按二维码&#xff0c;选择“识别图中二维码”订阅。▼看鉴ID:kanjian6666▲长按二维码“…

java 中的 io 系统总结

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符&#xff0c;分别操作字符、字符数组或字符串&#xff0c;而字节流处理单元为 1 个字节&#xff0c;操作字节和字节数组。 Java 内用 Unicode 编码存储字符&#xff0c;字符流处理类负责将外部的…

在VS Code中执行SQL查询,是怎样一种体验?

上次&#xff0c;我们演示了“如何使用Nuget包XPlot.Plotly.Interactive在.NET Interactive notebook中绘制图表”。这次&#xff0c;我们使用Nuget包Microsoft.DotNet.Interactive.SqlServer演示在.NET Interactive notebook中如何和SQL Server交互。安装Nuget包首先&#xff…

UVA 11090 Going in Cycle!! 二分答案 + bellman-ford

求平均值最小的环&#xff0c;如果平均值最小为x&#xff0c;则如果把每条边的权值都减(x1)&#xff0c;那么新图将会有负环&#xff0c;用bellman ford判断。 //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstri…

突发奇想:flash+.Net+数据库的一种构思

大家好!我是冯波!一个刚刚学了点编程的小伙子&#xff0c;爱好比较广泛。除了像其它男生那样喜欢踢足球&#xff0c;打篮球以外&#xff0c;自己也非常喜欢军事。什么《孙子兵法与三十六计》啊&#xff0c;《三国演义》啊总是百看不厌&#xff0c;就是没看过《武穆遗书》&#…

大数据:数据合集,你想要的或许这里都有

大数据时代&#xff0c;用数据做出理性分析显然更为有力。做数据分析前&#xff0c;能够找到合适的的数据源是一件非常重要的事情&#xff0c;获取数据的方式有很多种&#xff0c;不必局限。下面将从公开的数据集、爬虫、数据采集工具、付费API等等介绍。给大家推荐一些能够用得…

骗人的数学题,那消失的1块钱到底被谁拿走了

全世界只有3.14 %的人关注了青少年数学之旅1、失踪的正方形

小语

1. 正所谓圣人云&#xff1a;“无农不稳&#xff0c;无商不富”&#xff0c;“民无利则国不富&#xff0c;民不富则国无税&#xff0c;国无税则兵不强&#xff0c;兵不强则天下危”。 2. 播下一个行动&#xff0c;收获一种习惯&#xff1b;播下一种习惯&#xff0c;收获一种性格…

MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

在Membership系列的最后一篇引入了ASP.NET Identity&#xff0c;看到大家对它还是挺感兴趣的&#xff0c;于是来一篇详解登录原理的文章。本文会涉及到Claims-based&#xff08;基于声明&#xff09;的认证&#xff0c;我们会详细介绍什么是Claims-based认证&#xff0c;它与传…

2018年最受大家欢迎的五大机器学习工具和五大数据学习工具

2018年将会是人工智能和机器学习快速发展的一年&#xff0c;有专家表示&#xff1a;相较之下Python比Java更加接地气&#xff0c;也自然而然地成为机器学习的首选语言 在数据科学方面&#xff0c;Python的语法与数学语法最为接近&#xff0c;因此是数学家或经济学家等专业人士…

一步一步SharePoint 2007之四十三:实现自定义Workflow(2)——设置配置文件

下面将记录每一步的操作过程。1、首先采用Reflector等工具找到上一篇文章编译后的DLL的Assembly信息。2、找到并打开C:\Inetpub\wwwroot\wss\VirtualDirectories\9001\web.config文件&#xff0c;在System.Workflow.ComponentModel.WorkflowCompiler节点下的authorizedTypes中&…

动手造轮子 —— dotnet-HTTPie

动手造轮子 —— dotnet-HTTPieIntroHTTPie 是一个基于 Python 的 HTTP CLI 工具&#xff0c;这也意味着想用 HTTPie 就需要安装 Python 环境&#xff0c;不想装 Python 环境&#xff0c;于是想用 C# 也写一个类似的东西&#xff0c;HTTPie 的语法很简单、简洁而且功能强大&…

基于JavaScript技术的横排文字转古书式竖排工具

基于JavaScript技术的横排文字转古书式竖排工具 此工具可以把普通横排文字转换为古典的竖排由右至左的方式显示&#xff0c;并且增加适当的线标&#xff0c;方便读者阅读。您可以在论坛、博客发言之前用这个工具把要发表的文章转化&#xff0c;然后再粘贴到要发表的论坛、博客上…

减肥瘦不下来的原因找到了

全世界只有3.14 %的人关注了青少年数学之旅&#xff08;图源蜻蜓队长&#xff0c;侵权删&#xff09;