数据结构之链表

有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(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);
}

大一新生必看,自学必看,里昂详解数据结构之链表相关推荐

  1. 大一新生必看,自学必看,里昂详解数据结构之二叉树

    数据结构之二叉树 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思 ...

  2. 大一新生必看,自学必看,里昂详解数据结构之队列

    数据结构之队列 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  3. 大一新生必看,自学必看,里昂详解数据结构之图

    数据结构之图 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  4. 大一新生必看,自学必看,里昂详解数据结构之线性表

    数据结构之线性表(顺序表) 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) ...

  5. 大一新生必看,自学必看,里昂详解数据结构之堆栈

    数据结构之堆栈 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  6. 大一新生上手题(题目加源代码详解)(每日一题,一题多解)

    2019 数列有序! Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序.n从键盘输 ...

  7. 思科ccna认证工程师必看路由协议IGRP和EIGRP详解

    思科ccna认证工程师必看路由协议IGRP和EIGRP详解单单从他们的名字当中,我们就能猜到他们之间有很多的关联. IGRP: 一种内部网关路由协议,它由Cisco公司八十年代中期设计.使用组合用户配 ...

  8. 一看就懂的CE-NET详解

    一看就懂的CE-NET详解 针对问题 u-net及其变体存在限制,连续的pooling和交错的卷积运算会导致一些空间信息的丢失. 文章贡献 提出了一个DAC模块和一个RMP模块来捕获更多的高级特征并保 ...

  9. 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章

    7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...

最新文章

  1. 中文预训练ALBERT模型来了:小模型登顶GLUE,Base版模型小10倍、速度快1倍
  2. iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决
  3. RTSP再学习 -- RTSP协议分析(转载)
  4. HDU1054 Strategic Game
  5. linux 普通用户touch权限不够_Linux 开启指令
  6. Linux系统文件属性,什么是Linux系统的文件属性?
  7. lbp matlab程序,求教大神给解释一下LBP特征提取每部分程序是干什么的
  8. 企业网站 源码 e-mail_临汾网站制作,B2B软件哪家好
  9. python使用线程池多线程执行,并得到返回的结果
  10. python网格搜索法_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...
  11. Java 使用execute方法执行Sql语句
  12. 从 0 到 1:全面理解 RPC 远程调用!
  13. c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT
  14. Python安装常见问题:ModuleNotFoundError: No module named ‘_ctypes‘ 解决办法
  15. 可执行jar包的maven配置
  16. Spring,Mybatis,Springmvc框架整合项目(第一部分)
  17. 【IoT】创业:一份价值主张画布送给你
  18. 【FACT】函数使用技巧
  19. 如何下载3GPP协议
  20. 设备接入ONENET(2)STM32 + ESP8266(MQTT协议)接入云 :使用 OneNET 官方麒麟座开发板例程

热门文章

  1. Codeforces Edu Hacking
  2. 【独家】微软中国开始挖人,看中搜索人才
  3. 当计算机没有网时,怎么连接网络?
  4. JS中使用Math.round(x)保留1位小数点
  5. SpringBoot导出word模板并动态渲染数据
  6. 投影仪应该怎么选择?数码粉总结目前最好的家用投影仪
  7. sql数据库去重语法_oracle大数据去重sql语句
  8. 深圳垃圾分类告诉你这些都是什么垃圾 不仅要会分还要分的准确才行
  9. 照片的体积怎么缩小?教你快速缩小图片体积的方法
  10. 解决网页无法选中文字,无法复制的问题