程序实例---线性表的顺序实现和链式实现

 顺序实现

  
  
  
  
  1. .h文件 此文件为方法
  2. #ifndef SQLIST_H_INCLUDED 
  3. #define SQLIST_H_INCLUDED 
  4. #include "ds.h" //for Status,OK ... 
  5. #ifndef ElemType 
  6. #define ElemType int /* 数据元素类型默认为 int */ 
  7. #define ELEMTYPE_TAG 
  8. #endif 
  9. /********************************************************** 
  10. *  顺序表的存储结构定义  
  11. ***********************************************************/ 
  12. #define LIST_INIT_SIZE 100 /* 存储空间初始分配容量 */ 
  13. #define LISTINCREMENT 10 /* 存储空间分配的增量 */ 
  14. typedef struct { 
  15.     ElemType *elem;    //存储空间基址 
  16.     int length;        //当前长度  
  17.     int listsize;      //当前已分配的存储空间(元素个数)  
  18. } SqList; 
  19. /********************************************************** 
  20. *  顺序表的基本操作声明 
  21. ***********************************************************/ 
  22. //创建并初始化为空表  
  23. Status InitList(SqList &L); 
  24. //销毁整个表(从此之后不再可用)  
  25. Status DestroyList(SqList &L); 
  26. //将表L置空  
  27. Status ClearList(SqList &L); 
  28. //判断表L是否为空表  
  29. bool ListEmpty(SqList L); 
  30. //求表L的长度  
  31. int ListLength(SqList L); 
  32. //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR  
  33. Status GetElem(SqList L, int i, ElemType &e); 
  34. template <typename T> bool equal(T a, T b) 
  35.     return a==b; 
  36. //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0  
  37. //    compare(a,b) 为比较函数,匹配时返回true,否则返回false  
  38. //                 这里默认使用equal进行比较  
  39. int LocateElem(SqList L, ElemType e,  
  40.       bool (*compare)(ElemType,ElemType)=equal<ElemType>); 
  41. //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR 
  42. Status ListInsert(SqList &L, int i, ElemType e); 
  43. //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR  
  44. Status ListDelete(SqList &L, int i, ElemType &e); 
  45. //遍历表L,对每个元素调用visit(x).  
  46. Status ListTraverse(SqList L, Status (*visit)(ElemType)); 
  47. /********************************************************** 
  48. *  顺序表的基本操作的实现 
  49. ***********************************************************/ 
  50. //创建并初始化为空表  
  51. Status InitList(SqList &L) 
  52.     // TODO (#1#): 创建空表 
  53.     L.elem=(ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)); 
  54.     if(!L.elem)exit(OVERFLOW); 
  55.     L.length=0
  56.     L.listsize=LIST_INIT_SIZE
  57.     return OK; 
  58.     //------------------------------------- 
  59. //销毁整个表(从此之后不再可用)  
  60. Status DestroyList(SqList &L) 
  61.     free(L.elem); 
  62.     return OK; 
  63.     //------------------------------------- 
  64. //将表L置空  
  65. Status ClearList(SqList &L) 
  66.     // TODO (#1#): 清空表 
  67.     L.length=0
  68.     return OK; 
  69.     //------------------------------------- 
  70. //判断表L是否为空表  
  71. bool ListEmpty(SqList L) 
  72.     // TODO (#1#): 顺序表判空  
  73.     if(L.length==0) 
  74.         return TRUE; 
  75.     else 
  76.     return FALSE; 
  77.     //------------------------------------- 
  78.  
  79. //求表L的长度  
  80. int ListLength(SqList L) 
  81.     // TODO (#1#): 求顺序表长度 
  82.     return  L.length; 
  83.     //------------------------------------- 
  84.  
  85. //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR  
  86. Status GetElem(SqList L, int i, ElemType &e) 
  87.     // TODO (#1#): 取元素 
  88.     if(ListEmpty(L)) 
  89.     { 
  90.         printf("线性表L为空\n"); 
  91.         return ERROR; 
  92.     }  
  93.     if(i<1||i>L.length) 
  94.     { 
  95.         printf("不存在%d位置的元素\n",i); 
  96.         return ERROR; 
  97.     } 
  98.     e=L.elem[i-1]; 
  99.     return OK;  
  100.     //------------------------------------- 
  101.  
  102. //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0  
  103. //    compare(a,b) 为比较函数,匹配时返回true,否则返回false  
  104. int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType)) 
  105.     // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素 
  106.     for (int j=0; j<L.length; j++) 
  107.         if ( compare(L.elem[j],e) )  return j+1; 
  108.     return 0; 
  109.     //------------------------------------- 
  110.  
  111.  
  112. //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR 
  113. Status ListInsert(SqList &L, int i, ElemType e) 
  114.     // TODO (#1#): 在链表中插入元素 
  115.     if(i<1 || i>L.length+1) 
  116.         return ERROR; 
  117.      if (L.length >= L.listsize) //判读存储空间是否已满 
  118.     { 
  119.         ElemType * newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)); 
  120.         if (!newbase) 
  121.             exit(OVERFLOW); 
  122.         L.elem = newbase
  123.         LL.listsize = L.listsize + LISTINCREMENT; 
  124.     } 
  125.     ElemType *q = &(L.elem[i - 1]); //q指向第i个元素 
  126.     ElemType *p;                     //p指向最后一个元素 
  127.  
  128.     for (p= &(L.elem[L.length - 1]); p >= q; p--) //从最后一个位置开始移动 
  129.     { 
  130.         *(p + 1) = *p; 
  131.     } 
  132.  
  133.     *q = e
  134.     L.length++; 
  135.     return ERROR; 
  136.     //------------------------------------- 
  137.  
  138. //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR  
  139. Status ListDelete(SqList &L, int i, ElemType &e) 
  140.     // TODO (#1#): 在顺序表中删除元素 
  141. if (L.length == 0) //判断表是否为空 
  142.     { 
  143.         printf("表为空\n"); 
  144.         return ERROR; 
  145.     } 
  146.  
  147.     if (i < 1 || i > L.length) //判断删除位置是否合法 
  148.     { 
  149.         printf("删除位置不合法\n"); 
  150.         return ERROR; 
  151.     } 
  152.  
  153.     ElemType *p = &(L.elem[i - 1]); //p指向待删除的元素 
  154.     e = *p; 
  155.     ElemType *q = &(L.elem[L.length - 1]); 
  156.     //ElemType *q = L->elem + L->length - 1; //q指向最后一个元素 
  157.     for (pp = p + 1; p <= q; p++) //p从待删除的后一个元素开始,直到最后一个元素,每个元素一次向前移动一个位置 
  158.     { 
  159.         *(p - 1) = *p; 
  160.     } 
  161.  
  162.     L.length--; //最后,线性表长度减一 
  163.  
  164.     return OK; 
  165.     //------------------------------------- 
  166.  
  167. //遍历表L,对每个元素调用visit(x).  
  168. Status ListTraverse(SqList L, Status (*visit)(ElemType)) 
  169.     // TODO (#1#): 遍历顺序表  
  170.     for (int j=0; j<L.length; j++) 
  171.         if ( ! visit(L.elem[j]) )  return ERROR; 
  172.     return OK; 
  173.     //------------------------------------- 

  
  
  
  
  1. .cpp文件 此文件为主函数
  2. #ifdef ELEMTYPE_TAG 
  3. #undef ElemType 
  4. #undef ELEMTYPE_TAG 
  5. #endif 
  6. #endif  // SQLIST_H_INCLUDED 
  7. #include <stdio.h> 
  8. #include <stdlib.h> 
  9. #include "ds.h" 
  10. #define ElemType int                 //数据元素的类型  
  11. Status print(ElemType e);            // 打印数据元素的方法 
  12. bool equal(ElemType a, ElemType b);  //比较两个元素相等的方法  
  13. #include "sqlist.h" 
  14. //打印顺序表内容  
  15. void PrintLinkList(SqList L); 
  16. int main() 
  17.     SqList L; 
  18.      
  19.     //1)初始化顺序表  
  20.     InitList(L); 
  21.      
  22.     //2)插入一些元素: 12,23,34,45 
  23.     ListInsert(L,1,12); 
  24.     ListInsert(L,1,23); 
  25.     ListInsert(L,1,34); 
  26.     ListInsert(L,1,45); 
  27.      
  28.     //3)打印顺序表信息  
  29.     printf("\n开始时顺序表内容\n"); 
  30.     PrintLinkList(L); 
  31.     printf("ListLength(L) : %d\n", ListLength(L)); 
  32.     printf("ListEmpty(L)  : %d\n", ListEmpty(L)); 
  33.      
  34.     //4)顺序表插入  
  35.     printf("\n请输入一个元素:");  
  36.     ElemType x; 
  37.     read(x); 
  38.     printf("插入开头:"); 
  39.     ListInsert(L,1,x); 
  40.     PrintLinkList(L); 
  41.     printf("插入末尾:");  
  42.     ListInsert(L,ListLength(L)+1,x); 
  43.     PrintLinkList(L); 
  44.      
  45.     //5)顺序表删除 
  46.     printf("\n请选择删除第i(1..%d)个元素:", ListLength(L)); 
  47.     int i; 
  48.     read(i); 
  49.     ElemType e;  
  50.     if ( ListDelete(L,i,e)==OK ) { 
  51.         Status print(ElemType e);  //声明print(e)函数  
  52.          
  53.         printf("删除"); print(e); 
  54.         printf("成功\n"); 
  55.     } else 
  56.         printf("删除失败.\n"); 
  57.     printf("顺序表内容:"); 
  58.     PrintLinkList(L); 
  59.      
  60.     //6)元素定位 
  61.     printf("\n请输入一个元素以便定位:"); 
  62.     read(x); 
  63.     i = LocateElem(L,x); 
  64.     if ( i!=0 ) { 
  65.         printf("该元素是表中的第%d个元素.\n",i); 
  66.     } else 
  67.         printf("该元素在表中不存在.\n");  
  68.      
  69.     //7)清空顺序表 
  70.     ClearList(L); 
  71.     printf("\n最后顺序表内容\n"); 
  72.     PrintLinkList(L); 
  73.     printf("ListLength(L) : %d\n", ListLength(L)); 
  74.     printf("ListEmpty(L)  : %d\n", ListEmpty(L)); 
  75.       
  76.     //8)销毁顺序表  
  77.     DestroyList(L); 
  78.      
  79.     system("PAUSE"); 
  80.     return 0; 
  81.  
  82. // 打印数据元素的方法  
  83. Status print(ElemType e) 
  84.     printf("%5d",e); 
  85.     return OK; 
  86.  
  87. //比较两个元素相等的方法 
  88. bool equal(ElemType a, ElemType b) 
  89.     return a==b; 
  90.  
  91. //打印顺序表内容  
  92. void PrintLinkList(SqList L) 
  93.     ListTraverse(L,print); //遍历顺序表并print()每个元素  
  94.     printf("\n"); 

 线性表的链式实现

  
  
  
  
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.  
  4. #include "ds.h" 
  5.  
  6. #define ElemType int                 //数据元素的类型  
  7. Status print(ElemType e);            // 打印数据元素的方法 
  8. bool equal(ElemType a, ElemType b);  //比较两个元素相等的方法  
  9.  
  10. #include "linklist.h" 
  11.  
  12. //打印链表内容  
  13. void PrintLinkList(LinkList L); 
  14.  
  15. int main() 
  16.     LinkList L; 
  17.      
  18.     //1)初始化链表  
  19.     InitList(L); 
  20.      
  21.     //2)插入一些元素: 12,23,34,45 
  22.     ListInsert(L,1,12); 
  23.     ListInsert(L,1,23); 
  24.     ListInsert(L,1,34); 
  25.     ListInsert(L,1,45); 
  26.      
  27.     //3)打印链表信息  
  28.     printf("\n开始时链表内容\n"); 
  29.     PrintLinkList(L); 
  30.     printf("ListLength(L) : %d\n", ListLength(L)); 
  31.     printf("ListEmpty(L)  : %d\n", ListEmpty(L)); 
  32.      
  33.     //4)链表插入  
  34.     printf("\n请输入一个元素:");  
  35.     ElemType x; 
  36.     read(x); 
  37.     printf("插入开头:"); 
  38.     ListInsert(L,1,x); 
  39.     PrintLinkList(L); 
  40.     printf("插入末尾:");  
  41.     ListInsert(L,ListLength(L)+1,x); 
  42.     PrintLinkList(L); 
  43.      
  44.     //5)链表删除 
  45.     printf("\n请选择删除第i(1..%d)个元素:", ListLength(L)); 
  46.     int i; 
  47.     read(i); 
  48.     ElemType e;  
  49.     if ( ListDelete(L,i,e)==OK ) { 
  50.         Status print(ElemType e);  //声明print(e)函数  
  51.          
  52.         printf("删除"); print(e); 
  53.         printf("成功\n"); 
  54.     } else 
  55.         printf("删除失败.\n"); 
  56.     printf("链表内容:"); 
  57.     PrintLinkList(L); 
  58.      
  59.     //6)元素定位 
  60.     printf("\n请输入一个元素以便定位:"); 
  61.     read(x); 
  62.     i = LocateElem(L,x); 
  63.     if ( i!=0 ) { 
  64.         printf("该元素是表中的第%d个元素.\n",i); 
  65.     } else 
  66.         printf("该元素在表中不存在.\n");  
  67.      
  68.     //7)清空链表 
  69.     ClearList(L); 
  70.     printf("\n最后链表内容\n"); 
  71.     PrintLinkList(L); 
  72.     printf("ListLength(L) : %d\n", ListLength(L)); 
  73.     printf("ListEmpty(L)  : %d\n", ListEmpty(L)); 
  74.       
  75.     //8)销毁链表  
  76.     DestroyList(L); 
  77.      
  78.     system("PAUSE"); 
  79.     return 0; 
  80.  
  81. // 打印数据元素的方法  
  82. Status print(ElemType e) 
  83.     printf("%5d",e); 
  84.     return OK; 
  85.  
  86. //比较两个元素相等的方法 
  87. bool equal(ElemType a, ElemType b) 
  88.     return a==b; 
  89.  
  90. //打印链表内容  
  91. void PrintLinkList(LinkList L) 
  92.     ListTraverse(L,print); //遍历链表并print()每个元素  
  93.     printf("\n"); 

 

  
  
  
  
  1. #ifndef LINKLIST_H_INCLUDED 
  2. #define LINKLIST_H_INCLUDED 
  3.  
  4. #include "ds.h" //for Status,OK ... 
  5.  
  6. #ifndef ElemType 
  7. #define ElemType int /* 数据元素类型默认为 int */ 
  8. #define ELEMTYPE_TAG 
  9. #endif 
  10.  
  11. /********************************************************** 
  12. *  单链表的存储结构定义  
  13. ***********************************************************/ 
  14. typedef struct LNode { 
  15.     ElemType data; 
  16.     struct LNode *next; 
  17. } LNode, *LinkList; 
  18.  
  19.  
  20. /********************************************************** 
  21. *  单链表的基本操作声明 
  22. ***********************************************************/ 
  23.  
  24. //创建并初始化为空表  
  25. Status InitList(LinkList &L); 
  26.  
  27. //销毁整个表(从此之后不再可用)  
  28. Status DestroyList(LinkList &L); 
  29.  
  30. //将表L置空  
  31. Status ClearList(LinkList &L); 
  32.  
  33. //判断表L是否为空表  
  34. bool ListEmpty(LinkList L); 
  35.  
  36. //求表L的长度  
  37. int ListLength(LinkList L); 
  38.  
  39. //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR  
  40. Status GetElem(LinkList L, int i, ElemType &e); 
  41.  
  42. template <typename T> bool equal(T a, T b) 
  43.     return a==b; 
  44. //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0  
  45. //    compare(a,b) 为比较函数,匹配时返回true,否则返回false  
  46. //                 这里默认使用equal进行比较  
  47. int LocateElem(LinkList L, ElemType e,  
  48.       bool (*compare)(ElemType,ElemType)=equal<ElemType>); 
  49.  
  50. //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR 
  51. Status ListInsert(LinkList &L, int i, ElemType e); 
  52.  
  53. //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR  
  54. Status ListDelete(LinkList &L, int i, ElemType &e); 
  55.  
  56. //遍历表L,对每个元素调用visit(x).  
  57. Status ListTraverse(LinkList L, Status (*visit)(ElemType)); 
  58.   
  59.  
  60. /********************************************************** 
  61. *  单链表的基本操作的实现 
  62. ***********************************************************/ 
  63.  
  64. //创建并初始化为空表  
  65. Status InitList(LinkList &L) 
  66.     // TODO (#1#): 创建空表 
  67.     L=(LinkList)malloc(sizeof(LNode)); 
  68.     if(!L) exit(OVERFLOW); 
  69.     L->next=NULL
  70.     return OK; 
  71.     //------------------------------------- 
  72.  
  73. //销毁整个表(从此之后不再可用)  
  74. Status DestroyList(LinkList &L) 
  75.     // TODO (#1#): 销毁表  
  76.     LinkList q; 
  77.     while(L) 
  78.     { 
  79.         q=L->next; 
  80.         free(L); 
  81.         L=q
  82.     } 
  83.     return OK; 
  84.     //------------------------------------- 
  85.  
  86. //将表L置空  
  87. Status ClearList(LinkList &L) 
  88.     // TODO (#1#): 清空表 
  89.     LinkList p,q; 
  90.     p=L->next; 
  91.     while(p) 
  92.     { 
  93.        q=p->next; 
  94.        free(p); 
  95.        p=q
  96.     } 
  97.     L->next=NULL
  98.     return OK; 
  99.     //------------------------------------- 
  100.  
  101. //判断表L是否为空表  
  102. bool ListEmpty(LinkList L) 
  103.     // TODO (#1#): 链表判空  
  104.      if(L->next==NULL) 
  105.          return TRUE; 
  106.      else 
  107.     return FALSE; 
  108.     //------------------------------------- 
  109.  
  110. //求表L的长度  
  111. int ListLength(LinkList L) 
  112.     // TODO (#1#): 链表求长度 
  113.     LinkList p=L
  114.     int length=0
  115.     while(p->next) 
  116.     { 
  117.        ++length; 
  118.        pp=p->next; 
  119.     } 
  120.     return length; 
  121.     //------------------------------------- 
  122.  
  123. //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR  
  124. Status GetElem(LinkList L, int i, ElemType &e) 
  125.     // TODO (#1#): 实现取元素GetElem(L,i,&e) 
  126.     LinkList p; 
  127.     int j=1
  128.     p=L->next; 
  129.     while(p && j<i
  130.     { 
  131.         pp=p->next;  
  132.         j++; 
  133.     } 
  134.     if(!p||j>i) return ERROR; 
  135.     e=p->data; 
  136.     return OK;  
  137.     //------------------------------------- 
  138.  
  139. //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0  
  140. //    compare(a,b) 为比较函数,匹配时返回true,否则返回false  
  141. int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)) 
  142.     // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素 
  143.     LinkList p; 
  144.    int j;     
  145.    p = L->next; j = 0
  146.     while(p!=NULL) { 
  147.         j++; 
  148.         if( compare(p->data,e) )  return j; 
  149.         pp=p->next; 
  150.     } 
  151.     return 0; 
  152.     //------------------------------------- 
  153.  
  154.  
  155. //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR 
  156. Status ListInsert(LinkList &L, int i, ElemType e) 
  157.     // TODO (#1#): 在链表中插入元素 
  158.     LinkList p=L; int j=0
  159.     while(p && j<i-1
  160.     { 
  161.         pp=p->next; 
  162.         j++; 
  163.     } 
  164.     if(!p||j>i-1)return ERROR; 
  165.     LinkList s=(LinkList)malloc (sizeof(LNode)); 
  166.     s->data=e; s->next=NULL
  167.     s->next=p->next; p->next=s
  168.     return OK; 
  169.     //------------------------------------- 
  170.  
  171. //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR  
  172. Status ListDelete(LinkList &L, int i, ElemType &e) 
  173.     // TODO (#1#): 在链表中删除元素 
  174.     LinkList p=L
  175.     LinkList q; 
  176.     int j=0
  177.     while(p->next && j<i-1
  178.     { 
  179.        pp=p->next; 
  180.        j++; 
  181.     } 
  182.     if(!(p->next)||j>i-1) return ERROR; 
  183.     q=p->next; 
  184.     p->next=q->next; 
  185.     e=q->data; 
  186.     free(q); 
  187.     return OK; 
  188.     //------------------------------------- 
  189.  
  190. //遍历表L,对每个元素调用visit(x).  
  191. Status ListTraverse(LinkList L, Status (*visit)(ElemType)) 
  192.     LinkList p = L->next; 
  193.     while ( p ) { 
  194.         if ( visit(p->data)==ERROR )  return ERROR; 
  195.         pp = p->next; 
  196.     } 
  197.     return OK; 
  198.  
  199.  
  200. #ifdef ELEMTYPE_TAG 
  201. #undef ElemType 
  202. #undef ELEMTYPE_TAG 
  203. #endif 
  204.  
  205. #endif  // LINKLIST_H_INCLUDED 

你可能感兴趣的:(insert,顺序表的实现)