数据结构顺序表的基本操作

  1 /***顺序表上的基本操作实现***/
  2 
  3 
  4 #include <iostream>
  5 #include <stdio.h>
  6 #include <stdlib.h>
  7 #include <string.h>
  8 #define SIZE 1008
  9 
 10 #define LIST_INIT_SIZE 100
 11 #define LISTINCREMENT  10
 12 
 13 #define OK    1
 14 #define ERROR 0
 15 
 16 
 17 using namespace std;
 18 
 19 typedef int ElemType;
 20 
 21 typedef struct
 22 {
 23     ElemType *elem;
 24     int     length;
 25     int   listsize;
 26 } SqList;
 27 
 28 ///初始化
 29 int InitList_Sq(SqList &L)
 30 {
 31     //构造一个空的线性表L
 32     L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
 33     if(!L.elem)
 34     {
 35         exit(0);
 36     }
 37     L.length = 0;
 38     L.listsize = LIST_INIT_SIZE;
 39     return OK;
 40 }
 41 
 42 ///线性表的创建和插入
 43 int ListInsert_Sq(SqList &L,int index,ElemType ELEM)
 44 {
 45     ElemType *newbase,*p,*q;
 46     if(1 > index||index > L.length + 1)
 47     {
 48         return ERROR;
 49     }
 50     if(L.length >= L.listsize)          //当前存储空间已满,增加分配
 51     {
 52         newbase = (ElemType*)realloc(L.elem,
 53                                      (L.listsize + LISTINCREMENT)*sizeof(ElemType));
 54         if(!newbase)
 55         {
 56             exit(0);
 57         }
 58         L.elem = newbase;
 59         L.listsize += LISTINCREMENT;
 60     }
 61 
 62     q = &(L.elem[index - 1]);
 63     for(p = &(L.elem[L.length - 1]); p >= q; --p)
 64     {
 65         *(p + 1) = *p;
 66     }
 67     *q = ELEM;
 68     ++L.length;
 69 
 70     return OK;
 71 }
 72 void Creat_List_Sq(SqList &L,int Length)
 73 {
 74     ElemType ELEM;
 75     int index = 1;
 76     while(index <= Length)
 77     {
 78         scanf("%d",&ELEM);
 79         ListInsert_Sq( L,  index, ELEM);
 80         index ++;
 81     }
 82 }
 83 
 84 ///线性表的输出
 85 void Output_List_Sq(SqList L)
 86 {
 87     int i = 0;
 88     if(L.length == 0)
 89     {
 90         puts("This is a empty List./n");
 91     }
 92     while(i < L.length)
 93     {
 94         printf("%d ",L.elem[i++]);
 95     }
 96     printf("/n");
 97 }
 98 
 99 ///线性表元素删除
100 int ListDelete_Sq(SqList &L,int index,ElemType &ELEM)
101 {
102     ElemType *p,*q;
103     if(index < 1||index > L.length)
104     {
105         exit(0);
106     }
107     p = &(L.elem[index - 1]);
108     ELEM = *p;
109     q = L.elem + L.length -1;
110     for(++ p; p <= q; ++ p)
111     {
112         *(p - 1) = *p;
113     }
114     -- L.length;
115     return OK;
116 }
117 
118 ///线性表元素的查找,==>二分法查找
119 int SearchList_Sq(SqList L,ElemType ELEM)
120 {
121     int low,high,mid;
122 
123     low = 0;
124     high = L.length - 1;
125 
126     while(low <= high)
127     {
128         mid = (low + high)/2;
129         if(ELEM > L.elem[mid])
130         {
131             high = mid - 1;
132         }
133         else if(ELEM < L.elem[mid])
134         {
135             low = mid + 1;
136         }
137         else
138         {
139             return mid+1;
140         }
141     }
142     return -1;
143 }
144 
145 ///逆转线性表元素
146 void SWAP(int *m,int *n)
147 {
148     int iTemp = *m;
149     *m = *n;
150     *n = iTemp;
151 }
152 void ReversalList_Sq(SqList &L)
153 {
154     int m = 0,n = L.length - 1;
155     while(m <= n)
156     {
157         SWAP(&L.elem[m],&L.elem[n]);
158         m ++,n --;
159     }
160 
161 }
162 
163 ///线性表合并
164 void MergeList(SqList La,SqList Lb,SqList &Lc)
165 {
166     InitList_Sq(Lc);
167     int i,j;
168     i = j = 1;
169     int k = 0;
170     ElemType ai,bj;
171     int La_len = La.length,Lb_len = Lb.length;
172 
173     while((i <= La_len)&&(j <= Lb_len))
174     {
175         ai = La.elem[i-1];
176         bj = Lb.elem[j-1];
177         if(ai <= bj)
178         {
179             ListInsert_Sq(Lc, ++k, ai);
180             ++ i;
181         }
182         else
183         {
184             ListInsert_Sq(Lc, ++k, bj);
185             ++ j;
186         }
187     }
188     while(i <= La_len)
189     {
190         ai = La.elem[i-1];
191         i ++;
192         ListInsert_Sq(Lc, ++k, ai);
193     }
194     while(j <= Lb_len)
195     {
196         bj = Lb.elem[j-1];
197         j ++;
198         ListInsert_Sq(Lc, ++k, bj);
199     }
200 }
201 int main(void)
202 {
203     int LENGTH_La,LENGTH_Lb;//线性表La的长度
204     SqList La,Lb,Lc;    //
205 
206         scanf("%d",&LENGTH_La);
207         InitList_Sq(La);
208         Creat_List_Sq(La,LENGTH_La);
209         printf("创建好的线性表La=");
210         Output_List_Sq(La);
211 
212         int index;
213         ElemType ELEM_1;
214         scanf("%d%d", &ELEM_1, &index);
215         ListInsert_Sq( La,  index, ELEM_1);
216         printf("插入一个元素后的线性表La=");
217         Output_List_Sq(La);
218 
219         scanf("%d", &index);
220         ListDelete_Sq( La, index, ELEM_1);
221         printf("删除一个元素后的线性表La=");
222         Output_List_Sq(La);
223 
224         scanf("%d",&ELEM_1);
225         if(SearchList_Sq(La,ELEM_1) == -1)
226         {
227             puts("没找到");
228         }
229         else
230         {
231             printf("找到,%d在第%d个位置/n",ELEM_1,SearchList_Sq(La,ELEM_1));
232         }
233 
234         ReversalList_Sq(La);
235         printf("逆置后的线性表La=");
236         Output_List_Sq(La);
237 
238         scanf("%d",&LENGTH_Lb);
239         InitList_Sq(Lb);
240         Creat_List_Sq(Lb,LENGTH_Lb);
241 
242         MergeList( La, Lb, Lc);
243         printf("合并La和Lb后的线性表=");
244         Output_List_Sq(Lc);
245 
246     return 0;
247 }

 

posted @ 2016-12-24 10:04  Tovi  阅读(185)  评论(0)    收藏  举报