数据结构-线性表的链式结构

线性表的链式结构,与之前说过的线性表的顺序结构差不多,区别在于存储结构和方式的不一样。

在链式中,来一个数据就去寻找一个空间存储一个结点有多少数据占多大的地方,是动态的存储方式。另外顺序表如果存储1MB就只占1MB存储空间,但是链式表不一样,它会有额外的空间去存储对应结点的指针。

这样一分析结构就出来了,链式结构为两部分:1.结点域。2.指针域。实现方法用动态存储。

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3
  4 typedef int ElemType;
  5 typedef int Status;
  6 #define ERROR 0
  7 #define OK 1
  8
  9 typedef struct LNode
 10 {
 11     ElemType data;        //数据域
 12     struct LNode *next;    //指针域
 13 }LNode, *LinkList;
 14
 15 //构建一个空的线性表L
 16 Status InitList(LinkList &L)
 17 {
 18     L = (LinkList)malloc(sizeof (LNode));    //产生头结点,并使L指向头结点
 19     if(!L)
 20         return ERROR;
 21     L->next = NULL;
 22     return OK;
 23 }//InitList
 24
 25 //销毁线性表L
 26 Status DestroyList(LinkList &L)
 27 {
 28     LinkList p;
 29     while(L)    //循环释放结点
 30     {
 31         p = L->next;
 32         free(L);
 33         L = p;
 34     }
 35     return OK;
 36 }//DestroyList
 37
 38 //重置线性表L为空表
 39 Status ClearList(LinkList L)
 40 {
 41     LinkList p = L->next, q;
 42     while (p)    //循环释放结点
 43     {
 44         q = p->next;
 45         free(p);
 46         p = q;
 47     }
 48     L->next = NULL;    //头结点指针域为空s
 49     return OK;
 50 }//ClearLIst
 51
 52 //判断线性表是否为空表
 53 Status ListEmpty(LinkList L)
 54 {
 55     if(L->next)
 56         return true;    //非空返回OK
 57     else
 58         return false;    //空表返回ERROR
 59 }//ListEmpty
 60
 61 //返回线性表L中的个数
 62 int ListLength(LinkList L)
 63 {
 64     int i = 0;
 65     LinkList p = L->next;    //p指向第一个结点
 66     while(p)    //循环到表尾
 67     {
 68         p = p->next;
 69         ++i;
 70     }
 71     return i;
 72 }//ListLength
 73
 74 //当第i个元素存的时,赋值给e并返回OK,否则返回ERROR
 75 Status GetElem(LinkList L, int i, ElemType &e)
 76 {
 77     LinkList p = L->next;    //p指向第一个结点
 78     int j = 1;
 79     while(p && j < i)        //顺指针向后查找,直到p指向第i个元素或p为空
 80     {
 81         p = p->next;
 82         ++j;
 83     }
 84     if(!p || (j > i))    //判断位置是否合法
 85         return ERROR;
 86     e = p->data;            //取第i个元素
 87     return OK;
 88 }//GetElem
 89
 90 //返回L中第一个与e满足compare()的数据元素的位序,诺不存在则返回ERROR
 91 //compare()是数据元素判定函数
 92 Status LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType,ElemType))
 93 {
 94     int j = 0;
 95     LinkList p = L->next;
 96     while(p)
 97     {
 98         ++j;
 99         if(compare(p->data,e))
100             return j;
101         p = p->next;
102     }
103     return ERROR;
104 }//LocateElem
105
106 //若cur_e是L的数据元素,且不是第一个。则用pre_e返回他的前驱,
107 //否则操作失败,pre_e无定义
108 Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e)
109 {
110     LinkList p = L->next, q;    //p指向第一个结点
111     while(p->next)    //p指的结点有后驱
112     {
113         q = p->next;    //q为p的后驱
114         if(q->data == cur_e)
115         {
116             pre_e = p->data;    //获取前驱数据
117             return OK;
118         }
119         p = q;
120     }
121     return ERROR;
122 }//PriorElem
123
124 //若cur_e是L的数据元素,且不是最后一个。则用next_e返回他的后驱,
125 //否则操作失败,next_e无定义
126 Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e)
127 {
128     LinkList p = L->next;
129     while(p->next)
130     {
131         if(p->data == cur_e)
132         {
133             next_e = p->next->data;    //获取后驱数据
134             return OK;
135         }
136         p = p->next;
137     }
138     return ERROR;
139 }//NextElem
140
141 //在第i个位置之前插入元素e
142 Status ListInsert(LinkList &L, int i, ElemType e)
143 {
144     LinkList p = L;            //p指向第一个结点
145     int j = 0;
146     while (p && j < i-1)    //寻找第i-1个结点
147     {
148         p = p->next;
149         ++j;
150     }
151     if(!p || j > i-1)    //判断位置是否合法
152         return ERROR;
153     LinkList s = (LinkList)malloc(sizeof (LNode));    //创建新结点
154     //插入L中
155     s->data = e;
156     s->next = p->next;
157     p->next = s;
158     return OK;
159 }//ListInsert
160
161 //删除第i个结点,并用e返回其值
162 Status ListDelete(LinkList &L, int i, ElemType &e)
163 {
164     LinkList p = L;
165     int j = 0;
166     while (p->next && j < i-1)    //寻找i-1结点
167     {
168         p = p->next;
169         ++j;
170     }
171     if(!(p->next) || j > i-1)    //位置不合理
172         return ERROR;
173     //删除结点并释放空间
174     LinkList q = p->next;
175     p->next = q->next;
176     e = q->data;
177     free(q);
178     return OK;
179 }//ListDelete
180
181 //依次对L的每个元素调用函数Visit(),一旦失败,则操作失败
182 Status ListTraverse(LinkList L, void (*Visit)(ElemType))
183 {
184     LinkList p = L->next;
185     while(p)
186     {
187         Visit(p->data);
188         p = p->next;
189     }
190     printf("\n");
191     return OK;
192 }//ListTraverse
193
194 //ListTraverse()调用的函数
195 void Visit(ElemType c)
196 {
197     printf("%d ", c);
198 }//Visit

