zoukankan      html  css  js  c++  java
  • 链表的顺序实现

    //线性顺序表的简单实现
    // 在这里要说的是代码讲究的是随机应变,,写代码讲究的是随意二字,
    // 一种需求你也许有几十种的办法实现,对代码要理解,,随性,,,,,


    #include <cstdio>
    #include <cstdlib>
    //#define _OJ_
    #define initlist_size 100
    #define increament 10

    typedef struct Lnode
    {
        int *elem;
        int List_size;//当前分配的存储容量
        int length;
    }List;


    void
    init_List(List *L)
    //创建一个顺序表
    {
        L->elem = (int*) malloc (initlist_size * sizeof(int));
        L->length = 0;
        L->List_size = initlist_size;
    }



    void
    inputlist(List *L, int n)
    {
        int i;
        for(i = 0;i < n; i++) {
        scanf("%d", &L->elem[i]);
         }
         L->length = n;
    }

    int
    list_length(List *L)
    {
        return L->length;
    }


    void
    List_delete(List *L, int i)
    //删除第i个元素
    {
        int j;
        if((i >= 1)  || i <= L->length)
        {
        for(j = i - 1;j < L->length; j++)
        L->elem[j] = L->elem[j + 1];
        }
        --L->length;
    }

    void
    List_delete(List *L, int i)
    //删除第i个元素
    {
        int *p, *q;
        if((i >= 1) || i <= L->length)
        {
        p = &(L->elem[i - 1]);
        q = L->elem + L->length - 1;
        for(p;p <= q; p++)
        *p = *(p + 1);
        }
        --L->length;
    //删除的第二个版本,依个人之鄙见,严奶奶的书中这种写法不好,
    // 顺序表与链表的区别就是指针,,而这种写法用了大量指针,,
        // 不能与之明显的比较
    }

    void
    List_insert(List *L, int i, int x)
    //在第I个元素后插入元素x
    {
        int j;
        if(i <= L->length)
        {
        for(j = L->length - 1;j >= i; j--)
            L->elem[j + 1] = L->elem[j];
        L->elem[i] = x;
        }
        ++L->length;
    }

    void
    List_insert(List *L, int i, int x)
    //在第I个元素后插入元素x
    {
        int *newbase;
        int *p, *q;
        if(L->length >= initlist_size)
        {
        newbase =
        (int*) realloc (L->elem, (initlist_size + increament) * sizeof(int));
        L->elem = newbase;
        L->length = initlist_size + increament;
        }


        if(i <= L->length)
        {
        p = &(L->elem[i]);
        q = L->elem + L->length - 1;
        for(q;q >= p; q--)
        *(q + 1) = *q;
        *p = x;
        }
        ++L->length;
        //插入的第二个版本,依个人之鄙见,严奶奶的书中这种写法不好,
    // 顺序表与链表的区别就是指针,,而这种写法用了大量指针,,
        // 不能与之明显的比较
    }



    void
    List_union(List *La, List *Lb, List *Lc)
    //实现顺序表的合并
    {
        int i = 0, j = 0, k = 0;
        Lc->length = La->length + Lb->length;
        while(i < La->length && j < Lb->length)
        {
        if(La->elem[i] <= Lb->elem[j])
        {Lc->elem[k] = La->elem[i]; i++;    k++;}
        else{
        Lc->elem[k] = La->elem[j]; j++;    k++;
        }
        }

        while (i < La->length) {
          Lc->elem[k] = La->elem[i]; i++;    k++;
        }

        while (j < Lb->length) {
          Lc->elem[k] = Lb->elem[j]; j++;    k++;
        }
    }


    void
    outputlist(List *L)
    {
        int i;
        for(i = 0;i < L->length; i++) {
        printf("第%d个元素%d ", i + 1, L->elem[i]);
         }
    }





    int main(int argc, char const *argv[]) {
    #ifndef _OJ_  //ONLINE_JUDGE
        freopen("input.txt", "r", stdin);
    #endif

        int n;
        List L;
        List La;
        List Lb, Lc;
        scanf("%d", &n);
        init_List(L);
        inputlist(L,n);
        outputlist(L);
        printf("长度为length == %d ", list_length(L));

        List_delete(L,1);
        outputlist(L);
        printf("长度为length == %d ", list_length(L));

        List_insert(L,1,4);
        outputlist(L);
        printf("长度为length == %d ", list_length(L));*/

        init_List(&La);
        inputlist(&La,n);
        outputlist(&La);
        init_List(&Lb);inputlist(&Lb,n);outputlist(&Lb);
        init_List(&Lc);
        printf("长度为length == %d ", list_length(&La));
        printf("长度为length == %d ", list_length(&Lb));
        List_union(&La,&Lb,&Lc);
        outputlist(&Lc);
         List_union(La,Lb,Lc);
         printf("长度为length == %d ", list_length(Lc));
         outputlist(Lc);


        return 0;
    }



    但是在实现合并两个表的时候,发现用List *la,*lb,*lc;

    init_list(La) init_list(Lb)

    不可以申请两个表,就算是申请最后两个表就变成一样的了。。。。

  • 相关阅读:
    makefile文件编写
    soem函数库的编译
    加秘钥的SSH
    ssh传文件
    ssh1
    安装paramiko的方法
    Ftp客户端(上传文件)
    ftp服务端
    vi编辑器没有颜色的解决办法
    socket服务器
  • 原文地址:https://www.cnblogs.com/airfand/p/4907734.html
Copyright © 2011-2022 走看看