线性表上的基本操作实现标准版

转自:http://blog.csdn.net/sunshinedabby/article/details/6240924

标题:
线性表上的基本操作实现
时 限:1000 ms
内存限制:10000 K
总时限:1000 ms
 描述:
在单链表存储结构上实现基本操作:初始化、创建、插入、删除、查找、遍历、逆置、合并运算。
 输入:
输入线性表La的长度:n
输入线性表La中的元素:a1 a2 a3 ...an(数值有序,为降序)
输入要插入到线性表La中的元素x和插入的位置i:x i
输入要删除元素的位置:i
输入要查找的元素:x
输入线性表Lb的长度:m
输入线性表Lb中的元素:b1 b2...bm(数值有序,为升序)
 

输出:
创建好的线性表La=a1 a2...an
插入一个元素后的线性表La=a1 a2...an+1
删除一个元素后的线性表La=a1 a2...an
查找一个输入的元素,如果找到,输出"找到,x在第i个位置";如果没有找到,输出"没找到"的信息。
逆置La后的线性表an an-1...a1
合并La和Lb后的线性表
 

输入样例: 
6
15 13 10 9 8 5
7 6
4
10
4
1 3 6 9
1 3 5 6 7 8 9 10 13 15
 

输出样例: 

创建好的线性表La=15 13 10 9 8 5
插入一个元素后的线性表La=15 13 10 9 8 7 5
删除一个元素后的线性表La=15 13 10 8 7 5
找到,10在第3个位置
逆置后的线性表La=5 7 8 10 13 15
合并La和Lb后的线性表=1 3 5 6 7 8 9 10 13 15
 