线性表的链式结构的基本操作函数的实现。
参考《数据结构(C语言版)》

时间: 2024-10-07 19:25:09

数据结构-线性表的链式结构的相关文章

数据结构------线性表的链式表示与实现

不多说直接上代码: #include"stdafx.h" #include <stdio.h> #include <stdlib.h> /****************************************************************************** /* 数据类型和常量定义 /***********************************************************************

数据结构--线性表的链式存储结构

一 线性表的链式存储结构 A.链式存储的定义为了表示每个数据元素与直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息图示B链式存储逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域1.数据域:存储数据元素本身2.指针域:存储相邻结点的地址图示C链表中的基本概念1.头结点--链表中的辅助结点,包含指向第一个数据元素的指针(方便插入和删除)2.数据结点--链表中代表数据元素的结点,表现形式为:(数据元素,地址)3.尾节点--链表中的最后一个数据结点,包

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链

数据结构.线性表(2)——链式表

链表(所有元素不考虑相邻位置,哪有空位就到哪里):使用结点存储数据元素,结点的地址可以连续也可以不连续 链表分为单链表/双链表/循环链表. 单链表中一个节点的组成:数据域+指针域,指针于中存放的是是一个指针,指向下一个节点的地址. 1.获得链表第i个数据的算法思路: 1)声明一个结点p指向链表第一个结点,初始化j从1开始: 2)当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1: 3)若到链表末尾p为空,则说明第i个元素不存在: 4)否则查找成功,返回结点p的数据. 2.单链

数据结构——线性表的链式存储结构

创建一个可复用的单链表 1 //结点指针域定义 2 typedef struct _tag_linklistnode linklistnode; 3 4 struct _tag_linklistnode 5 { 6 linklistnode* next; 7 }; 1 //头结点定义 2 typedef struct _tag_linklist 3 { 4 linklistnode header; 5 int length; 6 }tlinklist; 1 //数据元素定义 2 struct v

数据结构-线性表的链式存储相关算法(一)(C语言实现)

链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单遍历 算法思想 创建一个链表,并对链表的数据进行简单的遍历输出. 算法实现 # include <stdio.h> # include <stdlib.h> typedef struct Node { int data;//数据域 struct Node * pNext;//指针域 ,

数据结构之线性表(链式存储结构)

线性表的实现分顺序存储结构和链式存储结构 上一节我们主要介绍了顺序存储结构,在最后我们还分别总结了顺序存储结构的优缺点, 对于顺序结构的缺点,我们有没有什么好的解决方法呢? 我们今天要介绍的线性表的链式存储结构就可以很好的解决顺序结构的缺点,一起来看. 顺序结构最大的缺点就是在进行插入和删除操作的时候,如果插入位置不理想,那么我们需要移动大量的元素,那产生这一问题的原因是什么呢? 仔细分析后,我们可以发现在顺序存储结构中,他们相邻的元素的存储位置也是相邻的,我们在申请内存的的时候,是一次性申请一

【数据结构】-线性表的链式存储结构

引言:由于线性表的顺序存储结构在插入和删除时需要大量移动数据元素,从而引入线性表的链式存储结构. 线性表的链式存储结构:用一组任意的存储单元(可以连续也可以不连续)存储线性表的数据元素. 为了表示数据元素ai和其直接后继ai+1之间的逻辑关系,对ai来说,除了存储其本身的数据信息外,还需要存储其直接后继的存储位置.这两部分信息组成数据元素ai的存储映像(结点).它包含两个域:其中存储数据元素信息的域称为数据域:存储直接后继存储位置的域称为指针域. n个结点链接成一个链表,称为线性链表,由于此链表

数据结构开发(5):线性表的链式存储结构

0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? 链式存储的定义: 为了表示每个数据元素与其直接后继元素之间的逻辑关系:数据元素除了存储本身的信息外,还需要存储其直接后继的信息. 链式存储逻辑结构: 基于链式存储结构的线性表中,每个结点都包含数据域和指针域 数据域:存储数据元素本身 指针域:存储相邻结点的地址 专业术语的统一: 顺序表 基于顺序存储