我是靠谱客的博主 健康红牛,这篇文章主要介绍c语言——线性表,现在分享给大家,希望可以做个参考。

C语言线性表是一个储存方式,比较基础的数据结构

希望下面的代码会对大家有所帮助 

复制代码
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define List_Size 100 //线性表存储空间的初始化配量 #define ListIncrement 10 //线性表存储空间的分配增量 typedef int ElemType; typedef struct{ ElemType *elem;//存放线性表的数组基地址 int length;//线性表的当前长度 int listsize;//线性表当前分配的存储容量 }SqList; int InitList(SqList &L){ L.elem=new ElemType[List_Size]; if(!L.elem)exit(OVERFLOW); L.length=0; L.listsize=List_Size; return OK; } void CreateList(SqList &L,int n){//创建顺序表 int i; for(i=0;i<n;i++){ scanf("%d",&L.elem[i]); L.length++; } } void Deatroy(SqList &L){//销毁顺序表 delete L.elem; } int ListInsert(SqList &L,int i,ElemType x){ int j; ElemType *p; if(i<1||i>L.length)return ERROR;//插入位置不合法 if(L.length>=L.listsize){//当前存储空间已满,增加分配 p=(ElemType *)realloc(L.elem,(L.listsize+ListIncrement)*sizeof(ElemType)); if(!p)exit(OVERFLOW); L.elem=p; L.listsize=L.listsize+ListIncrement; } for(j=L.length-1;j>=i;j--)L.elem[j+1]=L.elem[j];//插入位置之后的元素依次后移 L.elem[i]=x;//插入元素 ++L.length;//表长增1 return OK; } int ListDelete(SqList &L,int i){ int j; if(i<1||i>L.length)return ERROR;//删除位置不合法 for(j=i-1;j<L.length-1;j++)L.elem[j]=L.elem[j+1];//删除位置之后的元素依次前移 --L.length;//表长增1 return OK; } int LocateElem(SqList L,ElemType x){ int i=1; while(i<=L.length&&L.elem[i-1]!=x)i++; if(i<=L.length)return i; else return ERROR; } void DispList(SqList L){//输出顺序表 int i; for(i=0;i<L.length;i++) printf("%d ",L.elem[i]); printf("n"); } void Contrary_sq(SqList La,SqList &Lb){//将顺序表逆置 int i; InitList(Lb); Lb.listsize=Lb.length=La.length; for(i=0;i<La.length;i++)Lb.elem[i]=La.elem[La.length-1-i]; } int Insert_Ordersq(SqList &La,ElemType x){ int i; ElemType *p; if(La.length>=La.listsize){//当前存储空间已满,增加分配 p=(ElemType *)realloc(La.elem,(La.listsize+ListIncrement)*sizeof(ElemType)); if(!p)exit(OVERFLOW); La.elem=p; La.listsize=La.listsize+ListIncrement; } for(i=La.length-1;x<La.elem[i]&&i>=0;i--)La.elem[i+1]=La.elem[i]; La.elem[i+1]=x;//插入元素x ++La.length; return OK; } void mergelist_sq(SqList La,SqList Lb,SqList &Lc){//两个有序表的归并 int i,j,k; InitList(Lc); if(!Lc.elem)exit(OVERFLOW); i=0;j=0;k=0; while(i<La.length&&j<Lb.length){ if(La.elem[i]<=Lb.elem[j]) Lc.elem[k++]=La.elem[i++]; else Lc.elem[k++]=Lb.elem[j++]; } while(i<La.length)Lc.elem[k++]=La.elem[i++];//将La中剩余元素插入到Lc中 while(j<Lb.length)Lc.elem[k++]=Lb.elem[j++];//将Lb中剩余元素插入到Lc中 Lc.length=La.length+Lb.length; } int main(){ SqList L,La,Lb,Lc; int i=4; ElemType x=100; InitList(L); //建空表 CreateList(L,5); //创建表 ListInsert(L,i,x); DispList(L); ListDelete(L,i); DispList(L); printf("%dn",LocateElem(L,x)); Contrary_sq(L,Lb); DispList(Lb); InitList(La); CreateList(La,5); x=4; Insert_Ordersq(La,x); DispList(La); InitList(La); CreateList(La,5); DispList(La); InitList(Lb); CreateList(Lb,3); DispList(Lb); mergelist_sq(La,Lb,Lc); DispList(Lc); return 0; } 双向链表 # include <stdlib.h> # include <stdio.h> # define OK 1 # define OVERFLOW -1 # define ERROR 0 typedef int ElemType;/ typedef struct DuLNode { ElemType data; // 数据域 struct DuLNode *prior; //指向前驱的指针域 struct DuLNode *next; //指向后继的指针域 }DuLNode,*DuLinkList; void LinkListInit(DuLinkList &L){ L=new DuLNode; if(!L)exit(OVERFLOW); L->next=L->prior=NULL; } DuLNode *GetElem_L(DuLinkList L,int i){//在带头结点的双向链表L中查找第i个结点,找到返回该结点,否则返回空 DuLNode *p; p=L->next; int j=1; //p指向第一个结点,j为计数器 while(p!=L&&j<i){p=p->next; ++j;} //顺指针向后查找,直到p指向第i个元素或p为空 if(j==i)return p; //第i个元素存在 else return NULL; //第i个元素不存在 } int ListInsert_L(DuLinkList &L,int i,ElemType x){//在双向链表L中第i个位置之前插入元素x DuLNode *p,*s; p=GetElem_L(L,i-1); if(!p)return ERROR; s=new DuLNode; //生成新结点 s->data=x; if(p->next){ p->next->prior=s; s->next=p->next; s->next->prior=p; p->next=s; } else{//插入在L尾部的处理 s->next=p->next; p->next=s; s->prior=p; } return OK; } int ListDelete_L(DuLinkList &L,int i){ DuLNode *p,*q; p=GetElem_L(L,i-1); if(!p)return ERROR; //删除位置不合理 if(p->next->next){ q=p->next; q->next->prior=p; p->next=q->next; //删除并释放结点 } else{//删除尾部结点 q=p->next; p->next=NULL; q->prior=NULL; } delete q; return OK; } void CreateList_L(DuLinkList &L,int n) {//逆序输入n个数据元素,建立带头结点的双向链表 DuLNode *p; LinkListInit(L); //建立空表 for(int i=n; i>0; --i){ p=new DuLNode;//新增结点 scanf("%d",&p->data); //输入元素值 p->next=L->next; p->prior=L; L->next=p; } } void DispList_L(DuLinkList L) { DuLNode *p; for(p=L->next;p;p=p->next)printf("%d ",p->data); printf("n"); } //void CreateList_L(DuLinkList &L,int n){ // DuLNode *p,*r; // LinkListInit(L); //建立空表 // r=L; //r始终指向表尾结点 // for(int i=1; i<=n; i++){ // p=new DuLNode; // scanf("%d",&p->data); //输入元素值 // r->next=p; //插入到表尾 // r=p; // } // r->next=NULL; //} int main(){ DuLinkList L; DuLNode *p; CreateList_L(L,5); DispList_L(L); // p=GetElem_L(L,3); // if(p!=NULL)printf("%dn",p->data); ListInsert_L(L,6,10); DispList_L(L); ListDelete_L(L,6); DispList_L(L); return 0; }

最后

以上就是健康红牛最近收集整理的关于c语言——线性表的全部内容,更多相关c语言——线性表内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(116)

评论列表共有 0 条评论

立即
投稿
返回
顶部