数据结构:静态链表[通俗易懂]

数据结构:静态链表[通俗易懂]首先我们让数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每一个下标都对应一个data和一个cur。数据域data用来存放数据元素,也就是通常我们要处理的数据;而游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。我们把这种用数组描述的链表叫做静态链表。数组的第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

首先我们让数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每一个下标都对应一个data和一个cur。

数据域data用来存放数据元素,也就是通常我们要处理的数据;而游标cur相当于单链表中的next指针,

存放该元素的后继在数组中的下标。我们把这种用数组描述的链表叫做静态链表。

数组的第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur

则存放第一个有数值的元素的下标,相当于单链表的头节点作用,当整个链表为空时,则为0,表示无指向。如图3-12-2所示


现在如果我们需要在“乙”和“丁”之间插入一个值为“丙”的元素,只需要将“乙”的cur改为7,表示下一位是“丙”,并将“丙”的cur改为3,表示下一位是丁。

如图3-12-3所示。

现在如果我们删除了第一个元素“甲”,表示现在“甲”这个位置空出来了,如果未来有新人要来则优先考虑这里,所以删除的位置成为第一个优先空位,即首元素的cur为1, 第一个元素位置的cur改为8,而下标为8的位置cur改为9,最后元素位置的cur改为2,如图3-12-4所示。

数据结构:静态链表[通俗易懂]

数据结构:静态链表[通俗易懂]数据结构:静态链表[通俗易懂]

示例代码:(改编自《大话数据结构》)

 C++ Code 
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

#include<iostream>


using 
namespace std;

#define MAXSIZE 
100

typedef 
int ElemType;


/* 线性表的静态链表存储结构 */


typedef 
struct Node

{

    ElemType data;

    
int cur; 
//为0时表示无指向
} StaticLinkList[MAXSIZE];

/* 将一维数组array中各分量链成一个备用链表,array[0].cur为头指针,”0″表示空指针 */


bool InitList(StaticLinkList array)

{

    cout << 
“InitList…” << endl;

    
for (
int i = 
0; i < MAXSIZE – 
2; i++)

    {

        array[i].cur = i + 
1;

    }


    
array[MAXSIZE – 
2
].cur = 
0
;  
/* 最后一个元素也是不可用的,倒数第二个元素的cur为0 */

    array[MAXSIZE – 
1].cur = 
0;   
/* 目前静态链表为空,最后一个元素的cur为0 */

    
return 
true;

}


/* 若备用空间链表非空,则返回分配的结点下标,否则返回0 */


int Malloc_SLL(StaticLinkList array)

{

    
int k = array[
0].cur;

    
if (k)

        array[
0].cur = array[k].cur;
/* 下一个分量用来做备用 */

    
return k;

}


/*  将下标为pos的空闲结点回收到备用链表 */


void Free_SLL(StaticLinkList array, 
int pos)

{

    array[pos].cur = array[
0].cur; 
/* 把第一个元素的cur值赋给要删除的分量cur */

    array[
0].cur = pos; 
/* 把要删除的分量下标赋值给第一个元素的cur */

}

int ListLength(StaticLinkList array)

{

    
int i = array[MAXSIZE – 
1].cur;

    
int j = 
0;

    
while(i)

    {

        i = array[i].cur;

        ++j;

    }

    
return j;

}


/*  在array中第pos个元素之前插入新的数据元素Elem  */


bool ListInsert(StaticLinkList array, 
int pos, ElemType Elem)

{

    cout << 
“Insert List from pos: “ << pos << 
” Item “ << Elem << endl;

    
if (pos < 
1 || pos > ListLength(array) + 
1)

        
return 
false;

    
int k = MAXSIZE – 
1;

    
int i = Malloc_SLL(array); 
/* 获得空闲分量的下标 */

    
if (i)

    {

        array[i].data = Elem;

        
for (
int l = 
1; l <= pos – 
1; l++)

            k = array[k].cur;

        array[i].cur = array[k].cur;
/* 把第pos个元素之前的cur赋值给新元素的cur */

        array[k].cur = i;
/* 把新元素的下标赋值给第pos个元素之前元素的cur */

        
return 
true;

    }

    
return 
false;

}


