基于c语言,严蔚敏版数据结构的线性表节本操作

[注解]:下面贴出的代码实严蔚敏版的数据结构的线性表的数据结构+操作,第一,这既是完整的程序,也是数据结构的起始部分,全书所涉及到的链表的操作都可基于此基础代码,包括后面的排序,合并etc;第二,为了 以后用户操作方便,我将链表的数据结构及其操作封装在了头文件里,当用户想调用写好的基本操作时,只需要导入头文件和源代码,最后在自己的代码中包含头文件即可(可以把它想象成类库);第三:代码的简略性:代码比较简单,可能对数据的容错能力稍低,只测试了正确的数据,所以用户想完善代码可以自行完善。如有错误也欢迎指教;第四:建议:如果觉得有阅读困难的建议去读一下c语言的结构体和指针部分(c++也可),相信弄懂那部分后自然就会迎刃而解啦。


头文件“ADT.H”:

#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
/*#define TRUE 1//状态码与FLAG已经注释掉了,如需要规范可以开启
#define FALSE 0
#define OK 0
#define ERROR 0
#define OVERFLOW 0
#typedef int Status
#typedef int ElemType*/ 
typedef struct ListNode {
int data;
ListNode *next;
int length;
}*List;//定义节点的结构体以及一个指向节点的List指针


bool InitList(List &L);//初始化线性表
bool ClearList(List &L);//将线性表置空
bool DestroyList(List &L);//销毁线性表
bool ListEmpty(List L);//判断线性表是否为空
int ListLength(List L);//判断线性表的长度
bool GetElem(List L,int i,int &e);//查找线性表中位序为i的数值,并返还给e
int LocateItem(List L,int e);//寻找List中数值为e的位序i
void PriorElem(List L,int cur_e,int &e);//修改线性表中数值为cur_e的前驱节点数值为pre_e
void NextElem(List L,int pre_e,int &e);//修改线性表中数值为cur_e的后继节点数值为next_e
void ListInsert(List &L,int i,int e);//在位序为i的前一个位置插入数值为e的节点
int ListDelete(List &L,int i,int &e);//删除位序为i位置的数据并且将删除的数据返还给数值e
void ListTravers(List L);//按位序输出线性表中的数据



List.cpp:

#include<stdlib.h>
#include <stdio.h>
#include<malloc.h>
typedef struct ListNode {
int data;
ListNode *next;
int length;
}*List;


bool InitList(List &L);
bool ClearList(List &L);
bool DestroyList(List &L);
bool ListEmpty(List L);
int ListLength(List L);
bool GetElem(List L, int i, int &e);
int LocateItem(List L,int e);
void PriorElem(List L,int cur_e,int &pre_e);
void NextElem(List L,int cur_e,int &next_e);
void  ListInsert(List &L, int i, int e);
void InsertList(List &L, int e);
int ListDelete(List &L,int i,int &e);
void ListTravers(List L);


