1 #include <cstdio>
2 #include <cstdlib>
3 //顺序表 Freeze 2010 10 6
4 #define ADDSIZE 5 //表分配存储空间分配增量
5 typedef int SElemType;
6
7 typedef struct {
8 SElemType *base; //存储空间基指针
9 int size; //长度,默认为0
10 int capacity; //容量
11 }Sequence;
12
13
14 void initSequence(Sequence &S,int capacity); //构造一个顺序表S,此处为引用
15 void freeSequence(Sequence &S); //销毁顺序表S,此处为引用
16 bool sequenceIsEmpty(const Sequence S); //若表S为空,则返回ture,否则返回false
17 void addCapacity(Sequence &S,int addsize); //增加表容量,此处为引用
18 void insert(Sequence &S,SElemType e,int i); //在第i个位置插入e,i从1到n
19 SElemType remove(Sequence &S,int i); //删除第i个元素,i从1到n
20
21 //构造一个空顺序表S
22 void initSequence(Sequence &S,int capacity=ADDSIZE)
23 {
24 freeSequence(S);
25 S.base=(SElemType *)malloc((capacity+1)*sizeof(SElemType));
26 if(!S.base)
27 {
28 printf("内存不足\n");
29 exit(1);
30 }
31 S.size=0;
32 S.capacity=capacity;
33 }
34
35 //销毁顺序表S
36 void freeSequence(Sequence &S)
37 {
38 if (S.capacity>0)
39 {
40 free(S.base);
41 }
42 }
43
44
45 //若顺序表S为空,则返回ture,否则返回false
46 bool sequenceIsEmpty(const Sequence S)
47 {
48 return(S.size==0);
49 }
50
51
52 //在顺序表的第i个位置插入e
53 void insert(Sequence &S,SElemType e,int i)
54 {
55 if(sequenceIsEmpty(S)||i<1||i>S.size)
56 {
57 printf("插入数据失败!\n");
58 exit(0);
59 }
60 if (S.size>=S.capacity) { //表满,追加存储空间
61 addCapacity(S,ADDSIZE);
62 }
63 for (int j=S.size-1;j>=i-1;j--)
64 {
65 S.base[j+1]=S.base[j];
66 }
67 S.base[j]=e;
68 S.size++;
69 }
70
71
72 //删除顺序表中第i个元素
73 SElemType remove(Sequence &S,int i)
74 {
75 if(sequenceIsEmpty(S)||i<1||i>S.size)
76 {
77 printf("插入数据失败!\n");
78 exit(0);
79 }
80 SElemType temp=S.base[i-1];
81 for (int j=i-1;j<S.size-2;j--)
82 {
83 S.base[j]=S.base[j+1];
84 }
85 S.size--;
86 return temp;
87 }
88 //增加栈容量
89 void addCapacity(Sequence &S,int addsize=ADDSIZE)
90 {
91 SElemType *temp=(SElemType *)realloc(S.base,(S.capacity+addsize+1)*sizeof(SElemType));
92 if(!temp)
93 {
94 printf("无法增加容量,内存不足\n");
95 exit(1);
96 }else{
97 if(S.base!=temp)
98 S.base=temp;
99 S.capacity+=addsize;
100 }
101 }