/*  删除在array中第pos个数据元素   */


bool ListDelete(StaticLinkList array, 
int pos)

{

    cout << 
“Delete List from pos: “ << pos << endl;

    
if (pos < 
1 || pos > ListLength(array))

        
return 
false;

    
int k = MAXSIZE – 
1;

    
for (
int l = 
1; l <= pos – 
1; l++)

        k = array[k].cur;

    
int j = array[k].cur;

    array[j].cur = array[pos].cur;

    Free_SLL(array, j);

    
return 
true;

}

bool ListTraverse(StaticLinkList array)

{

    cout << 
“List Traverse : “ << endl;

    
int k = MAXSIZE – 
1;

    
while (array[k].cur != 
0)

    {

        k = array[k].cur;

        cout << array[k].data << 
‘ ‘;

    }

    cout << endl;

    
return 
true;

}


int main(
void)

{

    StaticLinkList SSL;

    InitList(SSL);

    
for (
int i = 
1; i < 
5; i++)

        ListInsert(SSL, i, i);

    ListTraverse(SSL);

    ListDelete(SSL, 
3);

    ListTraverse(SSL);

    cout << 
“List Length : “ << ListLength(SSL) << endl;

    
return 
0;

}

输出为:

数据结构:静态链表[通俗易懂]


静态链表在插入和删除操作时不需要移动元素,只需要修改游标,从而改进了在顺序存储结构中插入和删除操作需要移动

大量元素的缺点;但并没有解决连续分配存储带来的表长难以确定的问题;并且失去了顺序存储结构随机存取的特性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/222409.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • net开发高级面试题2021_net面试题2021

    net开发高级面试题2021_net面试题2021文章目录1.NET/dotnetcore/.NETframework的关系2.corefx,coreclr都是什么?3.asp.netcore3.1Kestrel3.2asp.netcore主要的特性3.3startupclass的作用?3.4Startupclass的configservice方法有什么作用?3.5startupclass的configure方法有什么作用?3.6什么是metapackages?3.7什么是中间件?3.8application

  • 心脏出血漏洞利用「建议收藏」

    心脏出血漏洞利用「建议收藏」0x0引言~心脏出血(英语:Heartbleed),也简称为心血漏洞,是一个出现在加密程序库OpenSSL的安全漏洞,该程序库广泛用于实现互联网的传输层安全(TLS)协议。它于2012年被引入了软件中,2014年4月首次向公众披露。只要使用的是存在缺陷的OpenSSL实例,无论是服务器还是客户端,都可能因此而受到攻击。此问题的原因是在实现TLS的心跳扩展时没有对输入进行适当验证(缺少边界检查),…

  • pycharm如何设置快捷键「建议收藏」

    pycharm如何设置快捷键「建议收藏」pycharm中默认ctrl+d是复制一行,这和jupyter完全不一样,我比较喜欢的是:ctrl+d:删除一行ctrl+c:复制一行所以想要将pycharm进行修改。我们以ctrl+d:删除一行为例。找到如下:点击那一行。然后弹出如下对话框:我们不需要删除,直接按快捷键ctrl+d,自动更换为ctrl+d。此时会说和其他快捷键冲突了,没事,删除其他快捷键即可,那些都是一些不常用的。然后,我们可以删除以前的那个快捷键。完成…

  • linux 主机支持远程唤醒_Linux远程开机

    linux 主机支持远程唤醒_Linux远程开机一,什么情况下需要远程开机?如果我们的服务器没有部署在本地(实际上通常都是这样的,我们会把服务器托管到IDC机房),而且服务器在机房中不止一台,其中一台被关闭时,则我们可以远程连接一台没有关机的服务器上,然后进行远程开机.二,远程开机需要的软件它需要wakeonlan这个软件,从何处得到它?它的官方站是:http://sourceforge.net/projects/wake-on-lan/如果使…

  • Promise的含义和用法「建议收藏」

    Promise的含义和用法「建议收藏」含义Promise是异步编程的一种解决方案。Promise对象有以下2个特点:1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其…

  • navicat连接mysql时出现2003(10060)错误

    navicat连接mysql时出现2003(10060)错误

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号