顺序表实现

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 
  4 #define LIST_INIT_SIZE 1000
  5 #define LISTINVRESEMENT 100
  6 #define OK 1
  7 #define ERROR 0
  8 #define OVERFLOW -2
  9 
 10 typedef int elemType;
 11 typedef struct{
 12     elemType *List;
 13     int length;
 14     int listsize;
 15 }SqList;
 16 
 17 void AgainMalloc(SqList *L){
 18     elemType *newbase;
 19     newbase = (elemType *)realloc(L->List,(L->listsize + LISTINVRESEMENT) * sizeof(elemType));
 20     if(!newbase)
 21         exit(OVERFLOW);
 22     L->List = newbase;
 23     L->listsize += LISTINVRESEMENT;
 24 }
 25 
 26 int InitList_Sq(SqList *L){
 27     L->List = (elemType *)malloc(LIST_INIT_SIZE * sizeof(elemType));
 28     if(!L->List)
 29         exit(OVERFLOW);
 30     L->length = 0;
 31     L->listsize = LIST_INIT_SIZE;
 32     return OK;
 33 }
 34 
 35 int ListLength(SqList *L){
 36     return L->length;
 37 }
 38 
 39 void TraverseList(SqList *L){
 40     int i;
 41     for(i = 0; i < L->length; i++){
 42         printf("%d",L->List[i]);
 43     }
 44     printf("\n");
 45     return;
 46 }
 47 
 48 void InsertFirst(SqList *L,elemType e){
 49     int i;
 50     if(L->length >= L->listsize){
 51         AgainMalloc(L);
 52     }
 53     for(i = L->length-1; i >= 0; i++){
 54         L->List[i+1] = L->List[i];
 55     }
 56     L->List[0] = e;
 57     L->length++;
 58     return;
 59 }
 60 
 61 void InsertLast(SqList *L,elemType e){
 62     if(L->length >= L->listsize){
 63         AgainMalloc(L);
 64     }
 65     L->List[L->length] = e;
 66     L->length++;
 67     return;
 68 }
 69 
 70 int Insert_Sq(SqList *L,elemType e,int pos){
 71     int i;
 72     if(pos < i || pos > L->length+1)
 73         return ERROR;
 74     if(L->length >= L->listsize){
 75         AgainMalloc(L);
 76     }
 77     for(i = L->length-1; i >= pos-1; i++){
 78         L->List[i+1] = L->List[i];
 79     }
 80     L->List[pos-1] = e;
 81     L->length++;
 82     return OK;
 83 }
 84 
 85 void Search(SqList *L,elemType e){
 86     int i;
 87     for(i = 0; i < L->length; i++){
 88         if(L->List[i] == e){
 89             printf("%d在第%d个位置",e,i+1); 
 90             return;
 91         }
 92     }
 93     printf("没有找到!\n");
 94     return;
 95 }
 96 
 97 elemType DeleteElem(SqList *L,int pos){
 98     int i;
 99     elemType temp;
100     if(pos < 1 || pos > L->length){
101         printf("pos越界\n");
102         exit(1);
103     }
104     temp = L->List[pos - 1];
105     for(i = pos; i < L->length; i++){
106         L->List[i - 1] = L->List[i];
107     }
108     L->length--;
109     return temp;
110 }
111 
112 int isEmpty(SqList *L){
113     if(L->length == 0)
114         return 1;
115     else
116         return 0;
117 }
118 
119 void Inverse(SqList *L){
120     int low = 0, high = L->length - 1;
121     elemType temp;
122     int i;
123     for(i = 0; i < L->length/2; i++){
124         temp=L->List[low];  
125         L->List[low++]=L->List[high];  
126         L->List[high--]=temp; 
127     }
128 }
129 
130 //合并顺序表
131 void MergeList(SqList *La, SqList *Lb, SqList *Lc){
132     Lc->listsize = Lc->length = La->length + Lb->length;
133     Lc->List = (elemType *)malloc(sizeof(elemType));
134     if(!Lc->List)
135         exit(OVERFLOW);
136     int i = 0, j = 0, k = 0;
137     while(i < La->length && j < Lb->length){
138         if(La->List[i] <= Lb->List[j])
139             Lc->List[k++] = La->List[i++];
140         else
141             Lc->List[k++] = Lb->List[j++];
142     }
143     while(i < La->length)
144         Lc->List[k++] = La->List[i++];
145     while(j < Lb->length)
146         Lc->List[k++] = Lb->List[j++];
147 }
148 int main(){  
149     SqList list1;  
150     InitList_Sq(&list1);  
151     int length;  
152     scanf("%d",&length);  
153     int i;  
154     elemType temp;  
155     for(i=0; i<length; i++){  
156         scanf("%d",&temp);  
157         InsertLast(&list1,temp);  
158     }  
159     printf("创建好的线性表La=");  
160     TraverseList(&list1);//创建好的顺序表  
161     int pos;  
162     scanf("%d%d",&temp,&pos);  
163     Insert_Sq(&list1,temp,pos);  
164     printf("插入一个元素后的线性表La=");  
165     TraverseList(&list1);//插入一个数字后的线性表  
166     scanf("%d",&pos);  
167     DeleteElem(&list1,pos);  
168     printf("删除一个元素后的线性表La=");  
169     TraverseList(&list1);  
170     scanf("%d",&temp);  
171     Search(&list1,temp);//查找元素  
172     printf("逆置后的线性表La=");  
173     Inverse(&list1);  
174     TraverseList(&list1);  
175     SqList list2;  
176     InitList_Sq(&list2);  
177     scanf("%d",&length);  
178     for(i=0; i<length; i++){  
179         scanf("%d",&temp);  
180         InsertLast(&list2,temp);  
181     }  
182     SqList list3;  
183     MergeList(&list1,&list2,&list3);  
184     printf("合并La和Lb后的线性表=");  
185     TraverseList(&list3);  
186     return 0;  
187 }  

 

posted @ 2017-11-27 11:29  ixummer  阅读(252)  评论(0编辑  收藏  举报