当前位置: 首页 > news >正文

2.3.1单链表的定义

2.3.1单链表的定义

1778656263528

1778656327655

1778656344082

struct LNode{//定义单链表节点类型ElemType data;//每个节点存放一个数据元素struct LNode *next;// 指针指向下一个节点
};struct LNode *p=(struct LNode *)malloc(sizeof(struct LNode));

1778656811356

typedef struct LNode{//定义单链表结点类型ElemType data;//每个节点存放一个数据元素struct LNode *next;// 指针指向下一个节点
}LNode,*LinkList;struct LNode{ElemType data;struct LNode *next;
};typedef struct LNode LNode;
typedef struct LNode *LinkList;

1778657110223

typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;LNode *GetElem(LinkList L,int i){int j=1;LNode *p=L->next;if(i==0)return L;if(i<1)return NULL;while(p!=NULL && j<i){p=p->next;j++;}return p;
}
#头插法建立单链表的算法
LinkList List_HradInsert (LinkList &L){LNode *s;int x;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;scanf("%d",&x);while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;s->next=L->next;L->next=s;scanf("%d",&x);}return L;
}
#不带头结点的单链表
typedef struct LNode{//定义单链表结点类型ElemType data;//每个节点存放一个数据元素struct LNode *next;// 指针指向下一个节点
}LNode,*LinkList;//初始化一个空的链表
bool InitList(LinkList & L){L=NULL;//空表,暂时还没有任何结点return true;
}void test(){LinkList L;//生成一个指向单链表的指针//初始化一个空表InitList(L);//...后续代码...
}

1778659892390

#带头结点的单链表typedef struct LNode{//定义单链表结点类型ElemType data;//每个节点存放一个数据元素struct LNode *next;// 指针指向下一个节点
}LNode,*LinkList;//初始化一个单链表(带头结点)
bool InitList(LinkList &L){L=(LNode *)malloc(sizeof(LNode));//分配一个头节点if(L==NULL)//内存不足,分配失败return false;L->next = NULL;//头节点之后暂时还没有节点return true;}void test(){LinkList L;//声明一个指向单链表的指针//初始化一个空表InitList(L);//...后续代码...
}

1778660423721

1778660467347

1778660479355

2.3.2_1单链表的插入和删除

按位序插入(带头节点)

ListInsert(&L,i,e):插入操作

1778661634583

//在第i个位置插入元素e(带头结点)
bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)return false;LNode *p;//指针p指向当前扫描到的结点int j=0;//当前p指向的是第几个结点p = L;//L指向头结点,头结点是第0个结点(不存数据)while (p!=NULL && j<i-1){//循环找到第i-1个结点p=p->next;j++;}if(p==NULL)//i值不合法return false;LNode *s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next=p->next;p->next=s;//讲结点s连到p之后return true;//插入成功
}
//线连接后断掉

时间复杂度O(n)

# 按位插入不带头节点
bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)return false;if(i==1){//插入第1个结点的操作与其他结点操作不同LNode *s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next = L;L=s;//头指针指向新的结点return true;}LNode *p;//指针p指向当前扫描到的结点int j=1;//当前p指向的是第几个结点p=L;//p指向第一个结点(注意不是头结点)while(p!=NULL&&j<i-1){//循环找到第i-1个结点p=p->next;j++;}if(p==NULL)//i值不合法return false;LNode *s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next=p->next;p->next =s;return true;//插入成功
}

豆包完整可编译

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>  // 解决C语言bool类型未知的问题typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode *next;
}LNode,*LinkList;// 按位插入:不带头结点,C语言二级指针修改头指针
bool ListInsert(LinkList *L,int i,ElemType e){// 位序非法if(i<1)return false;// 特殊处理:插入第1个位置(需修改头指针)if(i==1){LNode *s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next = *L;   // 解引用二级指针,获取原第一个结点*L = s;         // 解引用二级指针,更新头指针return true;}// i>1 的情况:找第 i-1 个结点LNode *p;int j=1;p = *L;  // 解引用二级指针,从第1个数据结点开始遍历// 向后走到第 i-1 个结点while(p!=NULL && j<i-1){p = p->next;j++;}// i过大,无第i-1结点,插入失败if(p==NULL)return false;// 把s插在p后面LNode *s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}// 测试函数(可选,验证插入功能)
void PrintList(LinkList L){LNode *p = L;while(p != NULL){printf("%d ", p->data);p = p->next;}printf("\n");
}int main(){LinkList L = NULL;  // 初始化空链表(不带头结点)// 测试插入ListInsert(&L, 1, 10);  // 插第1位ListInsert(&L, 2, 20);  // 插第2位ListInsert(&L, 1, 5);   // 插第1位PrintList(L);  // 输出:5 10 20return 0;
}
#指定结点的后插操作//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p,ElemType e){if(p==NULL)return false;	LNode *s = (LNode *)malloc(sizeof(LNode));if(s==NULL)//内存分配失败return false;s->data = e;//用结点s保存数据元素es->next=p->next;p->next=s;//将结点s连到p之后return true;
}

指定结点的前插操作

1778665334939

