Chinaunix首页 | 论坛 | 博客
  • 博客访问: 876308
  • 博文数量: 284
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1960
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 16:41
文章分类

全部博文(284)

文章存档

2018年(5)

2017年(95)

2016年(69)

2015年(15)

2014年(100)

我的朋友

分类: 嵌入式

2017-09-30 14:01:48

转载自:http://blog.csdn.net/greenhandcgl/article/details/44859637
顺序表结构的实现:


[cpp] view plain copy
  1. #include   
  2. #include   
  3. #include   
  4.   
  5. #define LIST_INT_SIZE 100  
  6. #define LISTINCREMENT 10  
  7. #define OK 1  
  8. #define ERROR 0  
  9. #define TRUE 1  
  10. #define FALSE 0  
  11. #define OVERFLOW   -1  
  12.   
  13. typedef int ElemType;  
  14. typedef int Status;  
  15.   
  16. typedef struct{  
  17.     ElemType *elem;  
  18.     int length;  
  19.     int listsize;  
  20. }SqList;  
  21.   
  22. Status InitList(SqList *L)//初始化线性表  
  23. {  
  24.     L->elem = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType));  
  25.     if(!L->elem) exit(OVERFLOW);  
  26.     L->length = 0;  
  27.     L->listsize = LIST_INT_SIZE;  
  28.     return OK;  
  29. }  
  30.   
  31. Status DestroyList(SqList *L)//销毁线性表  
  32. {  
  33.     if(!L->elem) exit(ERROR);  
  34.     free(L->elem);  
  35.     L->elem = NULL;  
  36.     return OK;  
  37. }  
  38.   
  39. Status CreatList_Sq(SqList *L,int n)  
  40. {  
  41.     int i;  
  42.     printf("输入%d个整数:\n",n);  
  43.     for(i=0;i
  44.         scanf("\n%d",&L->elem[i]);  
  45.     return OK;  
  46. }  
  47.   
  48.   
  49. Status ClearList(SqList *L)//将线性表置为空表  
  50. {  
  51.     if(!L->elem) return ERROR;  
  52.     L->length = 0;  
  53.     return OK;  
  54. }  
  55.   
  56. Status ListEmpty(SqList *L)//判断线性表是否为空  
  57. {  
  58.     if(!L->elem || L->length < 0 || L->length > L->listsize) return ERROR;  
  59.     if(L->length == 0)  
  60.         return TRUE;  
  61.     else  
  62.         return FALSE;  
  63. }  
  64.   
  65. Status ListLength(SqList *L)//返回线性表长度  
  66. {  
  67.     if(!L->elem || L->length < 0 || L->length > L->listsize)  
  68.         return ERROR;  
  69.     return L->length;  
  70. }  
  71.   
  72. Status GetElem(SqList *L, int i, ElemType *e)//用e返回第i个元素的值  
  73. {  
  74.     if(!L->elem || i < 0 || i > L->length) return ERROR;  
  75.     *e = L->elem[i-1];  
  76.     return OK;  
  77. }  
  78.   
  79. Status LocatElem(SqList *L, ElemType e, int compare(void *, void *))  
  80. {  
  81.     if(!L->elem) return ERROR;  
  82.     int i;  
  83.     for(i = 0; i < L->length; i++){  
  84.         if(compare((ElemType *)e, (ElemType *)L->elem[i]) == TRUE)  
  85.             return i+1;  
  86.     }  
  87.     return FALSE;  
  88. }  
  89.   
  90. Status PriorElem(SqList *L, ElemType cur_e, ElemType *pre_e)  
  91. {  
  92.     int i;  
  93.     for (i = 1; i < L->listsize; i++) {  
  94.         if (L->elem[i] == cur_e) {  
  95.             *pre_e = L->elem[i-1]; /* 与Elemtype 相关*/  
  96.             return OK;  
  97.         }  
  98.     }  
  99.     return FALSE;  
  100. }  
  101.   
  102. Status NextElem(SqList *L, ElemType cur_e, ElemType *next_e)  
  103. {  
  104.     int i;  
  105.     for (i=0; i < L->listsize - 1; i++) {  
  106.         if (L->elem[i] == cur_e) {  
  107.             *next_e = (int )L->elem[i+1];  /* 与Elemtype 相关*/  
  108.             return OK;  
  109.         }  
  110.     }  
  111.     return FALSE;  
  112. }  
  113.   
  114.   
  115. Status ListInsert(SqList *L, int i, ElemType e)//向线性表中插入元素  
  116. {  
  117.     ElemType *newbase;  
  118.     if(i < 1 || i > L->length+1) return ERROR;  
  119.     if(L->length >= L->listsize)  
  120.     {  
  121.         newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType));  
  122.         if(!newbase) exit(OVERFLOW);  
  123.         L->elem = newbase;  
  124.         L->listsize += LISTINCREMENT;  
  125.     }  
  126.     ElemType *q = &(L->elem[i-1]);  
  127.     ElemType *p;  
  128.     for(p = &(L->elem[L->length-1]); p>=q; --p)  
  129.         *(p+1) = *p;  
  130.     *q = e;  
  131.     ++L->length;  
  132.     return OK;  
  133. }  
  134.   
  135. Status ListDelete(SqList *L, int i, ElemType e)//从线性表中删除元素  
  136. {  
  137.     if(i<1 || i>L->length) return ERROR;  
  138.     ElemType *p = &(L->elem[i-1]);  
  139.     e = *p;  
  140.     ElemType *t = &(L->elem[L->length-1]);  
  141.     for(++p; p <= t; ++p) *(p-1) = *p;  
  142.     --L->length;  
  143.     return OK;  
  144. }  
  145.   
  146. Status ListTraverse(SqList *L, int (* visit)(void *))  
  147. {  
  148.     int i;  
  149.     for (i = 0; i < L->length; i++)  
  150.         //如果失败  
  151.         if (!visit((int *)L->elem[i]))/* 与Elemtype 相关*/  
  152.             return ERROR;  
  153.         return TRUE;  
  154. }  
  155.   
  156. Status ListPrint(SqList *L)  
  157. {  
  158.     int i;  
  159.     if (!L->elem || L->length < 1 || L->length > L->listsize){  
  160.         printf("empty!\n");  
  161.         return ERROR;  
  162.     }  
  163.     for (i = 0; i < L->length; i++) {  
  164.         printf("%5d ", L->elem[i]);  
  165.     }  
  166.     printf("\n");  
  167.     return TRUE;  
  168. }  