代码如下:

 

  1. /***顺序表上的基本操作实现***/  
  2.   
  3. /** 
  4. dabbysunshine@qq.com 
  5. **/  
  6. #include <iostream>  
  7. #include <stdio.h>  
  8. #include <stdlib.h>  
  9. #include <string.h>  
  10. #define SIZE 1008  
  11.   
  12. #define LIST_INIT_SIZE 100  
  13. #define LISTINCREMENT  10  
  14.   
  15. #define OK    1  
  16. #define ERROR 0  
  17.   
  18.   
  19. using namespace std;  
  20.   
  21. typedef int ElemType;  
  22.   
  23. typedef struct  
  24. {  
  25.     ElemType *elem;  
  26.     int     length;  
  27.     int   listsize;  
  28. } SqList;  
  29.   
  30. ///初始化  
  31. int InitList_Sq(SqList &L)  
  32. {  
  33.     //构造一个空的线性表L  
  34.     L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));  
  35.     if(!L.elem)  
  36.     {  
  37.         exit(0);  
  38.     }  
  39.     L.length = 0;  
  40.     L.listsize = LIST_INIT_SIZE;  
  41.     return OK;  
  42. }  
  43.   
  44. ///线性表的创建和插入  
  45. int ListInsert_Sq(SqList &L,int index,ElemType ELEM)  
  46. {  
  47.     ElemType *newbase,*p,*q;  
  48.     if(1 > index||index > L.length + 1)  
  49.     {  
  50.         return ERROR;  
  51.     }  
  52.     if(L.length >= L.listsize)  
  53.     {  
  54.         newbase = (ElemType*)realloc(L.elem,  
  55.                                      (L.listsize + LISTINCREMENT)*sizeof(ElemType));  
  56.         if(!newbase)  
  57.         {  
  58.             exit(0);  
  59.         }  
  60.         L.elem = newbase;  
  61.         L.listsize += LISTINCREMENT;  
  62.     }  
  63.   
  64.     q = &(L.elem[index - 1]);  
  65.     for(p = &(L.elem[L.length - 1]); p >= q; --p)  
  66.     {  
  67.         *(p + 1) = *p;  
  68.     }  
  69.     *q = ELEM;  
  70.     ++L.length;  
  71.   
  72.     return OK;  
  73. }  
  74. void Creat_List_Sq(SqList &L,int Length)  
  75. {  
  76.     ElemType ELEM;  
  77.     int index = 1;  
  78.     while(index <= Length)  
  79.     {  
  80.         scanf("%d",&ELEM);  
  81.         ListInsert_Sq( L,  index, ELEM);  
  82.         index ++;  
  83.     }  
  84. }  
  85.   
  86. ///线性表的输出  
  87. void Output_List_Sq(SqList L)  
  88. {  
  89.     int i = 0;  
  90.     if(L.length == 0)  
  91.     {  
  92.         puts("This is a empty List./n");  
  93.     }  
  94.     while(i < L.length)  
  95.     {  
  96.         printf("%d ",L.elem[i++]);  
  97.     }  
  98.     printf("/n");  
  99. }  
  100.   
  101. ///线性表元素删除  
  102. int ListDelete_Sq(SqList &L,int index,ElemType &ELEM)  
  103. {  
  104.     ElemType *p,*q;  
  105.     if(index < 1||index > L.length)  
  106.     {  
  107.         exit(0);  
  108.     }  
  109.     p = &(L.elem[index - 1]);  
  110.     ELEM = *p;  
  111.     q = L.elem + L.length -1;  
  112.     for(++ p; p <= q; ++ p)  
  113.     {  
  114.         *(p - 1) = *p;  
  115.     }  
  116.     -- L.length;  
  117.     return OK;  
  118. }  
  119.   
  120. ///线性表元素的查找,==>二分法查找  
  121. int SearchList_Sq(SqList L,ElemType ELEM)  
  122. {  
  123.     int low,high,mid;  
  124.   
  125.     low = 0;  
  126.     high = L.length - 1;  
  127.   
  128.     while(low <= high)  
  129.     {  
  130.         mid = (low + high)/2;  
  131.         if(ELEM > L.elem[mid])  
  132.         {  
  133.             high = mid - 1;  
  134.         }  
  135.         else if(ELEM < L.elem[mid])  
  136.         {  
  137.             low = mid + 1;  
  138.         }  
  139.         else  
  140.         {  
  141.             return mid+1;  
  142.         }  
  143.     }  
  144.     return -1;  
  145. }  
  146.   
  147. ///逆转线性表元素  
  148. void SWAP(int *m,int *n)  
  149. {  
  150.     int iTemp = *m;  
  151.     *m = *n;  
  152.     *n = iTemp;  
  153. }  
  154. void ReversalList_Sq(SqList &L)  
  155. {  
  156.     int m = 0,n = L.length - 1;  
  157.     while(m <= n)  
  158.     {  
  159.         SWAP(&L.elem[m],&L.elem[n]);  
  160.         m ++,n --;  
  161.     }  
  162.   
  163. }  
  164.   
  165. ///线性表合并  
  166. void MergeList(SqList La,SqList Lb,SqList &Lc)  
  167. {  
  168.     InitList_Sq(Lc);  
  169.     int i,j;  
  170.     i = j = 1;  
  171.     int k = 0;  
  172.     ElemType ai,bj;  
  173.     int La_len = La.length,Lb_len = Lb.length;  
  174.   
  175.     while((i <= La_len)&&(j <= Lb_len))  
  176.     {  
  177.         ai = La.elem[i-1];  
  178.         bj = Lb.elem[j-1];  
  179.         if(ai <= bj)  
  180.         {  
  181.             ListInsert_Sq(Lc, ++k, ai);  
  182.             ++ i;  
  183.         }  
  184.         else  
  185.         {  
  186.             ListInsert_Sq(Lc, ++k, bj);  
  187.             ++ j;  
  188.         }  
  189.     }  
  190.     while(i <= La_len)  
  191.     {  
  192.         ai = La.elem[i-1];  
  193.         i ++;  
  194.         ListInsert_Sq(Lc, ++k, ai);  
  195.     }  
  196.     while(j <= Lb_len)  
  197.     {  
  198.         bj = Lb.elem[j-1];  
  199.         j ++;  
  200.         ListInsert_Sq(Lc, ++k, bj);  
  201.     }  
  202. }  
  203. int main(void)  
  204. {  
  205.     int LENGTH_La,LENGTH_Lb;//线性表La的长度  
  206.     SqList La,Lb,Lc;    //  
  207.   
  208.         scanf("%d",&LENGTH_La);  
  209.         InitList_Sq(La);  
  210.         Creat_List_Sq(La,LENGTH_La);  
  211.         printf("创建好的线性表La=");  
  212.         Output_List_Sq(La);  
  213.   
  214.         int index;  
  215.         ElemType ELEM_1;  
  216.         scanf("%d%d", &ELEM_1, &index);  
  217.         ListInsert_Sq( La,  index, ELEM_1);  
  218.         printf("插入一个元素后的线性表La=");  
  219.         Output_List_Sq(La);  
  220.   
  221.         scanf("%d", &index);  
  222.         ListDelete_Sq( La, index, ELEM_1);  
  223.         printf("删除一个元素后的线性表La=");  
  224.         Output_List_Sq(La);  
  225.   
  226.         scanf("%d",&ELEM_1);  
  227.         if(SearchList_Sq(La,ELEM_1) == -1)  
  228.         {  
  229.             puts("没找到");  
  230.         }  
  231.         else  
  232.         {  
  233.             printf("找到,%d在第%d个位置/n",ELEM_1,SearchList_Sq(La,ELEM_1));  
  234.         }  
  235.   
  236.         ReversalList_Sq(La);  
  237.         printf("逆置后的线性表La=");  
  238.         Output_List_Sq(La);  
  239.   
  240.         scanf("%d",&LENGTH_Lb);  
  241.         InitList_Sq(Lb);  
  242.         Creat_List_Sq(Lb,LENGTH_Lb);  
  243.   
  244.         MergeList( La, Lb, Lc);  
  245.         printf("合并La和Lb后的线性表=");  
  246.         Output_List_Sq(Lc);  
  247.   
  248.     return 0;  
  249. }  

 

posted @ 2013-06-08 15:05  永不止步,永无止境  阅读(373)  评论(0)    收藏  举报