1 #include "stdafx.h"
2 #include<stdio.h>
3 #include<malloc.h>
4 #include<stdlib.h>
5
6 #define LINK_INIT_SIZE 100
7 #define LISTINCREAMENT 10
8 #define ElemType int
9 #define OVERFLOW -2
10 #define OK 1
11 #define ERROR 0
12
13 typedef int status;
14
15 //定义顺序表,并定义一个新类型Sqlist
16 typedef struct Sqlist{
17 ElemType *elem;
18 int listsize;
19 int length;
20 }Sqlist;
21
22 //函数声明
23 status InitList(Sqlist &L);
24 status CreatList(Sqlist &L);
25 status PrintfList1(Sqlist L);
26 status PrintfList2(Sqlist L);
27 status DeleteList(Sqlist &L, int i);
28 status ListEmpty(Sqlist L);
29 status ListLength(Sqlist L);
30 status InsertList(Sqlist &L, int i, ElemType e);
31 status DestroyList(Sqlist &L);
32
33 int main()
34 {
35 int i, n, j;
36 ElemType e;
37 Sqlist L1;
38 InitList(L1); //顺序表初始化操作
39
40 ListEmpty(L1); //顺序表判空
41
42 CreatList(L1); //顺序表赋值操作
43
44 printf("正序输出为:\n");
45 PrintfList1(L1); //顺序表正序输出操作
46 printf("\n");
47 printf("逆序输出为:\n");
48 PrintfList2(L1); //顺序表逆序输出操作
49 printf("\n");
50
51 ListLength(L1); //求顺序表表长
52
53 printf("请输入插入的位置i=");
54 scanf_s("%d", &i);
55 e = rand() % 100 + 1;
56 InsertList(L1, i, e); //顺序表插入操作
57 PrintfList1(L1);
58 printf("\n");
59
60 printf("请输入删除的位置j=");
61 scanf_s("%d", &j);
62 DeleteList(L1, j); //顺序表删除操作
63 PrintfList1(L1);
64
65 DestroyList(L1); //顺序表销毁操作
66 PrintfList1(L1);
67 return 0;
68 }
69
70 //构建空的顺序表
71 status InitList(Sqlist &L)
72 {
73 L.elem = (ElemType*)malloc(LINK_INIT_SIZE*sizeof(ElemType));
74 if (!L.elem)
75 exit(OVERFLOW);
76 L.length = 0; //将新的顺序表长度定为0
77 L.listsize = LINK_INIT_SIZE; //初始化顺序表大小为LINK_INIT_SIZE
78 return OK;
79 }
80
81 //顺序表插入操作
82 status InsertList(Sqlist &L, int i, ElemType e)
83 {
84 ElemType *newbase, *q, *p;
85 if (i<1 || i>L.length + 1)
86 {
87 printf("未插入成功!!!\n");
88 return ERROR;
89 }
90 if (L.length >= L.listsize)
91 {
92 newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREAMENT)*sizeof(ElemType));
93 if (!newbase)
94 exit(OVERFLOW);
95 L.elem = newbase;
96 L.listsize += LISTINCREAMENT;
97 } //检验线性表是否满了,满了则重新增加存储空间
98 q = &(L.elem[i - 1]);
99 for (p = &(L.elem[L.length - 1]); p >= q; p--)
100 *(p + 1) = *p;
101 *q = e;
102 L.length++;
103 return OK;
104 }
105
106 //顺序表输入操作
107 status CreatList(Sqlist &L)
108 {
109 ElemType i = 0, e;
110 for (i = 0; i < 10; i++) //顺序表赋值操作
111 {
112 L.elem[i] = rand() % 100 + 1;
113 L.length++;
114 }
115 return 0;
116 }
117
118 //顺序表正序输出操作
119 status PrintfList1(Sqlist L)
120 {
121 int i;
122 if (L.length == 0)
123 {
124 printf("该线性表为空!\n");
125 return 0;
126 }
127 for (i = 0; i < L.length; i++)
128 printf("L.elem[%d]=%d\n", i + 1, *(L.elem + i));
129 }
130
131 //顺序表删除操作
132 status DeleteList(Sqlist &L, int i)
133 {
134 int *p, *q, e;
135 if (i<1 || i>L.length + 1)
136 {
137 printf("不存在此删除位置!!!\n");
138 return ERROR;
139 } //检验输入的i是否在线性表所存在的范围内
140 p = &(L.elem[i - 1]);
141 e = *p;
142 q = L.elem + L.length - 1;
143 for (p++; p <= q; ++p)
144 *(p - 1) = *p;
145 L.length--;
146 printf("删除的元素为%d\n", e);
147 return 0;
148 }
149
150 //顺序表逆序输出操作
151 status PrintfList2(Sqlist L)
152 {
153 int i;
154 if (L.length == 0)
155 {
156 printf("该线性表为空!\n");
157 return 0;
158 }
159 for (i = L.length - 1; i >= 0; i--)
160 printf("L.elem[%d]=%d\n", i + 1, *(L.elem + i));
161 }
162
163 //求顺序表是否为空
164 status ListEmpty(Sqlist L)
165 {
166 if (L.length == 0)
167 printf("The List is Empty!!!\n");
168 else
169 printf("The List is not Empty!!!\n");
170 return 0;
171 }
172
173 //求顺序表长度
174 status ListLength(Sqlist L)
175 {
176 printf("线性表的长度为%d\n", L.length);
177 return OK;
178 }
179
180 status DestroyList(Sqlist &L)
181 {
182 free(&L.elem[0]);
183 L.length = 0;
184 return 0;
185 }