0%

c-线性表

1. 创建线性表的结构体

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#define maxsize 1024 //线性表的最大长度
typedef int datatype;
//typedef 为C语言的关键字,作用是为一种数据类型定义一个新的名字,
//这种数据类型包括内部数据类型和自定义数据类型
//1. 创建结构体
typedef struct
{
datatype data[maxsize];
int last;
}sequenlist;//结构体名

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
//2. 取节点 
datatype get(sequenlist *L,int i)
{
return (*L).data[i-1];
}
//3. 表的长度
int length(sequenlist *L)
{
return (*L).last+1;
}
//4. 删除线性表L的第i个结点即删除下标为i-1的结点
int Delete(sequenlist *L,int i)
{
int j;
if(i<1||i>length(L))
{
printf("eror!");
return 0;
}
else
{
for(j=i;j<length(L);j++)
(*L).data[j-1]=(*L).data[j];
(*L).last=(*L).last-1;
}
return 1;
}
//5.在线性表L的第i个位置插入一个值为x的新结点
bool insert(sequenlist *L,int x,int i)
{
int j;
if(((*L).last)>=maxsize-1)
{
printf("overflow");
return false;
}
else
if((i<1)||(i>(*L).last+1))
{
printf("error");
return false;
}
else
{
for(j=(*L).last;j>=i-1;j--)
(*L).data[j+1]=(*L).data[j];
(*L).data[i-1]=x;
(*L).last++;
}
return true;
}
//6. 定位
int locate(sequenlist *L,int x)
{
for(int i=0;i<(*L).last+1;i++)
{
if((*L).data[i]==x)
return i+1;
}
return 0;
}
//6.清除表L中多余重复的结点
void purge(sequenlist *L)
{
int i=1,j,x,y;
while(i<length(L))
{
x=get(L,i);
j=i+1;
while(j<length(L))
{
y=get(L,j);
if(x==y)
Delete(L,j);
else
j++;
}
i++;
}
}
//7. 将表中的数据逆置
void reverse(sequenlist *L)
{
int i=0,j=(*L).last,t=0;
while(i<=length(L)/2)
{

t=(*L).data[i];
(*L).data[i]=(*L).data[j];
(*L).data[j]=t;
i++;
j--;
}
}
//8. 打印顺序表
void print(sequenlist *L)
{
int i=0;
while(i<length(L))
{
printf("%d ",(*L).data[i]);
i++;
}
printf("\n");
}

3.主函数设计

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
//主函数 
int main()
{
sequenlist sl={{1,2,3,4,5,6,7,8,9,10},9};//直接给顺序表赋初值
sequenlist *L;/*定义一个指向顺序表类型的指针变量*/
L=&sl;
printf("original:\n");
print(L);
printf("length:\n");
printf("%d\n",length(L));//长度
printf("reverse:\n");
reverse(L);//逆置
print(L);
printf("delete position two:\n");
Delete(L,2); //删除
print(L);
printf("inser position two and add data is eight:\n");
insert(L,8,2);//插入使其出现重复项
print(L);
printf("purge:\n");
purge(L);
print(L);
printf("eight locate:\n");
printf("%d",locate(L,8));
return 0;
}

4. 测试结果