加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C线性表的链式存储实现步骤及代码

发布时间:2020-12-15 04:55:20 所属栏目:百科 来源:网络整理
导读:线性表的链式存储 链式结构存储密度小,存储空间利用率低 只能顺序存储(其中指针域用来表明节点间的关系) 插入和删除操作方便 初始化线性表 InitList(L) 销毁线性表 DestoryList(L) 判断线性表是否为空 ListEmpty(L) 求线性表的长度 ListLength(L) 输出线性

线性表的链式存储

链式结构存储密度小,存储空间利用率低

只能顺序存储(其中指针域用来表明节点间的关系)

插入和删除操作方便

初始化线性表 InitList(L)

销毁线性表 DestoryList(L)

判断线性表是否为空 ListEmpty(L)

求线性表的长度 ListLength(L)

输出线性表 DispList(L)

求线性表中某个数据元素值 GetElem(L,i,e)

按元素值查找 LocateElem(L,e)

插入数据元素 ListInsert(L,e)

删除数据元素 ListDelete(L,e)

代码如下:

1 #include

2 #include

3 typedef int ElemType;

4

5 typedef struct LNode {

6 ElemType data;

7 struct LNode *next;

8 } LinkList;

9

10 /*建立单链表*/

11 /*头插法*/

12 void CreateListF(LinkList* &L,ElemType a[],int n) {

13 L = (LinkList *)malloc(sizeof(LinkList));

14 L -> next = NULL;

15

16 int i;

17 LinkList *s;

18 for(i = 0; i < n; i++) {

19 s = (LinkList *)malloc(sizeof(LinkList));

20 s -> data = a[i];

21 s -> next = L -> next;

22 L -> next = s;

23 }

24 }

25

26 /*尾插法*/

27 void CreateListR(LinkList* &L,int n) {

28 L = (LinkList *)malloc(sizeof(LinkList));

29 L -> next = NULL;

30

31 LinkList *p;//指针 p 来进行操作

32 p = L;

33

34 LinkList *s;

35 int i;

36 for(i = 0; i < n; i++) {

37 s = (LinkList *)malloc(sizeof(LinkList));

38 s -> data = a[i];

39 p -> next = s;

40 p = s;

41 }

42 p -> next = NULL;

43 }

44

45 /*基本运算*/

46 /*初始化线性表 InitList(L)*/

47 void InitList(LinkList* &L) {

48 L = (LinkList *)malloc(sizeof(LinkList));

49 L -> next = NULL;

50 }

51

52 /*销毁线性表 DestoryList(L)*/

53 void DestoryList(LinkList* &L) {

54 LinkList *pre = L;

55 LinkList *p = L -> next;

56

57 while(p != NULL) {

58 free(pre);

59 pre = p;

60 p = p -> next;

61 }

62

63 free(pre);

64 }

65

66 /*判断线性表是否为空 ListEmpty(L)*/

67 bool ListEmpty(LinkList* L) {

68 return L -> next == NULL;

69 }

70

71 /*求线性表的长度 ListLength(L)*/

72 int ListLength(LinkList* L) {

73 LinkList *p = L;

74 int i = 0;

75

76 while(p -> next != NULL) {

77 p = p -> next;

78 i++;

79 }

80

81 return i;

82 }

83

84 /*输出线性表 DispList(L)*/

85 void DispList(LinkList* L) {

86 LinkList *p = L -> next;

87

88 while(p != NULL) {

89 printf("%d ",p -> data);

90 p = p -> next;

91 }

92

93 printf("n");

94 }

95

96 /*求线性表中某个数据元素值 GetElem(L,e)*/

97 bool GetElem(LinkList* L,int i,ElemType &e) {

98 LinkList *p = L;

99

100 int k = 0;

101 while(k < i && p != NULL) {

102 k++;

103 p = p ->next;

104 }

105

106 if (p == NULL) {

107 return false;

108 } else {

109 e = p -> data;

110 return true;

111 }

112 }

113

114 /*按元素值查找 LocateElem(L,e)*/

115 int LocateElem_wq(LinkList* L,ElemType e) {

116 LinkList *p = L;

117

118 int k = 0;

119 while(p != NULL) {

120 if (e == p -> data) {

121 return k;

122 }

123 p = p -> next;

124 k++;

125 }

126

127 return 0;

128 }

129

130 int LocateElem(LinkList* L,ElemType e) {

131 LinkList *p = L -> next;

132

133 int k = 1;

134 while(p != NULL && e != p -> data) {

135 p = p -> next;

136 k++;

137 }

138

139 if (p == NULL) {

140 return 0;

141 } else {

142 return k;

143 }

144 }

145

146 /*插入数据元素 ListInsert(L,e)*/

147 bool ListInsert(LinkList* &L,ElemType e) {

148 LinkList *p = L;

149

150 int k = 0;

151 while(k < i - 1 && p != NULL) {//找到前驱节点

152 p = p -> next;

153 k++;

154 }

155

156 if (p == NULL) {

157 return false;

158 } else {

159 LinkList *s;

160 s = (LinkList *)malloc(sizeof(LinkList));

161 s -> data = e;

162 s -> next = p -> next;

163 p -> next = s;

164 return true;

165 }

166 }

167

168 /*删除数据元素 ListDelete(L,e)*/

169 bool ListDelete_wq(LinkList* &L,ElemType &e) {

170 LinkList *pre = L;//保存第 i 个指针的前驱

171 LinkList *p = L -> next;//保存第 i 个指针的位置

172

173 int k = 1;

174 while(k < i && p != NULL) {

175 pre = pre -> next;

176 p = p -> next;

177 k++;

178 }

179

180 if (p == NULL) {

181 return false;

182 } else {

183 e = p ->data;

184 pre -> next = p -> next;

185 free(p);

186 return true;

187 }

188 }

189

190 bool ListDelete(LinkList* &L,ElemType &e) {

191 LinkList *pre = L;//保存第 i 个指针的前驱

192

193 int k = 0;

194 while(k < i - 1 && pre != NULL) {

195 pre = pre -> next;

196 k++;

197 }

198

199 if (pre == NULL) {

200 return false;

201 } else {

202 LinkList *p;

203 p = pre -> next;

204 if (p == NULL) {

205 return false;

206 }

207 e = p -> data;

208 pre -> next = p -> next;

209 free(p);

210 return true;

211 }

212 }

213

214 int main(int argc,char const *argv[]) {

215 int a[] = {1,2,3,4,5,6,7,8,9};

216 LinkList *L;

217 InitList(L);

218 //CreateListR(L,a,9);

219 CreateListF(L,9);

220 DispList(L);

221 printf("length = %dn",ListLength(L));

222 ElemType e;

223 GetElem(L,e);

224 printf("fourth number = %dn",e);

225 printf("%d is located at %dn",e,LocateElem_wq(L,6));

226 ListInsert(L,10);

227 DispList(L);

228 ListDelete_wq(L,e);

229 DispList(L);

230 return 0;

231 }

加号求调戏

这儿是运行结果哦:

9 8 7 6 5 4 3 2 1

length = 9

fourth number = 6

6 is located at 4

9 10 8 7 6 5 4 3 2 1

9 8 7 6 5 4 3 2 1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读