大一新生必看,自学必看,里昂详解数据结构之链表
数据结构之链表
有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)
核心算法思想
1. 链表建立操作的基本步骤:链表是一个动态的结构,它不需要分配空间,因此建立链表的过程是一个结点“逐个插入” 的过程。先建立一个只含头结点的空单链表,然后依次生成新结点,再不断地将其插入到链表的头部或尾部,分别称其为“头插法”和“尾插法”。
2. 链表查找操作的基本步骤:因链表是一种"顺序存取"的结构,则要在带头结点的链表中查找到第 i个元素,必须从头结点开始沿着后继指针依次"点数",直到点到第 i 个结点为止,如果查找成功,则用e返回第i个元素值。头结点可看成是第0个结点。
3. 链表插入操作的基本步骤:先确定要插入的位置,如果插入位置合法,则再生成新的结点,最后通过修改链将新结点插入到指定的位置上。
4. 链表删除操作的基本步骤:先确定要删除的结点位置,如果位置合法,则再通过修改链使被删结点从链表中“卸下”,最后释放被删结点的空间。
算法实现
单链表的存储结构描述如下:
typedef struct LNode //定义单链表结点类型
{ElemType data;struct LNode *next;
} LinkList;
初始化链表:
void InitList(LinkList *&L)
{L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点L->next=NULL;
}
销毁线性表:
void DestroyList(LinkList *&L) //销毁线性表
{LinkList *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);
}
判断是否为空表:
bool ListEmpty(LinkList *L) //判线性表是否为空表
{return(L->next==NULL);
}
求线性表长度:
int ListLength(LinkList *L) //求线性表的长度
{LinkList *p=L;int i=0;while (p->next!=NULL){i++;p=p->next;}return(i);
}
输出线性表:
void DispList(LinkList *L) //输出线性表
{LinkList *p=L->next;while (p!=NULL){printf("%c ",p->data);p=p->next;}printf("\n");
}
求线性表某个数据元素值:
bool GetElem(LinkList *L,int i,ElemType &e) //求线性表中某个数据元素值
{int j=0;LinkList *p=L; //p指向头节点,j置为0(即头节点的序号为0)while (j<i && p!=NULL) //找第i个节点{ j++;p=p->next;}if (p==NULL) //不存在第i个数据节点,返回0return false;else //存在第i个数据节点,返回1{ e=p->data;return true;}
}
按元素值查找:
int LocateElem(LinkList *L,ElemType e) //按元素值查找
{ int i=1;LinkList *p=L->next; //p指向开始节点,i置为1(即开始节点的序号为1)while (p!=NULL && p->data!=e) //查找data值为e的节点,其序号为i{ p=p->next;i++;}if (p==NULL) //不存在元素值为e的节点,返回0return(0);else //存在元素值为e的节点,返回其逻辑序号ireturn(i);
}
链表的插入:
bool ListInsert(LinkList *&L,int i,ElemType e) //插入数据元素
{int j=0;LinkList *p=L,*s; //p指向头节点,j置为0(即头节点的序号为0)while (j<i-1 && p!=NULL) //查找第i-1个节点{ j++;p=p->next;}if (p==NULL) //未找到第i-1个节点,返回falsereturn false;else //找到第i-1个节点*p,插入新节点并返回1{ s=(LinkList *)malloc(sizeof(LinkList));s->data=e; //创建新节点*s,其data域置为es->next=p->next; //将*s插入到*p之后p->next=s;return true;}
}
线性表的删除:
bool ListDelete(LinkList *&L,int i,ElemType &e) //删除数据元素
{int j=0;LinkList *p=L,*q; //p指向头节点,j置为0(即头节点的序号为0)while (j<i-1 && p!=NULL) //查找第i-1个节点{ j++;p=p->next;}if (p==NULL) //未找到第i-1个节点,返回falsereturn false;else //找到第i-1个节点*p{ q=p->next; //q指向第i个节点if (q==NULL) //若不存在第i个节点,返回falsereturn false;e=q->data;p->next=q->next; //从单链表中删除*q节点free(q); //释放*q节点return true; //返回true表示成功删除第i个节点}
}
实践出真知,代码案例
编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上设计一个主程序完成如下功能:
(1)初始化单链表h;
(2)依次采用尾插法插入a、b、c、d、e元素;
(3)输出单链表h;
(4)输出单链表h的长度;
(5)判断单链表h是否为空;
(6)输出单链表h的第3个元素;
(7)输出元素a的位置
(8)在第4个元素位置上插入f元素
(9)输出单链表h;
(10)删除h的第3个元素;
(11)输出单链表h;
(12)释放单链表h。
案例源码
typedef int ElemType;typedef struct node {char num[20];char name[50];float price;struct node *next;
}Book,*BookList;typedef struct LNode {ElemType data;struct LNode *next;
}LinkList;void InitList(LinkList*&L) {L = (LinkList*)malloc(sizeof(LinkList));L->next = NULL;
}void DestoryList(LinkList*&L) {LinkList*p = L;LinkList*q = p->next;while (q!=NULL){free(p);p = q;q = p->next;}free(p);
}bool ListEmpty(LinkList*L) {return(L->next == NULL);}int ListLength(LinkList*L) {LinkList*p = L;int i = 0;while (p->next!=NULL){i++;p = p->next;}return(i);
}void DispList(LinkList*L) {LinkList*p = L->next;while (p!=NULL){printf("%c", p->data);p = p->next;}printf("\n");
}bool GetElem(LinkList*L, int i, ElemType &e) {int j = 0;LinkList*p = L;while (j<i&&p!=NULL){j++;p = p->next;}if (p == NULL)return false;else{e = p->data;return true;}
}int LocateElem(LinkList*L, ElemType e) {int i = 1;LinkList*p = L->next;while (p!=NULL&&p->data!=e){p = p->next;i++;}if (p == NULL)return(0);else{return(i);}
}bool ListInsert(LinkList*L, int i, ElemType e) {int j = 0;LinkList*p = L;LinkList*s;while (j<i-1&&p!=NULL){j++;p = p->next;}if (p == NULL)return false;else {s = (LinkList*)malloc(sizeof(LinkList));s->data = e;s->next = p->next;p->next = s;return true;}
}bool ListDelete(LinkList*&L, int i, ElemType&e)
{int j = 0;LinkList*p = L;LinkList*q;while (j<i-1&&p!=NULL){j++;p = p->next;}if (p == NULL)return false;else{q = p->next;if (q == NULL)return false;e = q->data;p->next = q->next;free(q);return true;}
}int main()
{LinkList *h;ElemType e;printf(" (1)初始化单链表h\n");InitList (h);printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(h,1,'a');ListInsert(h,2,'b');ListInsert(h,3,'c');ListInsert(h,4,'d');ListInsert(h,5,'e');printf(" (3)输出单链表h:");DispList(h);printf(" (4)单链表h长度=%d\n",ListLength(h));printf(" (5)单链表h为%s\n",(ListEmpty(h)?"空":"非空"));GetElem(h,3,e);printf(" (6)单链表h的第3个元素=%c\n",e);printf(" (7)元素a的位置=%d\n",LocateElem(h,'a'));printf(" (8)在第4个元素位置上插入f元素\n");ListInsert(h,4,'f');printf(" (9)输出顺序表h:");DispList(h);printf(" (10)删除h的第3个元素\n");ListDelete(h,3,e);printf(" (11)输出单链表h:");DispList(h);printf(" (12)释放单链表h\n");DestoryList(h);
}
大一新生必看,自学必看,里昂详解数据结构之链表相关推荐
- 大一新生必看,自学必看,里昂详解数据结构之二叉树
数据结构之二叉树 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思 ...
- 大一新生必看,自学必看,里昂详解数据结构之队列
数据结构之队列 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...
- 大一新生必看,自学必看,里昂详解数据结构之图
数据结构之图 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...
- 大一新生必看,自学必看,里昂详解数据结构之线性表
数据结构之线性表(顺序表) 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) ...
- 大一新生必看,自学必看,里昂详解数据结构之堆栈
数据结构之堆栈 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...
- 大一新生上手题(题目加源代码详解)(每日一题,一题多解)
2019 数列有序! Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序.n从键盘输 ...
- 思科ccna认证工程师必看路由协议IGRP和EIGRP详解
思科ccna认证工程师必看路由协议IGRP和EIGRP详解单单从他们的名字当中,我们就能猜到他们之间有很多的关联. IGRP: 一种内部网关路由协议,它由Cisco公司八十年代中期设计.使用组合用户配 ...
- 一看就懂的CE-NET详解
一看就懂的CE-NET详解 针对问题 u-net及其变体存在限制,连续的pooling和交错的卷积运算会导致一些空间信息的丢失. 文章贡献 提出了一个DAC模块和一个RMP模块来捕获更多的高级特征并保 ...
- 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章
7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...
最新文章
- 中文预训练ALBERT模型来了:小模型登顶GLUE,Base版模型小10倍、速度快1倍
- iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
- RTSP再学习 -- RTSP协议分析(转载)
- HDU1054 Strategic Game
- linux 普通用户touch权限不够_Linux 开启指令
- Linux系统文件属性,什么是Linux系统的文件属性?
- lbp matlab程序,求教大神给解释一下LBP特征提取每部分程序是干什么的
- 企业网站 源码 e-mail_临汾网站制作,B2B软件哪家好
- python使用线程池多线程执行,并得到返回的结果
- python网格搜索法_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...
- Java 使用execute方法执行Sql语句
- 从 0 到 1:全面理解 RPC 远程调用!
- c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT
- Python安装常见问题:ModuleNotFoundError: No module named ‘_ctypes‘ 解决办法
- 可执行jar包的maven配置
- Spring,Mybatis,Springmvc框架整合项目(第一部分)
- 【IoT】创业:一份价值主张画布送给你
- 【FACT】函数使用技巧
- 如何下载3GPP协议
- 设备接入ONENET(2)STM32 + ESP8266(MQTT协议)接入云 :使用 OneNET 官方麒麟座开发板例程