线性表

来源:互联网 发布:淘宝拖鞋类目 编辑:程序博客网 时间:2024/06/11 18:30

数据结构(C语言实现)

分类: C/C++ 172人阅读 评论(0)收藏 举报

1.线性表的顺序存储

[cpp] view plaincopyprint?
  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. #define MAX 20   
  4. typedef int DataType ;  
  5. typedef struct  
  6. {  
  7.     int length;  
  8.     DataType data[MAX];  
  9.   
  10. }SqList;  
  11.   
  12. int InitList(SqList *L)  
  13. {  
  14.     //L=(SqList *)malloc(sizeof(SqList));   
  15.     L->length=0;  
  16.     return 0;  
  17. }  
  18.   
  19. int ListEmpty(SqList L)  
  20. {  
  21.     if(L.length==0)  
  22.         return 1;  
  23.     else  
  24.         return 0;  
  25. }  
  26.   
  27. int ClearList(SqList *L)  
  28. {  
  29.     L->length=0;  
  30.     return 0;  
  31. }  
  32.   
  33. int getData(SqList *L,int i,DataType *e)  
  34. {  
  35.     if(L->length==0||i<1||i>L->length)  
  36.         return 0;  
  37.     else  
  38.         *e=L->data[i-1];  
  39.     return 1;  
  40. }  
  41.   
  42. int ListInsert(SqList *L,int i,DataType e)  
  43. {  
  44.     int k;  
  45.     if(L->length==MAX)  
  46.     {  
  47.        // printf("顺序表已满\n");   
  48.         return 0;  
  49.     }  
  50.     if(i<0||i>L->length+1)  
  51.     {  
  52.         //printf("插入位置不合法\n");   
  53.         return 0;  
  54.     }  
  55.     else  
  56.     {  
  57.         for(k=L->length-1;k>=i-1;k--)  
  58.             L->data[k+1]=L->data[k];  
  59.     }  
  60.     L->data[i-1]=e;  
  61.     L->length++;  
  62.     return 1;  
  63. }  
  64.   
  65. int ListDelete(SqList *L,int i,DataType *e)  
  66. {  
  67.     int k;  
  68.     if(i<1||i>L->length)  
  69.         return 0;   //删除位置不正确  
  70.     if(L->length==0)  
  71.         return 0;   //空表  
  72.     *e=L->data[i-1];  
  73.     if(i<=L->length)  
  74.     {  
  75.          for(k=i;k<L->length;k++)  
  76.             L->data[k-1]=L->data[k];  
  77.     }  
  78.     L->length--;  
  79.     return 0;  
  80. }  
  81.   
  82. int ListTraverse(SqList L)  
  83. {  
  84.     int i;  
  85.     for(i=0;i<=L.length-1;i++)  
  86.     {  
  87.         printf("%3d",L.data[i]);  
  88.     }  
  89.     printf("\n");  
  90.     return 1;  
  91. }  
  92.   
  93. int main()  
  94. {  
  95.     int i,j,k;  
  96.     SqList L;  
  97.     DataType e;  
  98.     i=InitList(&L);  
  99.     printf("初始化后表长:%d\n",L.length);  
  100.   
  101.     for(j=1;j<=5;j++)  
  102.         i=ListInsert(&L,1,j);  
  103.     printf("表头插入数字1到5之后:");  
  104.     ListTraverse(L);  
  105.     printf("插入五个数字后表长:%d\n",L.length);  
  106.   
  107.     i=ListEmpty(L);  
  108.     printf("此时表是否为空(1代表是,0代表否):%d\n",i);  
  109.   
  110.     i=ClearList(&L);  
  111.     printf("\n清空表后,表长为%d\n",L.length);  
  112.     printf("此时表是否为空(1代表是,0代表否):%d\n",i);  
  113.     for(j=1;j<=5;j++)  
  114.         i=ListInsert(&L,j,j);  
  115.     printf("表尾插入五个数字之后:");  
  116.     ListTraverse(L);  
  117.     printf("插入五个数字后表长:%d\n",L.length);  
  118.   
  119.     getData(&L,3,&e);  
  120.     printf("第三个数字是:%d\n",e);  
  121.   
  122.     i=ListDelete(&L,2,&e);  
  123.     printf("删除第2个数据后为:");  
  124.     ListTraverse(L);  
  125.     printf("被删除的数字是:%d\n",e);  
  126.   
  127.     i=L.length;  
  128.     printf("输入想要删除的数据的序号:");  
  129.     scanf("%d",&k);  
  130.     if(k>i||k<=0)  
  131.         printf("删除位置不正确\n");  
  132.     else  
  133.     {  
  134.         i=ListDelete(&L,k,&e);  
  135.         printf("删除第%d个数字的值为%d,删除后表为",k,e);  
  136.         ListTraverse(L);  
  137.     }  
  138.     return 0;  
  139. }  

结果:



1>数组的下表从0开始,防止数组越界

2>注意指针的使用

3>设计程序时尽量考虑全面,各种可能出现的问题都包含在内

4>变量命名要有一定的含义,见其名知其意


2.线性表链式存储

[cpp] view plaincopyprint?
  1. #include<stdio.h>   
  2. #include<stdlib.h>   
  3. typedef int ElemType;  
  4. typedef struct Node  
  5. {  
  6.     ElemType data;  
  7.     struct Node *next;  
  8. }Node,*LinkList;  
  9.   
  10.   
  11. int InitList(LinkList *L)//初始化  
  12. {  
  13.     *L=(LinkList)malloc(sizeof(Node));  
  14.     if(!(*L))  
  15.         return 0;  
  16.     else  
  17.         (*L)->next=NULL;  
  18.     return 1;  
  19. }  
  20. //LinkList L,L有定义时,值要么为NULL,为一个空表,要么为第一个节点的地址,既头指针  
  21. int ListLength(LinkList L)//求表长,LinkList L指某链表的第一个节点地址放在指针变量L中  
  22. {  
  23.     int i=0;  
  24.     LinkList p=L->next;  
  25.     while(p)  
  26.     {  
  27.         i++;  
  28.         p=p->next;  
  29.     }  
  30.     return i;  
  31. }  
  32.   
  33. int ListEmpty(LinkList L)  
  34. {  
  35.     LinkList p=L->next;  
  36.     if(p)  
  37.         return 0;  
  38.     else  
  39.         return 1;  
  40. }  
  41.   
  42. int ClearList(LinkList *L)//整表删除  
  43. {  
  44.     LinkList p,q;  
  45.     p=(*L)->next;//P指向第一个结点   
  46.     while(p)  
  47.     {  
  48.         q=p->next;  
  49.         free(p);  
  50.         p=q;  
  51.     }  
  52.     (*L)->next=NULL;//头结点指针域为空   
  53.     return 1;  
  54. }  
  55.   
  56. int GetElem(LinkList L,int i,ElemType *e)  
  57. {  
  58.     int j=1;  
  59.     LinkList p;  
  60.     p=L->next;  
  61.     while(p&&j<i)  
  62.     {  
  63.         p=p->next;  
  64.         j++;  
  65.     }  
  66.     if(!p||j>i) //if(!p||j>=i)  
  67.     {  
  68.   
  69.         return 0;  
  70.     }  
  71.     *e=p->data;  
  72.     return 1;  
  73. }  
  74.   
  75. int ListTraverse(LinkList L)  
  76. {  
  77.     LinkList p=L->next;  
  78.     while(p)  
  79.     {  
  80.         printf("%3d",p->data);  
  81.         p=p->next;  
  82.     }  
  83.     printf("\n");  
  84.     return 1;  
  85. }  
  86.   
  87. int ListInsert(LinkList *L,int i,ElemType e)  
  88. {  
  89.     LinkList p,s;  
  90.     p=*L;  
  91.     int j=1;  
  92.     while(p&&j<i)  
  93.     {  
  94.         p=p->next;  
  95.         j++;  
  96.     }  
  97.     if(!p&&j>i)  
  98.     {  
  99.         return 0;  
  100.     }  
  101.     else  
  102.         s=(LinkList)malloc(sizeof(Node));  
  103.         s->data=e;  
  104.         s->next=p->next;  
  105.         p->next=s;  
  106.   
  107.     return 1;  
  108. }  
  109.   
  110. int ListDelete(LinkList *L,int i,ElemType *e)  
  111. {  
  112.     int j=1;  
  113.     LinkList p,q;  
  114.     p=*L;  
  115.     while(p->next&&j<i)  
  116.     {  
  117.         p=p->next;  
  118.         j++;  
  119.     }  
  120.     if(!(p->next)||j>i)  
  121.         return 0;  
  122.     q=p->next;  
  123.     p->next=q->next;  
  124.     *e=q->data;  
  125.     free(q);  
  126.     return  1;  
  127. }  
  128.   
  129. int main()  
  130. {  
  131.     LinkList L;  
  132.     ElemType e,f;  
  133.     int i,j,k,m;  
  134.     i=InitList(&L);  
  135.     printf("初始化后长度为:L.length=%d\n",ListLength(L));  
  136.   
  137.     for(j=1;j<=5;j++)  
  138.     {  
  139.         i=ListInsert(&L,1,j);  
  140.     }  
  141.     printf("在表头插入1到5之后:L.data=");  
  142.     ListTraverse(L);  
  143.   
  144.     printf("表长:ListLength=%d\n",ListLength(L));  
  145.   
  146.     i=ListEmpty(L);  
  147.     printf("表是否为空:i=%d(1代表是,0代表否)\n",i);  
  148.   
  149.     i=ClearList(&L);  
  150.     printf("清空表后表长:ListLength=%d\n",ListLength(L));  
  151.     i=ListEmpty(L);  
  152.     printf("表是否为空:i=%d(1代表是,0代表否)\n",i);  
  153.   
  154.     for(j=1;j<=5;j++)  
  155.     {  
  156.         i=ListInsert(&L,j,j);  
  157.     }  
  158.     printf("表尾插入1到5之后:L.data=");  
  159.     ListTraverse(L);  
  160.   
  161.     i=ListLength(L);  
  162.     printf("你想查找第几个元素?");  
  163.     scanf("%d",&k);  
  164.     if(k>0&&k<=i)  
  165.     {  
  166.         GetElem(L,k,&e);  
  167.         printf("第%d个元素的值是%d\n",k,e);  
  168.     }  
  169.     else  
  170.         printf("查找元素不存在\n");  
  171.   
  172.     j=ListLength(L);  
  173.     printf("你想删除第几个数字?");  
  174.     scanf("%d",&m);  
  175.     if(m>0&&m<=j)  
  176.     {  
  177.         ListDelete(&L, m,&f);  
  178.         printf("删除成功,删除的数字是%d\n",f);  
  179.         printf("删除后表为:");  
  180.         ListTraverse(L);  
  181.     }  
  182.     else  
  183.         printf("不存在此元素\n");  
  184.     return 0;  
  185. }  
原创粉丝点击