线性表的基本操作

  1 /***顺序表上的基本操作实现***/
  2 
  3 #include <iostream>
  4 
  5 #define SIZE 1008
  6 
  7 #define LIST_INIT_SIZE 100
  8 #define LISTINCREMENT  10
  9 #define OVERFLOW 0
 10 
 11 #define OK    1
 12 #define ERROR 0
 13 
 14 
 15 using namespace std;
 16 
 17 typedef int ElemType;
 18 
 19 typedef struct
 20 {
 21     ElemType *elem;
 22     int     length;
 23     int   listsize;
 24 } SqList;
 25 
 26 ///初始化
 27 int InitList_Sq(SqList &L)
 28 {
 29     //构造一个空的线性表L
 30     L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
 31     if(!L.elem)
 32     {
 33         exit(OVERFLOW);
 34     }
 35     L.length = 0;
 36     L.listsize = LIST_INIT_SIZE;
 37     return OK;
 38 }
 39 
 40 ///线性表的创建和插入
 41 int ListInsert_Sq(SqList &L,int index,ElemType ELEM)
 42 {
 43     ElemType *newbase,*p,*q;
 44     if(1 > index||index > L.length + 1)
 45     {
 46         return ERROR;
 47     }
 48     if(L.length >= L.listsize)
 49     {
 50         newbase = (ElemType*)realloc(L.elem,
 51                                      (L.listsize + LISTINCREMENT)*sizeof(ElemType));
 52         if(!newbase)
 53         {
 54             exit(0);
 55         }
 56         L.elem = newbase;
 57         L.listsize += LISTINCREMENT;
 58     }
 59 
 60     q = &(L.elem[index - 1]);
 61     for(p = &(L.elem[L.length - 1]); p >= q; --p)
 62     {
 63         *(p + 1) = *p;
 64     }
 65     *q = ELEM;
 66     ++L.length;
 67 
 68     return OK;
 69 }
 70 
 71 void Creat_List_Sq(SqList &L,int Length)
 72 {
 73     ElemType ELEM;
 74     int index = 1;
 75     while(index <= Length)
 76     {
 77         cout << "请输入元素 " << index << endl;
 78         cin >> 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         cout << "This is a empty List.";
 91     }
 92     while(i < L.length)
 93     {
 94         cout << L.elem[i++] << " ";
 95     }
 96     cout << endl;
 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 void SWAP(int *m,int *n)
146 {
147     int iTemp = *m;
148     *m = *n;
149     *n = iTemp;
150 }
151 
152 ///逆转线性表元素
153 void ReversalList_Sq(SqList &L)
154 {
155     int m = 0,n = L.length - 1;
156     while(m <= n)
157     {
158         SWAP(&L.elem[m],&L.elem[n]);
159         m ++,n --;
160     }
161 
162 }
163 
164 ///线性表合并
165 void MergeList(SqList La,SqList Lb,SqList &Lc)
166 {
167     InitList_Sq(Lc);
168     int i,j;
169     i = j = 1;
170     int k = 0;
171     ElemType ai,bj;
172     int La_len = La.length,Lb_len = Lb.length;
173 
174     while((i <= La_len)&&(j <= Lb_len))
175     {
176         ai = La.elem[i-1];
177         bj = Lb.elem[j-1];
178         if(ai <= bj)
179         {
180             ListInsert_Sq(Lc, ++k, ai);
181             ++ i;
182         }
183         else
184         {
185             ListInsert_Sq(Lc, ++k, bj);
186             ++ j;
187         }
188     }
189     while(i <= La_len)
190     {
191         ai = La.elem[i-1];
192         i ++;
193         ListInsert_Sq(Lc, ++k, ai);
194     }
195     while(j <= Lb_len)
196     {
197         bj = Lb.elem[j-1];
198         j ++;
199         ListInsert_Sq(Lc, ++k, bj);
200     }
201 }
202 int main(void)
203 {
204     int LENGTH_La,LENGTH_Lb;//线性表La的长度
205     SqList La,Lb,Lc;    //
206         
207         cout << "输入线性表长度: ";
208         cin >> LENGTH_La;
209         InitList_Sq(La);
210         Creat_List_Sq(La,LENGTH_La);
211         cout << "创建好的线性表La=";
212         Output_List_Sq(La);
213 
214         int index;
215         ElemType ELEM_1;
216         cout << "请输入一个数以及要插入的位置" << endl;
217         cin >> ELEM_1 >> index;
218         ListInsert_Sq( La,  index, ELEM_1);
219         cout << "插入一个元素后的线性表La=" << endl;
220         Output_List_Sq(La);
221 
222         cout << "请输入一个要删除的元素位置:" << endl;
223         cin >> index;
224         ListDelete_Sq( La, index, ELEM_1);
225         cout << "删除一个元素后的线性表La=" << endl;
226         Output_List_Sq(La);
227 
228         cout << "请输入一个要查找的元素:" << endl;
229         cin >> ELEM_1;
230         if(SearchList_Sq(La,ELEM_1) == -1)
231         {
232             cout << "没找到" << endl;
233         }
234         else
235         {
236             cout << "找到," << ELEM_1 << "在第" << SearchList_Sq(La,ELEM_1) << "个位置" << endl;
237         }
238 
239         ReversalList_Sq(La);
240         cout << "逆置后的线性表La=";
241         Output_List_Sq(La);
242 
243         cout << "输入Lb线性表长度:";
244         cin >> LENGTH_Lb;
245         InitList_Sq(Lb);
246         Creat_List_Sq(Lb,LENGTH_Lb);
247 
248         MergeList( La, Lb, Lc);
249         cout << "合并La和Lb后的线性表=";
250         Output_List_Sq(Lc);
251 
252     return 0;
253 }

 

posted @ 2015-03-27 16:57  薛晓东  阅读(199)  评论(0编辑  收藏  举报