bool InitList(List &L) {
//ListNode* L=(ListNode*)malloc(sizeof(ListNode));//如果不是初始化形参的ListNode,也可以用这种形式
L = (List)malloc(sizeof(ListNode));//这个地方不能用*ListNode否则会显示重复定义~~
if (!L)
return false;
L->next = NULL;
L->length=0;
printf("初始化链表成功!\n");
return true;
}
bool DestroyList(List &L) {//原理:从链表的头指针指向的节点逐步向下释放
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
ListNode *q = (ListNode *)malloc(sizeof(ListNode));
p = L->next;
while (p) {
q = p->next;//从头指针开始逐步向下释放
free(p);
p = q;
}
L->next = NULL;//最后设置头指针为空
printf("链表已经被销毁!\n");
return true;
}
bool ClearList(List &L) {
L->length = 0;//指针调用成员用这个,若果是结构体用.
L->next=NULL;
return true;
}
int ListLength(List L) {
return L->length;
}
bool ListEmpty(List L) {
if (L->next)
return true;
return false;
}
bool GetElem(List L, int i, int &e) {
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
p = L;
for (int j = 0; j<i; j++) {
if (p)
p = p->next;
}
e=p->data;
printf("替换成功!\n");
return true;
}
int LocateItem(List L, int e) {
ListNode * p = (ListNode *)malloc(sizeof(ListNode));
int h = 1;
p = L;
if (p->next->data!=e){
h++;
}
if(h==L->length+1){
printf("没有查找到该数值!\n");
}
else {
printf("数值为%d的位置为:%d\n", e, h);
         return h;
}


}
void PriorElem(List L, int cur_e, int & pre_e) {
int h = LocateItem(L,cur_e);
if (h > 1)
{
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
p = L;
for (int i = 0; i < h - 1; i++)
p = p->next;
p->data = pre_e;
printf("前驱节点赋值成功!\n");
}
    if (h == 0)
printf("所查找的值不存在");
if(h==1)
printf("所查找的当前值没有前驱节点\n");
}
void NextElem(List L, int cur_e, int &next_e) {
int h = LocateItem(L, cur_e);
if (h>0&&h<L->length)
{
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
p = L;
for (int i = 0; i < h+1; i++)
p = p->next;
p->data = next_e;
printf("后继节点赋值成功!\n");
}
if (h == 0)
printf("所查找的值不存在\n");
if (h == L->length)
printf("所查找的当前值没有后继节点\n");
}
void InsertList(List &L, int e) {
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
p = L;
while (p->next) {
p = p->next;
}
ListNode *q = (ListNode *)malloc(sizeof(ListNode));
q->next = p->next;
p->next = q;
q->data = e;
}
void ListInsert(List &L, int i, int e) {
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
ListNode *q = (ListNode *)malloc(sizeof(ListNode));
p = L;
L->length = L->length + 1;
for (int j = 0; j<i-1; j++)
if(p->next)
      p = p->next;
q->next = p->next;
p->next = q;
q->data = e;
printf("数据插入成功!\n");
}
int ListDelete(List &L, int i, int &e) {
ListNode * p = (ListNode *)malloc(sizeof(ListNode));
ListNode * q = (ListNode *)malloc(sizeof(ListNode));
p = L;
if (p) {
for (int j = 0; j < i-1;j++) {
p = p->next;
}
q = p->next;
p->next = q->next;
e = q->data;
printf("节点数据删除成功!\n");
return e;
}
}
void ListTravers(List L) {
ListNode *p = (ListNode *)malloc(sizeof(ListNode));
p = L->next;
while (p) {
printf("%d\n", p->data);
p = p->next;
}
}
void main() {
List L;
int i;
int e;
int location;
printf("1:初始化线性表\n2:销毁线性表\n3:将线性表置空\n4:判断线性表的长度\n"
"5:替换指定位置的数据\n6:查找元素值为e的位置\n7:修改前驱节点的值为e\n"
"8:修改后继节点的值为e\n9:在位置为i的元素前面插入e\n10:删除位序为i的元素\n11:按照位序输出线性表元素的位置\n");
while (1) {
printf("请选择操作序号:\n");
scanf("%d",&i);//输入的格式化字符串不可省略
switch (i)
{
case 1:
InitList(L);
break;
case 2:
DestroyList(L);
break;
case 3:
ClearList(L);
break;
case 4:
printf("线性表的长度为:%d", ListLength(L));
break;
case 5:
printf("请输入要替换的位置和数值:\n");
scanf("%d%d", &i,&e);
GetElem(L, i, e);
break;
case 6:
printf("请输入要查找的数值:\n");
scanf("%d", &e);
LocateItem(L, e);
break;
case 7:
printf("请输入要查找的数值和前驱节点替换值:");
scanf("%d%d", &i, &e);
PriorElem(L, i, e);
break;
case 8:
printf("请输入要查找的数值和后继节点的替换值:");
scanf("%d%d", &i, &e);
NextElem(L, i, e);
break;
case 9:
printf("请输入前驱节点插入的位置和数值");
scanf("%d%d", &i, &e);
ListInsert(L, i, e);
break;
case 10:
printf("请输入要删除的数据的位置");
scanf("%d", &i, &e);
ListDelete(L, i, e);
break;
case 11:
ListTravers(L);
break;
default:
break;
}
}
}

全部评论

相关推荐

