线性表

数据结构(C语言实现)

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

1.线性表的顺序存储

  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. }  
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
typedef int DataType ;
typedef struct
{
    int length;
    DataType data[MAX];

}SqList;

int InitList(SqList *L)
{
    //L=(SqList *)malloc(sizeof(SqList));
    L->length=0;
    return 0;
}

int ListEmpty(SqList L)
{
    if(L.length==0)
        return 1;
    else
        return 0;
}

int ClearList(SqList *L)
{
    L->length=0;
    return 0;
}

int getData(SqList *L,int i,DataType *e)
{
    if(L->length==0||i<1||i>L->length)
        return 0;
    else
        *e=L->data[i-1];
    return 1;
}

int ListInsert(SqList *L,int i,DataType e)
{
    int k;
    if(L->length==MAX)
    {
       // printf("顺序表已满\n");
        return 0;
    }
    if(i<0||i>L->length+1)
    {
        //printf("插入位置不合法\n");
        return 0;
    }
    else
    {
        for(k=L->length-1;k>=i-1;k--)
            L->data[k+1]=L->data[k];
    }
    L->data[i-1]=e;
    L->length++;
    return 1;
}

int ListDelete(SqList *L,int i,DataType *e)
{
    int k;
    if(i<1||i>L->length)
        return 0;   //删除位置不正确
    if(L->length==0)
        return 0;   //空表
    *e=L->data[i-1];
    if(i<=L->length)
    {
         for(k=i;k<L->length;k++)
            L->data[k-1]=L->data[k];
    }
    L->length--;
    return 0;
}

int ListTraverse(SqList L)
{
    int i;
    for(i=0;i<=L.length-1;i++)
    {
        printf("%3d",L.data[i]);
    }
    printf("\n");
    return 1;
}

int main()
{
    int i,j,k;
    SqList L;
    DataType e;
    i=InitList(&L);
    printf("初始化后表长:%d\n",L.length);

    for(j=1;j<=5;j++)
        i=ListInsert(&L,1,j);
    printf("表头插入数字1到5之后:");
    ListTraverse(L);
    printf("插入五个数字后表长:%d\n",L.length);

    i=ListEmpty(L);
    printf("此时表是否为空(1代表是,0代表否):%d\n",i);

    i=ClearList(&L);
    printf("\n清空表后,表长为%d\n",L.length);
    printf("此时表是否为空(1代表是,0代表否):%d\n",i);
    for(j=1;j<=5;j++)
        i=ListInsert(&L,j,j);
    printf("表尾插入五个数字之后:");
    ListTraverse(L);
    printf("插入五个数字后表长:%d\n",L.length);

    getData(&L,3,&e);
    printf("第三个数字是:%d\n",e);

    i=ListDelete(&L,2,&e);
    printf("删除第2个数据后为:");
    ListTraverse(L);
    printf("被删除的数字是:%d\n",e);

    i=L.length;
    printf("输入想要删除的数据的序号:");
    scanf("%d",&k);
    if(k>i||k<=0)
        printf("删除位置不正确\n");
    else
    {
        i=ListDelete(&L,k,&e);
        printf("删除第%d个数字的值为%d,删除后表为",k,e);
        ListTraverse(L);
    }
    return 0;
}

结果:



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

2>注意指针的使用

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

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


2.线性表链式存储

  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. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值