参考价值: 未完善、有错误、但方法连接没有错误可以拷贝使用


1
2
3
4
5
6
7
8
9
operation
InitList(L):初始化操作,建立一个空的线性表L。
ListEmpty(L):若线性表为空,返回true,否则返回false
ClearList(*L):将线性表清空。
GetElem(L,i,*e):将线性表L的第i个位置元素返回给e。
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中的序号表示成功,否则,返回0表示失败。
ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e。
ListDelet(*L,i,*e):删除线性表L中第i个位置的元素,并用e返回其值。
ListLength(L):返回线性表L的元素个数。
方法&链接
初始化线性表(顺序结构)
判断线性表是否为空(顺序结构)
线性表的插入(顺序结构)
查找线性表中是否有某元素(顺序结构)
清空线性表(顺序结构)
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
/*
这个程序要完成以下任务:
1.定义线性表类型的对象L和Lb
2.初始化线性表L,并输出其长度。
3.在表头依次插入1~5,输出其长度,并判断L是否为空。
4.清空L,输出其长度,并判断其是否为空。
5.在表尾依次插入1~10,依次输出L的元素和它的长度。
6.在表头插入0,依次输出L的元素和它的长度。
7.输出第五个元素的值;
判断元素3在不在L中,若在,则输出其位置,若不在,则输出”没有该元素“;
依次输出L的元素。
8.删除第5个元素,输出其值,并依次输出L的元素。
9.初始化线性表Lb,并将6~15依次插入到表尾。
10.求L与Lb的并集并将并集赋值给L,并输出Lb。
*/
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FAlSE 0

#define MAXSIZE 20
typedef int ElemType;//ElemType是线性表中数据元素的类型,是抽象数据类型。
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
typedef int Status;//Status是函数的类型,也是抽象数据类型。
//初始化顺序线性表
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
//判断顺序线性表是否为空,
Status ListEmpty(SqList L)
{
if(L.length==0)
return TRUE;
else
return FALSE;
}
//将顺序线性表重置为空表
Status ClearList(SqLIst *L)
{
L->length=0;//将线性表重置为空表
return OK;
}
//获取顺序线性表中第i个元素并把值赋给e
Status GetElem(SqList L,int i,ElemType *e){
if(L.length==0||i<1||i>L.length)//判断i是否合法
return ERROR;

*e=L.data[i-1];//将第i个数据元素赋值给e。

return OK;
}
//求e在顺序线性表中的位置
Status LocateList(SqList L,ElemType e)
{
int i;
if(L.length==0)//判断线性表是否为空
return ERROR;
//在线性表中寻找数据元素e,并获取其位置
for(i=0;i<L.length;i++)
{
if(L.data[i]==e)
break;
}
//返回数据元素e在线性表的位置
return i+1;
}
//将数据元素e插入到数据表L的第i个位置之前
Status ListInsert(SqList *L,int i,ElemType e)
{
int k;
if(L->length == MAXSIZE)//判断线性表是否已满
return ERROR;
if(i < 1 ||i > L->length+1)//判断i是否有效
return ERROR;
//将第i位空出
if(i <= L.length){
for(k = L->length-1; k >= i-1; k--)
L->data[k+1]=L->data[k];
}
//填充第i位的元素
L->data[i-1]=e;
//线性表长度+1
L->length++;
return OK;
}
//删除线性表中的第i个数据元素,并用e返回其值
Status ListDelete(SqList *L, int i, ElemType *e){
int k;
//判断方法是否有意义
if(L->length == 0 || i < 1 || i > L->length)
return ERROR;
//用e返回第i个元素的值
*e = L->data[i - 1];
//删除第i个元素,并将后面的元素前移
for(k = i;k < L->length;k++)
L->data[k-1] = L->data[k]
//线性表长度-1
L->length--;
return OK;
}
Status ListTraverse(SqList L){
int i;
for(i=0; i<L.length;i++){
visit(L.data[i]);
}
printf("\n");
return OK;
}
Status visit(ElemType c){
printf("%d",c);
return OK;
}
void unionL(SqList *La,SqList Lb){
int La_len,Lb_len,i;
Elemtype e;
La_len = La->length;
Lb_len = Lb.length;

for(i=1; i <= Lb_len; i++){
GetElem(Lb, i, &e);
if(!LocateElem(*La, e))
ListInsert(La,++La_len,e);
}
}
int main()
{
SqList L;//定义一个线性表类型的对象L(虽然C语言中不这么叫,但我还是习惯性地称之为对象(调皮))
SqList Lb;//定义另一个线性表对象Lb

ElemType e;
Status i;
int j,k;

/* 初始化线性表L,并输出其长度。*/
i=InitList(&L);
printf("初始化L后:L.length=%d\n",L.length);

/* 在表头依次插入1~5,输出其长度,并判断L是否为空。*/
for(j=1;j<=5;j++)
i=LIstInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);

/* 清空L,输出其长度,并判断其是否为空。*/
i=ClearList(&L);
printf("清空L后,L.length=%d \n",L.length);
i=ListEmpty(L);
printf("L是否为空:i=%d(1:是 0:否)\n",i);

/* 在表尾依次插入1~10,依次输出L的元素和它的长度。*/
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf("在L的表尾依次插入1~10后:L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);

/* 在表头插入0,依次输出L的元素和它的长度。*/
ListInsert(&L,1,0);
printf("在表头插入0后:L.data=");
ListTraverse(L);
printf("L.length=",L.length);

/* 输出第五个元素的值;
判断元素3在不在L中,若在,则输出其位置,若不在,则输出”没有该元素“;
依次输出L的元素。*/
GetElem(L,5,&e);
printf("第五个元素的值为:%d",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d个元素的值为%d\n",k,j);
else
printf("没有值为%d的元素\n",j);
}
printf("依次输出表L的元素:");
ListTraverse(L);

/* 删除第5个元素,输出其值,并依次输出L的元素。*/
j=5;
ListDelet(&L,j,&e);
printf("删除第%d个元素值为:%d\n",j,e);
printf("依次输出L的元素:");
ListTraverse(L);

/* 初始化线性表Lb,并将6~15依次插入到表尾。*/
i=InitList(&Lb);
for(j=6;j<=15;j++)
i=ListInsert(&Lb,1,j);

unionL(&L,Lb);//求L与Lb的并集并将并集赋值给L。

printf("依次输出合并了Lb的L的元素:");
ListTraverse(L);

return 0;
}