目录

- #include
- #include
-
- typedef int ElemType;
-
- typedef struct LNode {
- ElemType data;
- struct LNode*next;
- }LNode,*LinkList;
-
- //清单列表
- void MenuLinkList(){
- printf("-------------1.插入操作-------------\n");
- printf("-------------2.定位插入操作---------\n");
- printf("-------------3.按序查找操作---------\n");
- printf("-------------4.按值查找操作---------\n");
- printf("-------------5.定位删除操作---------\n");
- printf("-------------6.按值删除元素---------\n");
- printf("-------------7.删除整个表-----------\n");
- printf("-------------8.表的长度-------------\n");
- printf("-------------9.打印操作-------------\n");
- printf("-------------10.结束操作-------------\n");
- }
- //初始化不带头节点
- void InitList(LinkList&L){
- L=NULL;
- }
- //销毁表的操作
- void DestryLinkList(LinkList&L){
- LNode*p=L;
- //首先将第一个节点之后的所有节点删除
- while(p->next!=NULL){
- LNode*s=p->next;
- p->next=s->next;
- free(s);
- }
- //最后来删除第一个节点
- free(p);
- L=NULL;
- }
- //获取单链表的第i个节点
- LNode*GetElem(LinkList L,int i){
- int j=1;
- LNode*p=L;
- if(i<0)return NULL;
- if(i==0)return L;
- while(p!=NULL&&j
- p=p->next;
- j++;
- }
- return p;
- }
(4)第i位置插入节点
- //按位序查找第i个节点指针
- LNode*FindLNode(LinkList&L,int i){
- if(i<1){
- printf("不符合插入节点位置!\n");
- return NULL;
- }
- int j=1;
- LNode*p=L;
- if(i<0)return NULL;
- if(i==0)return L->next;
- while(p!=NULL&&j
- p=p->next;
- j++;
- }
- return p;
- }
- //如果插入的是在第一个节点 ,这需要进行特殊的处理
- LNode*InsertFisrtLNode(LinkList&L,ElemType e){
- LNode*s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->next=L;
- L=s;
- printf("插入节点成功!\n");
- return s;
- }
- //插入节点到第i个位序中
- void ListInsert(LinkList&L,int i,ElemType e){
- //如果i=1,这需要进行特殊的处理
- if(i==1){
- InsertFisrtLNode(L,e);
- return ;
- }
- LNode*p=FindLNode(L,i);
- if(p==NULL){
- printf("插入节点的位置不合法!\n");
- return ;
- }
- LNode*s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->next=p->next;
- p->next=s;
- printf("插入节点成功!\n");
- }
(5)指定节点的后插操作
- //指定节点的后插操作
- LNode* InsertNextNode(LNode*p,ElemType e){
- LNode*s=(LNode*)malloc(sizeof(LNode));
- if(s==NULL){
- printf("内存分配失败!\n");
- return NULL;
- }
- s->data=e;
- s->next=p->next;
- p->next=s;
- printf("插入节点成功!\n");
- return s;
- }
(6)按值删除节点和删除第i个节点
- //表的长度
- int LinkListLength(LinkList L){
- LNode*p=L;
- int len=0;
- while(p!=NULL){
- p=p->next;
- len++;
- }
- return len;
- }
- //按值删除某个节点
- void DeleteElem(LinkList&L,ElemType e){
- if(L==NULL){
- printf("表为空!\n");
- return ;
- }
- int len=LinkListLength(L);
- //用来记录是否为尾节点
- LNode*p=L;
- LNode*r;
- while(p!=NULL){
- if(p->data==e){
- //处理只有一个节点的时候(特殊)
- if(len==1){
- free(p);
- L=NULL;
- return ;
- }else{
- //p->next==NULL表示为尾节点,所以要特殊处理
- if(p->next==NULL){
- LNode*s=p;
- r->next=NULL;
- free(s);
- return ;
- }else{
- LNode*s=p->next;
- ElemType temp=p->next->data;
- p->data=temp;
- p->next=s->next;
- free(s);
- return ;
- }
- }
- }
- r=p;
- p=p->next;
- }
- }
- //删除第i个节点
- void DeleteLNode(LinkList&L,int i,ElemType&e){
- if(L==NULL){
- printf("表为空!\n");
- return;
- }
- if(i<0||i>LinkListLength(L)){
- printf("删除的位置元素不合法!\n");
- return;
- }
- //特殊情况的处理
- LNode*p=L;
- if(LinkListLength(L)==1){
- free(p);
- L=NULL;
- return ;
- }
- int j=1;
- while(p!=NULL&&j
- p=p->next;
- j++;
- }
- e=p->data;
- LNode*s=p->next;
- ElemType temp=p->next->data;
- p->data=temp;
- p->next=s->next;
- free(s);
- return ;
- }
(7)按值查询存在性和打印操作
- //按值查询节点的存在性
- bool FindLNodeExist(LinkList L,ElemType e){
- LNode*p=L;
- while(p!=NULL&&p->data!=e){
- p=p->next;
- }
- if(p==NULL){
- return false;
- }
- return true;
- }
-
- //打印操作
- void DisplayLinkList(LinkList L){
- LNode*p=L;
- while(p!=NULL){
- printf("%d\t",p->data);
- p=p->next;
- }
- printf("\n");
- }
(8)主函数
- int main(){
- LinkList L;
- InitList(L);
- //对顺序表进行插入操作
- ElemType x;
- int flag=-1;
- int j=1;
- LNode*p=L;
- //各种操作
- while(1) {
- int i=0;
- ElemType e=0;
- MenuLinkList();
- printf("请输入操作: ");
- scanf("%d",&flag);
- int len=0;
- LNode*s;
- switch(flag){
- case 1:
- printf("请输入元素(-1_end): ");
- scanf("%d",&x);
- while(x!=-1) {
- //如果插入的是第一个节点,这需要进行特殊的处理
- if(j==1){
- p=InsertFisrtLNode(L,x);
- j++;
- }else{
- p=InsertNextNode(p,x);
- }
- printf("请输入元素(-1_end): ");
- scanf("%d",&x);
- }
- break;
- case 2:
- printf("请输入元素插入位置: \n");
- scanf("%d",&i);
- printf("请输入元素: ");
- scanf("%d",&x);
- ListInsert(L,i,x);
- break;
- case 3:
- printf("请输入查找元素位置: ");
- scanf("%d",&i);
- s=GetElem(L,i);
- if(s!=NULL){
- printf("查找的元素为 = %d\n",s->data);
- }
- break;
- case 4:
- printf("请输入要查找的值: ");
- scanf("%d",&x);
- if(FindLNodeExist(L,x)){
- printf("查找的元素存在!\n");
- }else{
- printf("查找的元素不存在!\n");
- }
- break;
- case 5:
- printf("请输入删除的定位位置: ");
- scanf("%d",&i);
- DeleteLNode(L,i,e);
- printf("删除的元素为 = %d\n",e);
- break;
- case 6:
- printf("请输入要删除的元素: ");
- scanf("%d",&e);
- DeleteElem(L,e);
- printf("删除成功!\n");
- break;
- case 7:
- DestryLinkList(L);
- printf("删除成功!\n");
- break;
- case 8:
- len=LinkListLength(L);
- printf("表的长度 = %d\n",len);
- break;
- case 9:
- DisplayLinkList(L);
- break;
- default:
- DestryLinkList(L);
- printf("结束操作\n");
- }
- if(flag==10){
- break;
- }
- }
- return 0;
- }
(9)测试




-
相关阅读:
mysql第十六章 变量,流程控制触发器课后练习
图解KMP字符串匹配算法+代码实现
【实验记录1】行人重识别
Mojo: 轻量级Perl框架的魔力
数据结构初阶--单链表(讲解+类模板实现)
基于JAVA口腔医院网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署
Spring MVC 中文文档
算法入门(二):简单排序算法
快速计算发票金额
Python采集 11月最新 世界疫情数据 + 可视化动态地图,实时查询超稳定
-
原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/126211534
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU