View Code
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define List_Size 100 5 #define List_Add 10 6 #define Error -1 7 #define OVERFLOW -2 8 9 typedef int ElemType; 10 typedef struct 11 { 12 ElemType *elem; 13 int length; 14 int listsize; 15 }SqList;//构造线性表 16 void init(SqList &L) 17 { 18 19 L.elem=(ElemType *)malloc(List_Size*sizeof(ElemType));//为顺序表开辟空间 20 printf("请输入线性表的长度:\n"); 21 int n; 22 scanf("%d",&n); 23 printf("请输入要建立的线性表:\n"); 24 for(int i=0;i<n;i++) 25 scanf("%d",L.elem+i);//顺序表的存储 26 if(!L.elem) 27 exit(OVERFLOW);//如果顺序表为空,报错 28 L.length=n; 29 L.listsize=List_Size; 30 } 31 32 void ListDelete(SqList &L,int i,ElemType &e) 33 { 34 if((i<1)||(i>L.length))//i不合法 35 { 36 printf("输入错误,越界\n"); 37 } 38 else 39 { 40 int *p,*q; 41 p=&(L.elem[i-1]);//p为被删除元素的位置 42 e=*p;//被删除元素的值复制给e 43 q=L.elem+L.length-1;//表为元素的位置 44 for(++p;p<=q;++p) 45 *(p-1)=*p;//被删除元素之后的元素左移 46 --L.length;//表长减一 47 int j; 48 printf("删除后的顺序表为:\n"); 49 for(j=0;j<L.length;j++) 50 printf("%d ",*(L.elem+j));//将删除元素之后的表输出 51 printf("\n"); 52 } 53 }//线性表删除第i个元素 54 55 void ListInset(SqList &L,int i,ElemType e) 56 {if((i<1)||(i>L.length)) 57 printf("输入错误,越界\n"); 58 if(L.length>=L.listsize) 59 { 60 ElemType *newbase; 61 newbase = (ElemType *)realloc(L.elem,(L.listsize + List_Add)*sizeof(ElemType)); 62 //在当前存储已满的情况下,增加分配 63 if(!newbase) 64 exit(OVERFLOW);//存储分配失败 65 L.elem=newbase;//新基址 66 L.listsize+=List_Add;//增加存储容量 67 } 68 int *q,*p; 69 q=&(L.elem[i-1]); 70 int *r; 71 for(r=(L.elem+L.length-1);r>=q;r--) 72 *(r+1)=*r;//将插入元素后面的元素全部后移 73 *q=e; 74 L.length++;//表长加一 75 printf("插入后的顺序表为:\n"); 76 for(int j=0;j<L.length;j++) 77 printf("%d ",*(L.elem+j)); 78 printf("\n"); 79 }//线性表的插入,顺序插入,新元素e 80 81 void Invert(SqList &L) 82 { 83 printf("逆置后的顺序表为:\n"); 84 int *p,*q; 85 p=L.elem; 86 for(q=L.elem +L.length-1;q>=p;q--) 87 { 88 int temp; 89 temp=*q; 90 *q=*p; 91 *p=temp; 92 p++; 93 } 94 for(int i=0;i<L.length;i++) 95 printf("%d ",*(L.elem+i)); 96 printf("\n"); 97 }//对顺序表进行逆置 98 99 void Ascending(SqList &L) 100 { 101 printf("将顺序表按升序排列后为:\n"); 102 int i,j,*p,temp; 103 p=L.elem; 104 for(i=0;i<L.length-1;i++)//冒泡排序法 105 for(j=i+1;j<L.length;j++) 106 { 107 if(*(p+j)<*(p+i)) 108 { 109 temp=*(p+i); 110 *(p+i)=*(p+j); 111 *(p+j)=temp; 112 } 113 } 114 for(i=0;i<L.length;i++) 115 printf("%d ",*(L.elem+i)); 116 printf("\n"); 117 118 }//对顺序表进行升序排列 119 120 void MergeList(SqList L1,SqList L2) 121 { 122 printf("将顺序表A与顺序表B合并为一个有序表C:\n"); 123 SqList L3; 124 int *p1,*p2; 125 p1=L1.elem; 126 p2=L2.elem; 127 L3.listsize=L3.length=L1.length+L2.length; 128 int *p3; 129 p3=L3.elem=(ElemType *)malloc(L3.listsize*sizeof(ElemType)); 130 if(!L3.elem) 131 exit(OVERFLOW); 132 int *r1,*r2; 133 r1=L1.elem+L1.length-1; 134 r2=L2.elem+L2.length-1; 135 while(p1<=r1&&p2<=r2) 136 { 137 if(*p1<=*p2) 138 *p3++=*p1++; 139 else 140 *p3++=*p2++; 141 } 142 while(p1<=r1) 143 *p3++=*p1++; 144 while(p2<=r2) 145 *p3++=*p2++; 146 147 148 }//将顺序表A与顺序表B合并为一个有序表C 149 void print() 150 { 151 printf("------------------------------------\n"); 152 printf("|请输入需要进行的操作: |\n"); 153 printf("|0 : 返回操作界面 |\n"); 154 printf("|1 : 插入 |\n"); 155 printf("|2 : 删除 | \n"); 156 printf("|3 : 逆置顺序表 |\n"); 157 printf("|4 :将顺序表按升序排列 |\n"); 158 printf("|5 : 将两个顺序表合并为一个顺序表 |\n"); 159 printf("|6 : 结束程序 |\n"); 160 printf("------------------------------------\n"); 161 printf("请选择:"); 162 } 163 164 int main() 165 { 166 167 int i,j,K=1; 168 SqList L; 169 init(L); 170 171 print(); 172 173 int x; 174 while(K) 175 {scanf("%d",&i); 176 177 switch(i) 178 { 179 case 6: 180 break; 181 182 case 0: 183 init(L); 184 print(); 185 186 break; 187 case 1: 188 printf("请输入你要插入的元素:\n"); 189 scanf("%d",&x); 190 printf("请输入你要插入的元素的位置:\n"); 191 scanf("%d",&j); 192 ListInset(L,j,x); 193 printf("请选择:"); 194 195 break; 196 197 case 2: 198 printf("请输入你要删除元素的值:\n"); 199 200 scanf("%d",&x); 201 printf("请输入你要删除元素的位置:\n"); 202 scanf("%d",&j); 203 ListDelete(L,j,x); 204 printf("请选择:"); 205 break; 206 207 case 3: 208 Invert(L);//将顺序表逆置 209 printf("请选择:"); 210 break; 211 212 case 4: 213 Ascending(L);//将表按从小到大顺序输出 214 printf("请选择:"); 215 break; 216 217 case 5: 218 SqList A,B; 219 printf("顺序表A:\n");//为顺序输入 220 init(A); 221 printf("顺序表B:\n");//均为顺序输入 222 init(B); 223 MergeList(A,B); 224 Ascending(L); 225 printf("请选择:"); 226 break; 227 228 } 229 } 230 return 0; 231 }