关键词:
学习数据结构的笔记
1.在线性表的链式存储中,头指针与头结点之间的根本区别以及头结点与开始结点的关系:
链表的头指针一般指向其第一个结点,他有标识链表的作用。头结点的作用在于统一相关操作,头结点的数据域一般没有意义,在某些情况下可以存放链表长 度。如果链表含有头结点,无论链表是 否为空,头指针均不为空。开始结点也就是链表中存储数据的第一个结点,它是头结点后边的第一个结点。
2.比较顺序表和链表各自的特点:
(1)存储分配的方式:顺序表的存储空间是静态分配的。链表的存储空间是动态分配的。
(2)存储密度(存储密度=结点值域所占的存储量/结点结构所占的存储总量):顺序表存储密度=1。链表<1。
(3)存取方式:顺序表可以随机存取,也可以顺序存取。链表是顺序存取的。
(4)插入删除时移动元素的个数:顺序表平均移动近一半元素。链表不需要移动元素,只需要修改指针。
单链表基本操作的C语言实现代码:
单链表结点的定义:
/*??一个单向链表结点的声明,结点串在一起就是一个链表*/ typedef struct LinkNode { int data; //存储的内容,简单得用 int 演示 LinkNode* next; //如何知道下一个结点在哪里呢?可以保存下一个结点的地址 }LinkNode;
初始化:
/*??1.链表的初始化*/ //LinkNode* head 指明头结点地址,要初始化哪一个链表 void Init_LinkList(LinkNode* head) { head->next = NULL; //头结点的 next 指向地址0,表示没有内容 }
单链表的插入(也是建立单链表的过程):
/*??2.链表的插入*/ //LinkNode* head 指明头结点地址,要初始化那一个链表 //int e 要插入结点的内容 //int index 要插入的位置,规定从1标号。以下的代码不对index的范围做检查,假定输入的范围都是对的。 void Insert_LinkList(LinkNode* head, int e, int index) { //由于是单向链表,必须找到插入位置的前驱结点,比如要插入2位置必须先找到1位置。因为有头结点保证一定有前驱结点。 int i; LinkNode* prev, *node; prev = head; //前驱结点 for (i = 1; i < index; i++) prev = prev->next; //??前驱结点找到 node = (LinkNode*)malloc(sizeof(LinkNode)); node->data = e; //??为插入的结点分配内存并赋值 //??关键的插入步骤 //要在prev结点和prev->next结点之间插入node,注意赋值顺序,理解一下为什么一定要是这个顺序 node->next = prev->next; prev->next = node; }
单链表的删除:
/*??3.链表的删除*/ int Delet_LinkList(LinkNode* head, int index) { int i; LinkNode* prev, *node; prev = head; //前驱结点 for (i = 1; i < index; i++) prev = prev->next; //??前驱结点找到 //??关键的删除步骤 node = prev->next; int e = node->data; prev->next = node->next; free(node); return e; }
按序号查找结点值:
/*??4.按序号查找结点值*/ void IdSearch_List(LinkNode * head, int index) { int i = 1; LinkNode * prev; prev = head->next; while (i != index)////////////////////////////////////////////??是在index范围正确的情况下可以。注意一下。 { prev = prev->next; i++; } printf("%d", prev->data); }
按值查找表结点:
/*??5.按值查找表结点*/ int ValueSearch_List(LinkNode * head, int e) { int i = 1; LinkNode *prev; prev = head->next; while (prev != NULL&&prev->data != e) { prev = prev->next; i++; } if (prev == NULL) { printf("该值不存在!\n"); return NULL; } else if (prev->data == e) { return i; } }
打印:
//写个调试打印更直观,直接看调试窗口也可以 void print_list(LinkNode* head) { for (head = head->next; head != NULL; head = head->next) printf("%d -> ", head->data); printf("\n"); }
主函数:
/*??定义一个链表的头结点,头结点只做定位用,指明是哪个单向链表的开始,里面data域虽然也占用空间但用不上。*/ LinkNode List_head;
/*直接在main函数里用Insert_LinkList建表,当然也有尾插法建表(直接插head后面)*/ int main() { Init_LinkList(&List_head); //初始化一下 Insert_LinkList(&List_head, 3, 1); print_list(&List_head); Insert_LinkList(&List_head, 1, 2); print_list(&List_head); Insert_LinkList(&List_head, 6, 3); print_list(&List_head); Insert_LinkList(&List_head, 4, 4); print_list(&List_head); printf("\n"); int value = Delet_LinkList(&List_head, 1); //Delet_LinkList(&List_head, 3);//注意上面一步已经删除了第三个位置元素,加上这一句将会再删除一次 print_list(&List_head); printf("删除的结点值为:%d\n", value); printf("\n"); printf("序号为2查找的结点的值为:"); IdSearch_List(&List_head, 2); printf("\n"); printf("\n");//纯属为了输出界面看得清楚而已 int index = ValueSearch_List(&List_head, 6); printf("结点值为6的结点位置为:%d", index); printf("\n"); printf("\n"); //ValueSearch_List(&List_head, 1000);//调用看看 return 0; }
运行结果:
单链表的基本操作(代码片段)
文章目录单链表的基本介绍链表与数组的区别链表的基本操作链表的创建链表的尾插链表的头插链表的尾删链表的头删链表的查找链表的指定节点后插链表的指定位置前插链表的删除链表的销毁点个赞再走吧单链表的基本介绍单... 查看详情
单链表的基本操作(代码片段)
文章目录单链表的基本介绍链表与数组的区别链表的基本操作链表的创建链表的尾插链表的头插链表的尾删链表的头删链表的查找链表的指定节点后插链表的指定位置前插链表的删除链表的销毁点个赞再走吧单链表的基本介绍单... 查看详情
day2:单链表的基本操作(代码片段)
单链表前言1、单链表的定义2、单链表的特点3、单链表的基本操作1、头文件2、初始化3、打印4、创建新节点5、尾插6、尾删7、头插8、头删9、插入10、删除11、查找12、销毁13、获取链表节点个数4、单链表的注意事项5、扩展6、源... 查看详情
身家过亿的帝都富豪来参加1024节专属盛典,小码农献上单链表一篇来庆祝盛典(代码片段)
...家过亿的帝都富豪来参加1024节专属盛典,小码农献上单链表一篇来庆祝盛典顺序表的缺陷链表链表的概念及结构链表的分类**1.单向或者双向****2.带头或者不带头****3.循环或者非循环**链表的实现无头单向单链表节点单链表打... 查看详情
用java实现单链表的基本操作
...中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置。packagemars;//单链表添加,删除节点publicclassListNode{privateNodehead;publicListNode(){head=null;}//在链表前添加节点publicvoidaddpre(intdvalue){No... 查看详情
数据结构学习笔记——链表的相关知识(单链表带头结点和不带头结点的基本操作)(代码片段)
目录前言一、单链表(一)单链表的相关知识点(二)单链表的定义(三)单链表的初始化和空表判断(四)单链表的输出(五)单链表的建立(六)单链表的逆序输出(七)... 查看详情
单链表的基本操作
///用26个字母来实现简单的单链表的基本操作#include<stdio.h>#include<stdlib.h>#defineok1#defineerror0#defineMAXSIZE100typedefintElemType;typedefintStatus;typedefstructnode{ElemTypedata;structnode*next;}node,* 查看详情
单链表的基本操作(代码片段)
单链表的基本操作单链表结构体声明1#include<stdio.h>2#include<stdlib.h>3#defineOK14#defineERROR05typedefintStatus;6typedefintElementType;7typedefstructsqlist89ElementTypedata;10structsqlist*next;11*LinkLi 查看详情
单链表的操作
单链表的操作 1//2//List.cpp3//List4//5//Createdbyscandy_yuanon13-1-6.6//Copyright(c)2013年Sam.Allrightsreserved.7//89#include<iostream>10usingnamespacestd;1112classList{13public:14List(){cre 查看详情
数据结构单链表的简单理解和基本操作(代码片段)
前言:本章主要内容是数据结构中的单链表。文章目录1.为什么需要链表?1.1顺序表的缺陷1.2链表逻辑结构如下:1.3物理结构如下:1.4顺序表和单链表物理结构的对比:2.单链表的代码实现2.1定义单链表思考下... 查看详情
单链表基本操作(代码片段)
单链表一、链表是什么?二、链表的分类三、单链表的实现动态申请一个节点单链表的尾插单链表的尾删单链表的头插单链表的头删单链表查找在pos之后插入节点x删除pos之后位置的元素逆序打印链表测试函数总结完整代码一... 查看详情
单链表的整表删除
单链表整表删除的算法思路: 声明结点p和q 将第一结点赋值给p,下一个结点赋值给q 循环执行释放p和将q赋值给p的操作代码实现StatusClearList(LinkList*L){LinkListp,q;p=(*L)->next;while(p){q=p->next;free(p);p=q;}(*L)->next=NULL;re... 查看详情
单链表的基本操作(c语言)——章节实验作业
单链表的基本操作(c语言)——章节实验作业#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#include<stdbool.h>typedefcharElemType;typedefstructnode{ElemTypedata;structn 查看详情
单链表的基础操作
单链表中节点的查找、插入、删除、求单链表长度等操作。按序号查找结点值在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL。按序号查找结点值的算法如下... 查看详情
数据结构之单链表的增删查改等操作画图详解(代码片段)
单链表文章目录单链表链表的概念及其结构概念结构链表的实现开辟一个新结点链表的销毁打印链表单链表的尾插单链表的头插单链表的头删单链表的尾删找到单链表中的一个结点在pos位置后插入结点在pos位置前插入一个结点pos... 查看详情
链表的概念和结构及基本功能函数的实现(单链表的实现)(代码片段)
🎓✏️引言🎓✏️链表的概念及结构🎓✏️单链表的实现及图示分析📝🔷单链表之创建单链表📝🔷单链表之计算单链表的长度📝🔷单链表之打印单链表📝🔷单链表之单链表的增删... 查看详情
链表的概念和结构及基本功能函数的实现(单链表的实现)(代码片段)
🎓✏️引言🎓✏️链表的概念及结构🎓✏️单链表的实现及图示分析📝🔷单链表之创建单链表📝🔷单链表之计算单链表的长度📝🔷单链表之打印单链表📝🔷单链表之单链表的增删... 查看详情
单链表的基本操作实现(代码片段)
...是学习链表。所以这篇文章通过用C语言实现链表的一些基本操作和总结,希望对C语言的指针有更新的理解和认识。 2、单链表的定义单链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单元可以是连续的... 查看详情