C语言线性表的顺序表示与实现实例详解

2025-05-27 0 80

1.概述

通常来说顺序表是在计算机的内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储数据元素的线性数据结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构就是顺序结构。

采用顺序存储结构的线性表简称为“ 顺序表”。顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L  1≤i≤n 其中,L是元素占用存储单元的长度。如顺序表的每个结点占用len个内存单元,用location (ki)表示顺序表中第i个结点ki所占内存空间的第1个单元的地址。则有如下的关系:location (ki+1) = location (ki) +len

location (ki) = location(k1) + (i-1)len

存储结构要体现数据的逻辑结构,顺序表的存储结构中,内存中物理地址相邻的结点一定具有顺序表中的逻辑关系。

2.基本操作

?

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

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201
/* c2-1.h 线性表的动态分配顺序存储结构 */

#define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */

#define LISTINCREMENT 2 /* 线性表存储空间的分配增量 */

typedef struct

{

ElemType *elem; /* 存储空间基址 */

int length; /* 当前长度 */

int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */

}SqList;

/* bo2-1.c 顺序表示的线性表(存储结构由c2-1.h定义)的基本操作(12个) */

Status InitList(SqList *L) /* 算法2.3 */

{ /* 操作结果:构造一个空的顺序线性表 */

(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!(*L).elem)

exit(OVERFLOW); /* 存储分配失败 */

(*L).length=0; /* 空表长度为0 */

(*L).listsize=LIST_INIT_SIZE; /* 初始存储容量 */

return OK;

}

Status DestroyList(SqList *L)

{ /* 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L */

free((*L).elem);

(*L).elem=NULL;

(*L).length=0;

(*L).listsize=0;

return OK;

}

Status ClearList(SqList *L)

{ /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */

(*L).length=0;

return OK;

}

Status ListEmpty(SqList L)

{ /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */

if(L.length==0)

return TRUE;

else

return FALSE;

}

int ListLength(SqList L)

{ /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */

return L.length;

}

Status GetElem(SqList L,int i,ElemType *e)

{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:用e返回L中第i个数据元素的值 */

if(i<1||i>L.length)

exit(ERROR);

*e=*(L.elem+i-1);

return OK;

}

int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))

{ /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */

/* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */

/* 若这样的数据元素不存在,则返回值为0。算法2.6 */

ElemType *p;

int i=1; /* i的初值为第1个元素的位序 */

p=L.elem; /* p的初值为第1个元素的存储位置 */

while(i<=L.length && !compare(*p++,e))

++i;

if(i<=L.length)

return i;

else

return 0;

}

Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)

{ /* 初始条件:顺序线性表L已存在 */

/* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */

/* 否则操作失败,pre_e无定义 */

int i=2;

ElemType *p=L.elem+1;

while(i<=L.length && *p!=cur_e)

{

p++;

i++;

}

if(i>L.length)

return INFEASIBLE;

else

{

*pre_e=*--p;

return OK;

}

}

Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)

{ /* 初始条件:顺序线性表L已存在 */

/* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */

/* 否则操作失败,next_e无定义 */

int i=1;

ElemType *p=L.elem;

while(i<L.length && *p!=cur_e)

{

i++;

p++;

}

if(i==L.length)

return INFEASIBLE;

else

{

*next_e=*++p;

return OK;

}

}

Status ListInsert(SqList *L,int i,ElemType e) /* 算法2.4 */

{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1 */

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */

ElemType *newbase,*q,*p;

if(i<1||i>(*L).length+1) /* i值不合法 */

return ERROR;

if((*L).length>=(*L).listsize) /* 当前存储空间已满,增加分配 */

{

newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType));

if(!newbase)

exit(OVERFLOW); /* 存储分配失败 */

(*L).elem=newbase; /* 新基址 */

(*L).listsize+=LISTINCREMENT; /* 增加存储容量 */

}

q=(*L).elem+i-1; /* q为插入位置 */

for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之后的元素右移 */

*(p+1)=*p;

*q=e; /* 插入e */

++(*L).length; /* 表长增1 */

return OK;

}

Status ListDelete(SqList *L,int i,ElemType *e) /* 算法2.5 */

{ /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */

ElemType *p,*q;

if(i<1||i>(*L).length) /* i值不合法 */

return ERROR;

p=(*L).elem+i-1; /* p为被删除元素的位置 */

*e=*p; /* 被删除元素的值赋给e */

q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */

for(++p;p<=q;++p) /* 被删除元素之后的元素左移 */

*(p-1)=*p;

(*L).length--; /* 表长减1 */

return OK;

}

Status ListTraverse(SqList L,void(*vi)(ElemType*))

{ /* 初始条件:顺序线性表L已存在 */

/* 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败 */

/* vi()的形参加'&',表明可通过调用vi()改变元素的值 */

ElemType *p;

int i;

p=L.elem;

for(i=1;i<=L.length;i++)

vi(p++);

printf("\\n");

return OK;

}

/* algo2-1.c 实现算法2.1的程序 */

#include"c1.h"

typedef int ElemType;

#include"c2-1.h" /* 采用线性表的动态分配顺序存储结构 */

#include"bo2-1.c" /* 可以使用bo2-1.c中的基本操作 */

Status equal(ElemType c1,ElemType c2)

{ /* 判断是否相等的函数,Union()用到 */

if(c1==c2)

return TRUE;

else

return FALSE;

}

void Union(SqList *La,SqList Lb) /* 算法2.1 */

{ /* 将所有在线性表Lb中但不在La中的数据元素插入到La中 */

ElemType e;

int La_len,Lb_len;

int i;

La_len=ListLength(*La); /* 求线性表的长度 */

Lb_len=ListLength(Lb);

for(i=1;i<=Lb_len;i++)

{

GetElem(Lb,i,&e); /* 取Lb中第i个数据元素赋给e */

if(!LocateElem(*La,e,equal)) /* La中不存在和e相同的元素,则插入之 */

ListInsert(La,++La_len,e);

}

}

void print(ElemType *c)

{

printf("%d ",*c);

}

int main()

{

SqList La,Lb;

Status i;

int j;

i=InitList(&La);

if(i==1) /* 创建空表La成功 */

for(j=1;j<=5;j++) /* 在表La中插入5个元素 */

i=ListInsert(&La,j,j);

printf("La= "); /* 输出表La的内容 */

ListTraverse(La,print);

InitList(&Lb); /* 也可不判断是否创建成功 */

for(j=1;j<=5;j++) /* 在表Lb中插入5个元素 */

i=ListInsert(&Lb,j,2*j);

printf("Lb= "); /* 输出表Lb的内容 */

ListTraverse(Lb,print);

Union(&La,Lb);

printf("new La= "); /* 输出新表La的内容 */

ListTraverse(La,print);

  return 0;

}

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C语言线性表的顺序表示与实现实例详解 https://www.kuaiidc.com/75944.html

相关文章

发表评论
暂无评论