当前位置:   article > 正文

数据结构2——链表_在链表中有r->next=newnode->next,r=newnode

在链表中有r->next=newnode->next,r=newnode

一,单链表:

1,为什么引入链表?

由于顺序表的插入,删除需要移动大量的元素,影响了运行效率。因此引入了线性表链式存储。逻辑上相邻的元素不要求物理地址也相邻,通过链来建立数据元素之间的关系

2,链表的定义

  1. typedef int Elemtype;
  2. typedef struct LNode{
  3.     Elemtype data;//存储本节点的数据 
  4.     struct LNode *next;//存储下一个节点的地址 
  5. }LNode,*LinkList;//结构体的变量 

 3,链表头插入法解读

  1. LinkList CreatList_H(LinkList &L){
  2.     LNode *s;
  3.     int x;
  4.     L = (LinkList)malloc(sizeof(LNode));//创建初始头节点
  5.     L->next=NULL;//L->的形式调用结构体成员,因为L是指针类型,当然也可以(*L).next进行调用,这是把*L看成变量 
  6.     scanf("%d",&x);
  7.     while(x!=9999){//输入9999表示停止输入 
  8.         s=(LNode*)malloc(sizeof(LNode));//创建新节点 
  9.         s->data=x;//为节点赋值 
  10.         s->next=L->next;//将节点插入链表,L为头指针 
  11.         L->next=s;
  12.         scanf("%d",&x);
  13.     }
  14.     return L;

 

4,链表尾插入法解读

  1. LinkList CreatList_R(LinkList &L){
  2.     int x;
  3.     L = (LinkList)malloc(sizeof(LNode));//创建初始头节点
  4.     LNode *s,*r=L;//r是表尾指针 
  5.     scanf("%d",&x);
  6.     while(x!=9999){//输入9999表示停止输入 
  7.         s=(LNode*)malloc(sizeof(LNode));
  8.         s->data=x;
  9.         r->next=s;//将s插到链表尾指针r的后面 
  10.         r=s;//r是一个暂时存放尾指针的变量,将新链表的尾指针地址s存到r上 
  11.         scanf("%d",&x);
  12.     } 
  13.     r->next=NULL;
  14.     return L;

5,按顺序查找第i个节点

  1. LNode *GetElem(LinkList &L,int i){
  2. int j=1;//用来计数
  3. LNode *p=L->next;
  4. if(i==0)//返回头节点
  5. return L;
  6. if(i<1)//i无效,返回NULL
  7. return NULL;
  8. while(p&&j<i){//当前节点的指针域不为空,说明有下个节点。并且j<i时执行
  9. p=p->next;//当j=i-1时,p存储的是i节点的地址
  10. j++;
  11. }
  12. return p;
  13. }

6,按值查找节点

  1. LNode *GetElem2(LinlList &L,Elemtype value){
  2. LNode *p=L->next;//p为头结点
  3. while(p){//下一个节点存在
  4. if(p->data==value )
  5. return p
  6. else
  7. p=p->next;//遍历下一节点
  8. }
  9. return NULL;
  10. }

 

7,在链表pos插入节点value

  1. bool Insert_Front(LinkList &L,int pos,Elemtype value){
  2. LNode *p=GetElem(L,pos-1);//获取到pos的前一个节点
  3. if(p==NULL){//如果插入位置的前一节点不存在。
  4. printf("插入位置不合法");
  5. return false;
  6. }
  7. LNode *newNode=(LNode*)malloc(sizeof(LNode));//为新节点分配存储空间
  8. newNode->data=value;//为新节点赋值
  9. newNode->next=p->next;//插入到链表中
  10. p->next=newNode;
  11. return true;
  12. }

8,删除pos位置的值

  1. bool Delete_Node(LinkList &L,int pos){
  2. LNode *p=GetElem(L,pos-1);//获取到pos的前一个节点
  3. LNode *q=p->next;//待删除的节点
  4. if(p==NULL){//如果插入位置的前一节点不存在。
  5. printf("待删除的节点位置不存在");
  6. return false;
  7. }
  8. p->next=q->next;
  9. free(q);
  10. printf("删除成功\n");
  11. return true;
  12. }

9,求表长

  1. int length(LinkList &L){
  2. LNode *p=L->next;
  3. int length=0;
  4. while(p){
  5. length++;
  6. p=p->next;
  7. }
  8. printf("表长为%d\n",length);
  9. return length;
  10. }

 

二,双链表

1,为什么要引入双链表?

因为单链表中,只有后继节点的指针,这使单链表只能只能从头节点依次遍历链表。当我们需要访问某个节点的前驱节点时,就只能从头遍历,很不方便。这样访问后继节点的时间复杂度为O(1),访问前驱节点的时间复杂度为O(n)。为了克服这个缺点我们在结构体中再加入前驱节点的指针域,这就是双链表

优势:

  • 插入删除不需要移动元素外,可以原地插入删除
  • 可以双向遍历

2,双链表定义

  1. typedef struct Dnode{
  2. Elemtype data;
  3. struct Dnode *prior,*next;
  4. }DNode,*DLinkList;

3,在p后插入s操作的核心

  1. s->next=p->next;
  2. p->next-prior=s;
  3. p->next=s;
  4. s->prior=p;

 

4,删除p后面的q操作的核心

  1. p->next=q->next;
  2. q->next->prior=p;
  3. free(q);

 

三,顺序表和链表的比较:

1,存取方式:

顺序表可以顺序存取,也可以随机存取。链表只能从表头顺序存取元素

2,逻辑结构与物理结构:

采用顺序存储,逻辑上相邻的元素,物理存储位置也相邻。链表存储,逻辑上相邻的元素,物理存储位置不一定相邻。

3,查找,插入和删除操作

  • 查找:按值查找,当顺序表无序时,顺序表的查找与链表的查找时间复杂度都为O(n)。当顺序表有序时,可以采用折半查找,时间复杂度为O(log2n)。如果是按序号查找顺序表的时间复杂度为O(1),链表的时间复杂度为O(n)。
  • 插入删除:顺序表需要移动半个表长的元素,链表只需修改相邻节点的指针域即可。

4,空间分配:

  • 链表因为每个节点需要带有指针域,所以占用的存储空间大于顺讯存储的
  • 顺序存储在静态分配的情况下,一旦存储空间满了会发生溢出,为防止溢出分配大空间会造成浪费。动态分配情况下可以实现存储空间的扩充,但需要移动大量的元素,导致操作效率降低,如果内存中无大块的连续存储空间可能导致分配失败。链式存储只在需要的时候进行分配内存,操作灵活,高效。

四,实际应用过程中如何选取存储结构?

1,基于存储考虑:

线性表长度或者存储规模难以估计时,采用链表

2,基于运算考虑:

按序查找,顺序表时间复杂度为O(1),链表为O(n),如果经常使用按序查找考虑使用顺序存储

当数据元素的信息量很大时,又会频繁地对表进行插入,删除操作,因为顺序存储平均需要移动半个表的元素,因此考虑使用链表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/429176
推荐阅读
相关标签
  

闽ICP备14008679号