2025-11-26 11:21
已编辑
武汉理工大学 Java
个人bg:&nbsp;211本,一段京东实习,一段xhs实习,一段小厂实习。互联网只有美团一个带薪意向。转正失败情况:京东实习了四个月,感觉收获比较少,做的事情偏基础,第三个月底答辩,离职后两个月被告知转正失败。对此我只能说,零售卡硕。xhs实习两个月,反而感觉收获更多,被安排了有挑战的事情,大模型在业务场景中的运用,最后一个星期通知有转正机会,边做需求边匆忙准备,答辩采取一票否决制,四个领导三过一否,也失败。(早知道xhs今年开这么高我就熬夜赶材料了)不过在这个过程中,也push自己了解了一定rag&nbsp;mcp&nbsp;大模型的相关知识,对于后续面阿里和美团很有帮助。个人基础情况:hot100能默写。去年12底学完jvm&nbsp;juc。2月入职京东前小林coding&nbsp;guide就差不多看完了。后面实习的时候也有继续补面筋,场景题。秋招情况:8月初就投了,也不晚。滴滴:&nbsp;笔试a了没面,可能投的岗位太小众了?(抱着拿了也不去&nbsp;用于a价的想法)一直卡着。携程:&nbsp;不发笔。发官方邮件也不回。京东:笔试挂了。嗯,很耻辱,那天在外面玩但确实很久没复习笔试考试范围了,全忘光了。腾讯:从来没约过,可能暑期面了十几次面太多了。阿里控股:一面挂。阿里国际:hr面后一个月挂。字节:国际电商三面挂-&gt;星图一面挂(面的时候已经有很多候选人了)-&gt;&nbsp;安全风控二面挂(业务不是很好,面试过程说漏嘴说业务会影响我选择,场景题没答好)-&gt;&nbsp;中台一面后无消息快手:二面挂。xhs:hr面后无消息,排序应该很靠后。虾皮:hr面两个月无消息,应该还在泡池子。百度:一面挂。pdd:笔试a3后笔试挂。难绷。个人反思总结:for&nbsp;后来者。1.&nbsp;笔试一定要把握好,虽然面试中都是hot100,有些甚至不考面试题,但是大厂笔试题是有acm难度的,挂了就是挂了,很多没有第二次机会,约面也没机会了。建议时间充裕情况下,还是要把灵神的题单多刷点。顺序可以参考:代码随想录视频+题&nbsp;-&gt;&nbsp;灵神视频+题&nbsp;-&gt;hot100&nbsp;-&gt;灵神题单(可以每个part挑难度低的前几道写)2.&nbsp;一段深入长的实习经历一定是大于两段短的,不过现在再让我选到底是继续在jd还是去xhs我还是选不出来。在面试的过程中,有些面试官也会认为我实习的太浅,没有做什么有深度的事情,对多种方案的调研不全面。如果实习做的事情比较有挑战最好,如果没有,也要尽量往多种方案调研最后选择了哪个方案,达到了当初定的业务指标/技术指标方面包装。3.&nbsp;还是得早投。身边除了bg特别好的朋友,投的晚的无一例外秋招情况会差很多。8月前投能赶上提前批。最晚不要8月中旬过了还没投完。有投的早的没有实习的朋友秋招结果也可以。没有面试的同学一定要尝试官网,boss直聘多种途径投。4.&nbsp;对于有实习的同学,基础没有那么重要了,更多还是专注于对实习的考察,可以以金字塔的形式进行论述,避免在最开始的时候就展开大量细节。如果实在没有实习,bg够硬,投的够早也会有面,只需要一个比较深入的项目应该就没问题,把项目当作自己在实习要投入生产的心态去调研包装。5.&nbsp;有的时候真的看运气。即使是同一个部门甚至是同一个组的同学,做的事情也会有差异,这主要看导师被分配到什么样的活。for&nbsp;me:大二的时候绩点排名前10%,但还是决定放弃保研,开始学java,这一路走来,经历迷茫踏实的反复,也想和自己说句幸苦了,谁想得到当初给自己定的目标是有份工作不饿死就行。可能差点运气,可能在关键节点上做的还是不够,对于实习的包装,对于面试表现还是差点。会后悔自己没读研吗?其实我也有考雅思,申请了港大计算机,但估计大概率还是工作(实则也没港大offer)。人不能既要又要还要,我不能既要早点工作赚钱,实现我财富自由支配,带不舍得花钱的家人去旅游的想法,又要长期来看高学历晋升的优势,还要在大环境变差一届比一届卷我也能找到差强人意的工作。所以,至少现在,我不后悔。如果我更倾向于国企而不是互联网,比起技术挑战更偏爱稳定的生活我大概率会读研。如果我本科没有211,我还想进大厂,我也大概率会读研。会后悔自己没选其他的方向吗?java确实相对卷一点,但也只是相对的,因为其他方向的人也很多,并不是换方向就一定会更好。计算机这一行本就短命,能干到35就算成功,大家都是为了赚钱,基于此,在背景没那么硬时,选择一个相对人少的方向进大厂是对的。看自己怎么理解了。最好的还是参考直系学长学姐的选择,一定要多沟通交流。一些安慰自己的话,秋招是人生的起点,不一定是高费阵容才能吃鸡,低费阵容早点发育也有吃鸡的上限。(随便乱说的)。最后还想再写一段话给学妹们,程序员这一行,女生确实会相对少一点,但比起传统工科非常直接的偏向男生,计算机这一行认为菜是原罪,性别的因素会少很多,更多看个人技术和水平。在京东实习的时候,我的小组长在我进去第一天就和我说,我们部门女生虽然少,但是水平都至少是中上的,都很能吃苦很能干。无论是我们组干活巨快的A姐,还是总能很快解答我问题的B姐,又或者是其他总能给我提供建议的其他姐姐们,都使我对这一点坚信不疑,她们高学历,专业,细心,耐心。如果你也热爱技术,虽然有时会被bug折磨,但喜欢学到知识时候的踏实,喜欢bug&nbsp;fix的爽感,你就是适合这一行的。我的秋招结束了,但我大概率不会甘心,还是会想试试春招,但我也真的觉得到现在这一步已经很棒了。欢迎同校学妹学弟们找我沟通交流~
疲倦的牛马还在上班:再冲一次,春招不留遗憾吧!
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务