//前插操作:在p结点之前插入元素e
bool InsertPriorNode (LNode *p,ElemTpye e){if(p==NULL)return false;LNode *s = (LNode *)malloc(sizeof(LNode));if(s==NULL)return false;s->next = p->next;p->next =s;//新结点s连接到p之后s->data=p->data;//将p中元素复制到s中p->data=e;//p中元素覆盖为ereturn true;
}
//找不到前驱 直接在后面插入一个结点然后给两个值对换!!!

按位删除(带头节点)

bool ListDelect(LinkList &L,int i,ElemType &e){if(i<1)return false;LNode *p;//指针p指向当前扫描到的结点int j=0;//当前p指向的是第几个结点p=L;//L指向头结点,头结点是第0个结点(不存数据)while(p!=NULL && j<i-1){//循环找到第i-1个结点p=p->next;j++;}if (p==NULL)//i值不合法return false;if(p->next ==NULL)//第i-1个结点之后已无其他结点return false;LNode *q=p->next;//令q指向被删除结点e = q->data;//用e返回元素的值p->next = q->next;//将*q结点从链条中断开free(q);//释放结点的存储空间return true;//删除成功
}

O(n)

//删除指定结点p
bool DeleteNode(LNode *p){if(p==NULL)return false;LNode *q=p->next;//令q指向*p的后继结点p->data = p->next->data;//和后继结点交换数据域p->next = q->next;//将*q结点从链条中断开free(q);//释放后继结点的存储空间return true;
}

如果p是最后一个结点

// 删除指定结点 p(兼容尾结点)
bool DeleteNode(LNode *p, LinkList L){  // 必须传入头指针 Lif(p == NULL)return false;// 情况1:p 不是最后一个结点 → 用O(1)妙法if(p->next != NULL){LNode *q = p->next;p->data = q->data;p->next = q->next;free(q);return true;}// 情况2:p 是最后一个结点 → 必须从头找前驱else{LNode *pre = L;// 遍历找到 p 的前驱结点while(pre->next != p){pre = pre->next;}pre->next = NULL; // 断开尾结点free(p);return true;}
}

1778667141640

http://www.jsqmd.com/news/810371/

相关文章:

  • 2027主管护师复习刷题用哪个APP?5款热门软件深度测评 - 医考机构品牌测评专家
  • 打破设备界限:用Sunshine开源串流工具打造你的家庭游戏云
  • 基于AI与RPA的智能求职自动化工具:原理、配置与实战指南
  • 2026年项目管理工具选型指南:主流方案对比与Gitee核心优势解析
  • Illustrator智能填充插件Fillinger:彻底告别手动重复的终极解决方案
  • 2026年腾讯云如何集成OpenClaw / Hermes Agent 配置 Token Plan?保姆级攻略来了
  • 记忆张量科技联合上交大等开源MemOS:LLM长期记忆操作系统,时序推理较OpenAI提升159%
  • 2026上海大众搬家号码/大众搬家联系方式/大众搬家电话号码/推荐指南 - 速递信息
  • 如何快速掌握Avogadro 2:开源分子可视化工具的终极指南
  • 2026年全屋定制行业东莞三喜家具有限公司:深耕多年的口碑优选服务商 - 速递信息
  • Windows平台APK安装实战:突破Android应用在PC端的部署壁垒
  • 2026东四省艺考集训TOP5!辽宁沈阳等地学校机构靠谱出成绩获好评 - 十大品牌榜
  • 告别BRAM!手把手教你用Vivado 2020.1为MicroBlaze工程挂载DDR3内存(附完整MIG配置流程)
  • ChatGPT 2026正式版来了:支持原生多模态实时推理、离线边缘部署、跨平台记忆同步——开发者必须今晚适配的5个API变更
  • 绍兴GEO推广平台怎么选才靠谱? - 速递信息
  • DeepSeek-Coder-V2:如何用这个免费开源AI编程助手提升你的开发效率?终极指南
  • 5个关键技巧:掌握AutoJs6界面布局设计的最佳实践
  • 基于MCP协议在Cursor中集成AI绘图:实战搭建与深度应用指南
  • 2026东四省艺考培训TOP5!辽宁沈阳等地学校中心成绩优异口碑出众 - 十大品牌榜
  • TrendForge 每日精选:10 个热门开源项目,今日总获星 11321 颗!
  • Axure RP中文界面终极指南:一键告别英文困扰,让原型设计更流畅
  • 合肥黄金回收哪家靠谱?本地5家机构深度测评 - 野榜数据排行
  • Windows平台微信/QQ/TIM防撤回补丁完整指南:如何彻底阻止消息被撤回
  • 穗宝床垫好不好?穗宝床垫用54载匠心沉淀,用品质说话! - 速递信息
  • 【独家首发】Gemini Chrome插件安全审计报告:发现2类未公开API越权风险,仅限前500名开发者获取修复补丁
  • Trae IDE 搭载 Burp Suite MCP Server 完整指南 —— 让 AI 直接操控 Burp Suite
  • 开源协作核心技能:从Git高级操作到社区治理的完整指南
  • 2026手持式加热设备/感应加热设备/熔炼炉/热套机厂家推荐 - 速递信息
  • SimCSE中文实战避坑指南:从数据准备、模型训练到效果评估的完整流程
  • 告别真机调试:用QEMU模拟ARM vexpress-a9板子运行自定义Linux系统(含rootfs制作)