• 顺序表的增删排序


    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 }
  • 相关阅读:
    键盘移动小div(js原生)
    递归好理解,可是不好用啊
    jsonp
    闭包
    json
    来个小例子(ajax)
    ajax小demo
    制作H5响应式页面注意事项、微信二次分享
    Button按钮--inject与provide
    webpack基本打包配置流程
  • 原文地址:https://www.cnblogs.com/zlyblog/p/2985627.html
Copyright © 2020-2023  润新知