顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表
/* Note:Your choice is C IDE */
#include "stdio.h"
#define MAXSIZE 100
typedef struct /*结构体的格式*/
{
int data[MAXSIZE];
int last;
}Seqlist; /*顺序表的名称*/
定义在主函数定义一个指向这个顺序表的指针:Seqlist L*;然后定义一个函数来初始化这个顺序表,初始化即构造一个空表,将L设为指针参数,动态分配空间。初始化函数代码如下:
Seqlist *init()
{
Seqlist *L;
L=(Seqlist *)malloc(sizeof(Seqlist));
L->last=-1;
return L;
}
一切预备工作已经做好了,这个last表示此表中最后一个的位置,L->data[0]~L->data[L->last]就是所有数据的长度,现在要创建一个可以手动输入你想要的数据到顺序表里面的函数,设这个函数名为intsert();
intsert(Seqlist *L,int i,int x)
{
int j;
for(j=L->last;j>=i-1;j++)
L->data[j+1]=L->data[j];
L->data[i-1]=x;
L->last++;
return 1;
}
如果你想要输入8个数据到顺序表,与主函数联合起来,代码如下:
/* Note:Your choice is C IDE */
#include "stdio.h"
#define MAXSIZE 100
typedef struct
{
int data[MAXSIZE];
int last;
}Seqlist;
Seqlist *init();
insert(Seqlist *L,int i,int x);
main()
{
int x,i;
Seqlist *L;
L=init();
for(i=1;i<=8;i++)
{
scanf("%d",&x);
insert(L,i,x);
}
printf("写入成功!");
}
insert(Seqlist *L,int i,int x)
{
int j;
for(j=L->last;j>=i-1;j++)
L->data[j+1]=L->data[j];
L->data[i-1]=x;
L->last++;
}
Seqlist *init()
{
Seqlist *L;
L=(Seqlist *)malloc(sizeof(Seqlist));
L->last=-1;
return L;
}
我们可以输入,但是不知道有没有输入成功,可以写个输出的函数:
void print(Seqlist *L)/*输出函数*/
{
int i;
if(L->last==-1)
printf("null!!");
else
{
for(i=0;i<=L->last;i++)
printf("| %d",L->data[i]);
}
同样的还有删除顺序表任意元素的函数:
int Delete(Seqlist *L,int i)
{
int j;
if(i<1||i>L->last+1)
{
printf("不存在第i个元素!");
return 0;
}
for(j=i;j<=L->last;j++)
L->data[j-1]=L->data[j];
L->last--;
}
查看任意元素的位置并返回位置:
Location(Seqlist *L,int x)
{
int i=0;
while(i<=L->last&&L->data[i]!=x)
i++;
if(i++>L->last)
return -1;
else
return i;
}
选择在哪个位置增加函数并不破坏顺序表:
add(Seqlist *L,int x,int i)
{
int j;
if(i>L->last+1)
printf("超出范围!");
else
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];
L->data[i-1]=x;
}
在某个位置修改元素,当然你得输入你想修改的位置和新元素:
int change(Seqlist *L,int a,int b)
{
L->data[a-1]=b;
}
这么多函数连用在一起就是一个完整的顺序表了,这里我用一个比较直观的方式体现出顺序表,把它设计成一个这样:,并且当你按1你就可以输入你想增加的元素,按5就可以打印出顺序表。
代码如下:
1 /* Note:Your choice is C IDE */
2 #include "stdio.h"
3 #define MAXSIZE 100
4 typedef struct
5 {
6 int data[MAXSIZE];
7 int last;
8 }Seqlist;
9 Seqlist *init();
10 void print(Seqlist *L);
11 insert(Seqlist *L,int i,int x);
12 int Delete(Seqlist *L,int i);
13 void showMainWindows();
14 int change(Seqlist *L,int a,int b);
15 Location(Seqlist *L,int x);
16 add(Seqlist *L,int x,int i);
17 function(int x);
18 main()
19 {
20 int x,i;
21 Seqlist *L;
22 L=init();
23 printf("首先你得先输入8个数据!
");
24 for(i=1;i<9;i++)
25 {
26 scanf("%d",&x);
27 insert(L,i,x);
28 }
29 system("cls");
30 printf("写入成功,请继续使用顺序表!");
31 showMainWindows();
32
33 while(1)
34 {
35 int num;
36 scanf("%d",&num);
37 function(num);
38 if(num==1)
39 {
40 int a,b;
41 scanf("%d,%d",&a,&b);
42 add(L,a,b);
43 }
44 else
45 if(num==2)
46 {
47 int a,b;
48 scanf("%d,%d",&a,&b);
49 change(L,a,b);
50 }
51 else
52 if(num==3)
53 {
54 int de;
55 scanf("%d",&de);
56 Delete(L,de);
57 }
58 else
59 if(num==4)
60 {
61 int y;
62 scanf("%d",&y);
63 printf("此元素在第%d",Location(L,y));
64 }
65 else
66 if(num==5)
67 print(L);
68 if(num==0)
69 break;
70 }
71
72 }
73 Seqlist *init()
74 {
75 Seqlist *L;
76 L=(Seqlist *)malloc(sizeof(Seqlist));
77 L->last=-1;
78 return L;
79 }
80 void print(Seqlist *L)
81 {
82 int i;
83 if(L->last==-1)
84 printf("null!!");
85 else
86 {
87 for(i=0;i<=L->last;i++)
88 printf("| %d ",L->data[i]);
89 printf("请继续输入0~5之间的数:
");
90 }
91 }
92 insert(Seqlist *L,int i,int x)
93 {
94 int j;
95 for(j=L->last;j>=i-1;j++)
96 L->data[j+1]=L->data[j];
97 L->data[i-1]=x;
98 L->last++;
99
100 }
101 int Delete(Seqlist *L,int i)
102 {
103 int j;
104 if(i<1||i>L->last+1)
105 {
106 printf("不存在第i个元素!
");
107 return 0;
108 }
109 for(j=i;j<=L->last;j++)
110 L->data[j-1]=L->data[j];
111 L->last--;
112 printf("删除成功,查看请按5!
");
113 }
114 void showMainWindows()
115 {
116 printf("
+------------------------------------------------------+
");
117 printf(" | 顺序表练习 |
");
118 printf(" +------------------------------------------------------+
");
119 printf(" |------------------- 1.增 加 -----------------------|
");
120 printf(" |------------------- 2.修 改 -----------------------|
");
121 printf(" |------------------- 3.删 除 -----------------------|
");
122 printf(" |------------------- 4.查 找 -----------------------|
");
123 printf(" |------------------- 5.打 印 表-----------------------|
");
124 printf(" |------------------- 0.退出系统 -----------------------|
");
125 printf(" +------------------------------------------------------+
");
126 printf(" | 请输入您的选择(0-5) |
");
127 printf(" +------------------------------------------------------+
");
128 printf("
");
129 }
130 int change(Seqlist *L,int a,int b)
131 {
132 L->data[a-1]=b;
133 printf("修改成功,查看请按5!
");
134 }
135 Location(Seqlist *L,int x)
136 {
137 int i=0;
138 while(i<=L->last&&L->data[i]!=x)
139 i++;
140 if(i++>L->last)
141 return -1;
142 else
143 return i;
144 }
145 add(Seqlist *L,int x,int i)
146 {
147 int j;
148 if(i>L->last+1)
149 printf("超出范围!或格式不对!请你继续输入0~5之间的数!
");
150 else
151 for(j=L->last;j>=i-1;j--)
152 L->data[j+1]=L->data[j];
153 L->data[i-1]=x;
154 }
155 function(int x)
156 {
157 switch(x)
158 {
159 case 1:printf("请输入你要增加的元素和位置:");
160 break;
161 case 2:printf("请输入你要修改元素的位置和新元素:");
162 break;
163 case 3:printf("请输入你要删除的元素位置:");
164 break;
165 case 4:printf("请输入你要查找的元素并返回其位置:");
166 break;
167 case 5:printf(" 打印出顺序表:");
168 }
169 }
这就是我自己写的一个比较完整的顺序表,当然这里面都是int类型,比较简单而且容易理解。