码迷,mamicode.com
首页 > 其他好文 > 详细

链表的顺序实现

时间:2015-10-24 23:10:25      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:

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


#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\n", 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\n", list_length(L));

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

    List_insert(L,1,4);
    outputlist(L);
    printf("长度为length == %d\n", 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\n", list_length(&La));
    printf("长度为length == %d\n", list_length(&Lb));
    List_union(&La,&Lb,&Lc);
    outputlist(&Lc);
     List_union(La,Lb,Lc);
     printf("长度为length == %d\n", list_length(Lc));
     outputlist(Lc);


    return 0;
}



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

init_list(La) init_list(Lb)

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

链表的顺序实现

标签:

原文地址:http://www.cnblogs.com/airfand/p/4907734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!