顺序表的增删排序

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 }

 

转载于:https://www.cnblogs.com/zlyblog/archive/2013/03/27/2985627.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值