
数据结构——单链表的基本操作
发布日期:2021-05-15 16:33:01
浏览次数:20
分类:精选文章
本文共 3684 字,大约阅读时间需要 12 分钟。
实验目的
通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。
实验内容
编程实现链表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。
参考界面:

源代码
#includeusing namespace std;typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;//链表初始化int InitList(LinkList &L){ L=new LNode; if(!L) return 0; L->next=NULL; return 1;}//销毁链表int DestoryList(LinkList &L){ LinkList p; while(L) { p=L; L=L->next; delete p; } return 1;}//清空单链表int ClearList(LinkList L){ LinkList p,q; p=L->next; while(p){ q=p;delete q;p=p->next;} L->next=NULL; return 1;}//求单链表长度int Listlength(LinkList L){ int sum=0; LinkList p=L->next; while(p) { p=p->next; sum++; } return sum;}//判断单链表是否为空bool ListEmpty(LinkList L){ if(L->next) return 1; else return 0;}//获取单链表中某个数据元素的内容int GetElem(LinkList L,int i,ElemType &e){ LinkList p=L->next; int j=1; while(p&&j next; ++j; } if(!p||j>i)return 0; e=p->data; return 1;}//查找值为e的数据元素的位置int LocateElem(LinkList L,ElemType e){ LinkList p=L->next; int i=0; while(p&&p->data!=e) { p=p->next; i++; } if(i>=Listlength(L)) return 0; return i+1;}//求直接前驱int PriorElem(LinkList L,ElemType e,ElemType&pre_e){ LNode*p=L->next; if(e==p->data) return 0; while(p->next) { if(p->next->data==e) { pre_e=p->data; return 1; } p=p->next; } return 0;}//求直接后继int NextElem(LinkList L,ElemType e,ElemType&next_e){ LNode*p=L->next; while(p) { if(p->data==e&&p->next) { next_e=p->next->data; return 1; } p=p->next; } return 0;}//在单链表中插入数据元素int ListInsert(LinkList&L,int i,ElemType e){ LinkList p=L; int j=0; while(p&&(j next; ++j; } if(!p||j>i-1)return 0; LinkList s=new LNode; s->data=e; s->next=p->next; p->next=s; return 1;}//删除单链表中第i个元素,返回第i个元素的值int ListDelete(LinkList &L,int i,ElemType&e){ LinkList p=L; int j=0; while((p->next)&&(j next; ++j; } if(!(p->next)||(j>i-1)) return 0; LinkList q=p->next; e=q->data; p->next=q->next; delete q; return 1;}//输出链表元素void LinkPrint(LinkList &L){ LinkList p=L->next; while(p) { cout< data<<" "; p=p->next; }}//前插法创建单链表void CreateList_H(LinkList &L,int n){ L=new LNode; L->next=NULL; cout<<"请输入要插入的元素:"< >p->data; p->next=L->next; L->next=p; }}//后插法创建单链表void CreateList_R(LinkList&L,int n){ L=new LNode; L->next=NULL; LNode*r=L; for(int i=0;i >p->data; p->next=NULL; r->next=p; r=p; }}//判断链表是否为空bool IsEmpty(LinkList L){ if(L->next) return false; else return true;}//链表逆转int ReverseList(LinkList&L){ if(L==NULL||L->next==NULL) return 0; LinkList pRev=NULL; LinkList pCur=L->next; while(pCur!=NULL) { LinkList temp=pCur; pCur=pCur->next; temp->next=pRev; pRev=temp; } L->next=pRev; return 1;}void PrintTips(){ cout<<"可执行的操作有:"< >k) { switch(k) { case 1: s=InitList(L); if(s==1) cout<<"初始化成功或重置成功!"< next) { cout<<"链表为空!"< >i; if(!GetElem(L,i,e)) { cout<<"该位置超出链表范围!"< >e; s=LocateElem(L,e); if(!s) { cout<<"不存在"< next) { cout<<"链表为空!"< >e; if(!PriorElem(L,e,res_e)) { cout<<"查找失败!"< next) { cout<<"链表为空!"< >e; if(!NextElem(L,e,res_e)) { cout<<"查找失败!"< >i>>e; s=ListInsert(L,i,e); if(s) cout<<"插入成功!"< >i; s=ListDelete(L,i,e); if(s) cout<<"删除成功!,该位置值为:"< < >s; CreateList_R(L,s); break; case 12: return 0; break; case 13: if(IsInvalid(L)) break; if(IsEmpty(L)) cout<<"链表为空!"<
发表评论
最新留言
不错!
[***.144.177.141]2025年04月27日 03时30分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
如何提高SQL查询的效率?
2021-05-15
Docker入门之-镜像(二)
2021-05-15
数据结构——链表(3)
2021-05-15
socket模块和粘包现象
2021-05-15
Python学习--模块
2021-05-15
去了解拉绳位移编码器的影响因素
2021-05-15
影响拉线位移传感器精度的原因有哪些?
2021-05-15
无法初始化Winsock2.2处理
2021-05-15
Horizon Cloud之UAG访问异常
2021-05-15
vMotion 操作失败进度卡在14% ,报错: Operation Timed out
2021-05-15
重置UAG Application admin密码
2021-05-15
Horizon Daas租户管理平台扩展分配时报:内部错误
2021-05-15
vcenter访问报503错误处理
2021-05-15
项目计划甘特图绘制说明
2021-05-15
C/C++:线性表之顺序表
2021-05-15
嵌入式系统试题库(CSU)
2021-05-15
图神经网络7日打卡营学习心得
2021-05-15
electronJS 开发linux App
2021-05-15
MbedOS 设备中的模数转换(ADC)
2021-05-15
【vue】setInterval的嵌套实例
2021-05-15