1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #define List_Size 100
5 #define List_Add 10
6 #define Error -1
7 #define OVERFLOW -2
8
9 typedef int ElemType;
10 typedef struct
11 {
12 ElemType *elem;
13 int length;
14 int listsize;
15 }SqList;//构造线性表
16 void init(SqList &L)
17 {
18
19 L.elem=(ElemType *)malloc(List_Size*sizeof(ElemType));//为顺序表开辟空间
20 printf("请输入线性表的长度:\n");
21 int n;
22 scanf("%d",&n);
23 printf("请输入要建立的线性表:\n");
24 for(int i=0;i<n;i++)
25 scanf("%d",L.elem+i);//顺序表的存储
26 if(!L.elem)
27 exit(OVERFLOW);//如果顺序表为空,报错
28 L.length=n;
29 L.listsize=List_Size;
30 }
31
32 void ListDelete(SqList &L,int i,ElemType &e)
33 {
34 if((i<1)||(i>L.length))//i不合法
35 {
36 printf("输入错误,越界\n");
37 }
38 else
39 {
40 int *p,*q;
41 p=&(L.elem[i-1]);//p为被删除元素的位置
42 e=*p;//被删除元素的值复制给e
43 q=L.elem+L.length-1;//表为元素的位置
44 for(++p;p<=q;++p)
45 *(p-1)=*p;//被删除元素之后的元素左移
46 --L.length;//表长减一
47 int j;
48 printf("删除后的顺序表为:\n");
49 for(j=0;j<L.length;j++)
50 printf("%d ",*(L.elem+j));//将删除元素之后的表输出
51 printf("\n");
52 }
53 }//线性表删除第i个元素
54
55 void ListInset(SqList &L,int i,ElemType e)
56 {if((i<1)||(i>L.length))
57 printf("输入错误,越界\n");
58 if(L.length>=L.listsize)
59 {
60 ElemType *newbase;
61 newbase = (ElemType *)realloc(L.elem,(L.listsize + List_Add)*sizeof(ElemType));
62 //在当前存储已满的情况下,增加分配
63 if(!newbase)
64 exit(OVERFLOW);//存储分配失败
65 L.elem=newbase;//新基址
66 L.listsize+=List_Add;//增加存储容量
67 }
68 int *q,*p;
69 q=&(L.elem[i-1]);
70 int *r;
71 for(r=(L.elem+L.length-1);r>=q;r--)
72 *(r+1)=*r;//将插入元素后面的元素全部后移
73 *q=e;
74 L.length++;//表长加一
75 printf("插入后的顺序表为:\n");
76 for(int j=0;j<L.length;j++)
77 printf("%d ",*(L.elem+j));
78 printf("\n");
79 }//线性表的插入,顺序插入,新元素e
80
81 void Invert(SqList &L)
82 {
83 printf("逆置后的顺序表为:\n");
84 int *p,*q;
85 p=L.elem;
86 for(q=L.elem +L.length-1;q>=p;q--)
87 {
88 int temp;
89 temp=*q;
90 *q=*p;
91 *p=temp;
92 p++;
93 }
94 for(int i=0;i<L.length;i++)
95 printf("%d ",*(L.elem+i));
96 printf("\n");
97 }//对顺序表进行逆置
98
99 void Ascending(SqList &L)
100 {
101 printf("将顺序表按升序排列后为:\n");
102 int i,j,*p,temp;
103 p=L.elem;
104 for(i=0;i<L.length-1;i++)//冒泡排序法
105 for(j=i+1;j<L.length;j++)
106 {
107 if(*(p+j)<*(p+i))
108 {
109 temp=*(p+i);
110 *(p+i)=*(p+j);
111 *(p+j)=temp;
112 }
113 }
114 for(i=0;i<L.length;i++)
115 printf("%d ",*(L.elem+i));
116 printf("\n");
117
118 }//对顺序表进行升序排列
119
120 void MergeList(SqList L1,SqList L2)
121 {
122 printf("将顺序表A与顺序表B合并为一个有序表C:\n");
123 SqList L3;
124 int *p1,*p2;
125 p1=L1.elem;
126 p2=L2.elem;
127 L3.listsize=L3.length=L1.length+L2.length;
128 int *p3;
129 p3=L3.elem=(ElemType *)malloc(L3.listsize*sizeof(ElemType));
130 if(!L3.elem)
131 exit(OVERFLOW);
132 int *r1,*r2;
133 r1=L1.elem+L1.length-1;
134 r2=L2.elem+L2.length-1;
135 while(p1<=r1&&p2<=r2)
136 {
137 if(*p1<=*p2)
138 *p3++=*p1++;
139 else
140 *p3++=*p2++;
141 }
142 while(p1<=r1)
143 *p3++=*p1++;
144 while(p2<=r2)
145 *p3++=*p2++;
146
147
148 }//将顺序表A与顺序表B合并为一个有序表C
149 void print()
150 {
151 printf("------------------------------------\n");
152 printf("|请输入需要进行的操作: |\n");
153 printf("|0 : 返回操作界面 |\n");
154 printf("|1 : 插入 |\n");
155 printf("|2 : 删除 | \n");
156 printf("|3 : 逆置顺序表 |\n");
157 printf("|4 :将顺序表按升序排列 |\n");
158 printf("|5 : 将两个顺序表合并为一个顺序表 |\n");
159 printf("|6 : 结束程序 |\n");
160 printf("------------------------------------\n");
161 printf("请选择:");
162 }
163
164 int main()
165 {
166
167 int i,j,K=1;
168 SqList L;
169 init(L);
170
171 print();
172
173 int x;
174 while(K)
175 {scanf("%d",&i);
176
177 switch(i)
178 {
179 case 6:
180 break;
181
182 case 0:
183 init(L);
184 print();
185
186 break;
187 case 1:
188 printf("请输入你要插入的元素:\n");
189 scanf("%d",&x);
190 printf("请输入你要插入的元素的位置:\n");
191 scanf("%d",&j);
192 ListInset(L,j,x);
193 printf("请选择:");
194
195 break;
196
197 case 2:
198 printf("请输入你要删除元素的值:\n");
199
200 scanf("%d",&x);
201 printf("请输入你要删除元素的位置:\n");
202 scanf("%d",&j);
203 ListDelete(L,j,x);
204 printf("请选择:");
205 break;
206
207 case 3:
208 Invert(L);//将顺序表逆置
209 printf("请选择:");
210 break;
211
212 case 4:
213 Ascending(L);//将表按从小到大顺序输出
214 printf("请选择:");
215 break;
216
217 case 5:
218 SqList A,B;
219 printf("顺序表A:\n");//为顺序输入
220 init(A);
221 printf("顺序表B:\n");//均为顺序输入
222 init(B);
223 MergeList(A,B);
224 Ascending(L);
225 printf("请选择:");
226 break;
227
228 }
229 }
230 return 0;
231 }