测试代码:



[cpp] view plain copy
  1. int main()  
  2. {  
  3.     int i,n;  
  4.     SqList a;  
  5.     SqList *l = &a;  
  6.     if(InitList(l)==-2)   printf("分配失败");  
  7.     printf("\n输入要建立的线性表l的长度n:");//输入线性表得长度  
  8.     scanf("%d",&n);  
  9.     l->length=n;  
  10.     printf("线性表的长度是:%d\n",l->length);  
  11.     CreatList_Sq(l,n);//生成线性表  
  12.     puts("原序:");//输出线性表中的元素  
  13.     ListPrint(l);  
  14.     puts("");  
  15.     int ce, pe;  
  16.     printf("请输入要查找前驱的元素:");  
  17.     scanf("%d", &ce);  
  18.     PriorElem(l, ce, &pe);  
  19.     printf("%d的前驱是%d\n", ce, pe);  
  20.     NextElem(l, ce, &pe);  
  21.     printf("%d的后继是%d\n", ce, pe);   
  22.       
  23.     printf("请输入要插入的元素和插入位置:");  
  24.     scanf("%d%d", &ce,&pe);  
  25.     ListInsert(l, pe,ce);  
  26.     printf("插入元素%d后的线性表为\n", ce);  
  27.     ListPrint(l);  
  28.       
  29.     printf("请输入要删除元素位置:");  
  30.     scanf("%d", &ce);  
  31.     ListDelete(l, ce, pe);  
  32.     printf("删除%d位置的font-family: Arial, Helvetica, sans-serif;">元素font-family: Arial, Helvetica, sans-serif;">后的线性表为\n", ce);  
[cpp] view plain copy
  1. ListPrint(l);  
  2. DestroyList(l);//销毁顺序表   
  3. return 0;  

运行结果:


阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~