单链表的表示以及基本操作函数

    引言 

     本文是我学习清华大学出版社《数据结构》课程有关单链表知识点的感悟,主要在于课本上算法伪代码的实现,仅作学习交流之用

    正文

     线性表的顺序存储结构要求在逻辑顺序上相邻的两个结构物理位置也必须相邻,这就造成了一个后果,即插入删除一个元素时可能会移动大量的指针,进而导致程序的时间复杂度迅速上升。因此为了尽可能减少程序存储的时间复杂度,就有了链式存储结构这有一种存储的方式,这种结构的特点是逻辑上相邻的元素(有一定先后顺序的元素)在物理位置上不一定相邻。由于链式存储的缘故,使得元素在物理位置上有一种跳跃的特性。换言之,两个有先后顺序的元素不一定处在相邻的内存区域。

     与顺序表相比不同的是,由于其物理位置不一定相邻的特性,每个数据元素a_{i}a_{i+1}之间的关系不能仅仅通过改变其位序来进行访问,相对地,每个数据元素除了存储本身的信息之外,还需要一个信息块用于存储其后继元素的信息。这就是平时所说的数据域指针域。数据域用于存储数据元素本身的信息,元素的类型可以有int 型,char型,float型等,指针域则用于存储一个指针(链),同时具有数据域与指针域的数据元素称作一个结点,n个结点通过指针相互连接称作一个链表,也可以理解为顺序表a_{1},a_{2}...a_{n}的链式存储结构。链式存储结构示意图如下:

     由存储结构的示意图,可以将单链表的某个节点用“结构指针”的方法来表示,每个结点定义为Node类型的结构体,一个结构体内包括int型的变量data作为数据域,Node类型的指针变量记作next,同时,定义Node型的对象记作Lnode,返回类型为Node型(指向结点)的指针变量记作linklist。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
typedef struct Node
{
   int data;
   struct Node *next;
}Lnode,*linklist;

   有时候需要在单链表中确定一个指向第一个结点的指针,记作单链表的头指针,同时也可以在第一个结点之前附加设置一个结点,称作单链表的头结点,头结点的数据域可以存储其他的信息,例如可以存储一个布尔型变量用于表示该条链表是否被访问过,示意图如下,H表示头指针,h1表示头结点,不存储任何数据,而a3表示尾结点(其指针域为空):

    单链表的结点结构完成后,需要了解单链表的基本操作函数,与顺序表类似,基本操作函数主要为三个:1.单链表元素的插入  2.单链表元素的删除  3.单链表元素的查找。

    1.单链表元素的插入,主要思路如下:1)定义函数的自变量为头指针head,int型变量 i、e,i 用于指示插入结点的位置(操作函数要求在第i个结点之前插入),e代表插入元素的数值。2)定义指针变量p ,用linklist p语句进行表示,先将p初始化为头指针head,再将p指针指向其后继结点,循环直到第i -1个结点为止。3)新建结点s(由s指针指向的结点),为结点s分配内存,将s结点插入作为p结点的后继结点。示意图以及代码如下:

linklist Insert(linklist head,int i,int e)
{
    linklist p,s;
    p=head;
    for(int j=0;j<=i-1;++j)
    {
        p=p->next;          //从第0个结点位置开始向后寻找至第i-1个位置
    }
    s=(Lnode*)malloc(sizeof(Lnode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return head;
}//在结点的第i个位置前插入元素

2.单链表元素的删除 基本思路如下:1)定义链表的头指针head,定义int型变量i用于控制位序(定位删除结点的位置),e用于返回被删除元素的值  2)定义指针p,q,用linklist p,q语句表示,p指针初始化为head(指向头结点),将p指针不停往头结点后继推移,直至指向位序为i-1的结点为止   3)用指针q指向p指针所指结点的后继结点,再将p指针的后继结点指为q指针所指结点的后继结点,用e返回q指针所指结点的数据域值,释放q指针所指结点的空间,这样就在不删除其余元素的情形下删除了位序为i的元素。示意图以及代码如下:

​
linklist Delete(linklist head,int i,int e)
{
    linklist p,q;
    p=head;
    for(int j=0;j<i-1;j++)
    {
        p=p->next;
    }
    q=p->next;
    e=q->data;
    cout<<e<<endl;
    p->next=q->next;
    free(q);
}
​

  3.单链表元素的查找  基本思路如下:1)定义linklist类型的变量p,初始化为头指针head(指向头结点)  2)通过for循环,进行 i 次,使p指针指向位序为i的元素  3)用int 类型变量e返回位序为i 的元素的值。代码如下:

int Search(linklist head,int i,int e)
{
    linklist p;
    p=head;
    for(int j=0;j<i;j++)
    {
        p=p->next;
    }
    e=p->data;
    return e;
}

   

猜你喜欢

转载自blog.csdn.net/qq_38846633/article/details/81165413
今日推荐