# 数据结构-顺序表和链式表

第一次在CSDN上写东西,心里有点激动,希望自己可以坚持下去。
嘿嘿嘿,算是在CSDN上出道了。
文章简单的描述了一下,我在某科上机遇到的一点问题…
个人笔记使用,轻喷,附有源码,欢迎交流…

附件下载地址:
http://download.csdn.net/detail/qq_29747591/9529037

顺序表

顺序表是采用的连续的存储结构
结构为:

1.表长度
2.指向的数据
3.存储的空间(可以再分配)

typedef struct{  
    ElemType * elem;
    int length;
    int listsize;
}SqList;

顺序表的一些要点:

  1. 初始化. 分配listsize大小的空间
  2. 长度设置为0
  3. 清空顺序表的话就是将长度设置为0

。。。其他感觉没有什么好记的

//初始化顺序表 IntiaList
status IntiaList(SqList & L){
    int n;
    L.elem = (ElemType  *)malloc(LIST_INIT_SIZE * sizeof(ElemType *));
    if (!L.elem) exit(OVERFLOW);
    L.length = 0;//将其置为空
    L.listsize = LIST_INIT_SIZE;
    printf("please input the number of the data!\n");
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        printf("please intput the value of the number %d:", i+1);
        scanf("%d", &L.elem[i]);
        L.length++;
    }
    return OK;
}
  • L.elem = (ElemType )malloc(LIST_INIT_SIZE sizeof(ElemType *));
  • 获得的L.elem相当于数组,但是在VS调试的过程中,是无法向数组那样看到里面的值的

    只显示了一个值 vs上面的一个截图
    看不到我表的下一个项的值…-_-我一直以为我写错了,查了很久

  • 表的插入:找到初始情况;
    两个temp类似于游标的感觉不停的重复——–循环过程
    结束判定;
    灵魂画手
status ListInsert(SqList & L, int i, ElemType e){   
    ElemType q, p, *newbase;
    //插入不符合规则
    if (i<1 || i>L.length) return FALSE;
    else
    {
        L.length++;
        if (L.length >= L.listsize){
            newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));//扩展该内存
            if (!newbase) return(OVERFLOW);
            L.elem = newbase;
            L.listsize += LISTINCREMENT;
        }
        i--;
        p = L.elem[i];
        q = L.elem[i+1];
        L.elem[i] = e; 

        //初始过程


        for (; i < L.length-1; i++)
        {
            L.elem[i+1] = p;
            p = q;
            q = L.elem[i + 2];
        }

        return OK;
    }

链表

  1. 链表的结构

结构体的递归

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*Linklist;
  1. 初始化链表

这是一个倒序插入的代码 输入1,2,3,插入3,2,1
原因是L->next固定不变,也就是插入的位置永远是头节点后面的那一个!

//初始化链表 IntiaList
status IntiaList(Linklist &L){
    Linklist p ,temp;

    //temp指向为空
    //Linklist temp;
    //temp = L;


    int n;
    printf("please input the number of the data!\n");
    scanf("%d", &n);
    if (!L) exit(OVERFLOW);
    L = (Linklist)malloc(LIST_INIT_SIZE * sizeof(LNode));
    L->next = NULL;
    temp = L;
    //为什么是指针就不可以了呢
    for (int i =0; i < n; i++)
    {
        p = (Linklist)malloc(sizeof(LNode));
        if (!p) exit(OVERFLOW);
        printf("please intput the value of the number %d:", i+1);
        scanf("%d",&p->data);

        p->next = L->next;
        L->next = p;
        //插入顺序是倒序的

        p->next = temp->next;
        temp->next = p;
        temp = temp->next;

    }
    return OK;
}

但是如果生成一个temp的结构体指针来移动就可以实现顺着插入。

//初始化链表 IntiaList
status IntiaList(Linklist &L){
    Linklist p ,temp;

    //temp指向为空
    //Linklist temp;
    //temp = L;


    int n;
    printf("please input the number of the data!\n");
    scanf("%d", &n);
    if (!L) exit(OVERFLOW);
    L = (Linklist)malloc(LIST_INIT_SIZE * sizeof(LNode));
    L->next = NULL;
    //要在L初始化了再指向
    temp = L;
    for (int i =0; i < n; i++)
    {
        p = (Linklist)malloc(sizeof(LNode));
        if (!p) exit(OVERFLOW);
        printf("please intput the value of the number %d:", i+1);
        scanf("%d",&p->data);


        //头指针移动了
        p->next = L->next;
        L->next = p;
        L = L->next;


        p->next = temp->next;
        temp->next = p;
        temp = temp->next;

    }
    return OK;
}


----------
其他感觉没什么好记的了,
编程的话,还是要注意以下数组的序号,和累计数的对应关系
int i=0;i<n;i++(循环n次)

...因为老师给了模板是C++的,有引用的概念,我的代码就看起来有点奇怪..
希望对大家有用!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值