数据结构-静态链表

静态链表

双数组实现(没有free)

/*
    静态链表,双数组实现。
    下面的写法很简洁,但是是具有局限性的,首先它删除的结点就不能free利用。还有分头插尾插。。。。。
*/



# include<stdio.h>
# include<stdlib.h>

# define OK 1
# define ERROR 0


const int N = 10000;
int head,e[N],ne[N],idx; //head 指针指向头结点 e[]数组保存的是链表中的数,ne[]中是next指针,俩个通过下标关联起来,idx保存的是内存用到了哪个位置

int initlist(void)
{
    head = -1; // 头指针指向-1,链表为空
    idx = 0; // 内存用到了0

    return OK;
}

int Lengthlist(void)
{
    if(head == -1) return 0;
    int p = e[head];
    int cnt = 0;
    while( p > 0)
    {
        p = ne[p]; // 将指针的值赋值给p,若p为-1退出循环
        cnt ++;
    }
    return cnt;
}

int add_to_head(int x)
{
    e[idx] = x; // e[idx]就是新的内存 这里将新的元素e存入新申请的内存
    ne[idx] = head; // e[idx] 指向head的值,head 是指针,指向的是第一个结点。head的值就是第一个结点的位置(下标)
    head = idx ++; // head 指向idx 然后将idx ++ (下一次申请新内存直接ne[idx]即可)

    return OK;
}

// 在第K个位置的后面插入元素e
int insert_to_list(int k,int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx ++; // 这里注意,结点k的next指针应该指向的是 新结点 ,而新结点的位置(下标)就是idx,所以就直接是idx赋值给 k结点的next指针,idx ++ 是为了malloc新的“内存”

    return OK;
}

int remove_head(void)
{
    head = ne[head];

    return OK;
}

// 移除第k个位置的后继结点
int remove(int k)
{
    ne[k] = ne[ne[k]];

    return OK;
}

int printflist(void)
{
    int p = head;
    printf("链表为:\n");

    while(p >= 0)
    {
        printf("%d-",e[p]);
        p = ne[p];
    }
    printf("\n");

    return OK;
}

int main()
{
    initlist();
    while (1)
    {
        printf("--------------------menu-----------------------\n1.从头部插入\n2.在第k个结点后面插入元素x\n3.删除第K个结点后面的一个结点\n-----------------------------------------------------------------\n");
        int op;
        scanf("%d",&op);
        if(op == 1)
        {
            int x;
            printf("请输入x的值:\n");
            scanf("%d",&x);
            add_to_head(x);

            printflist();
        }
        else if(op == 2)
        {
            int k,x;
            printf("注意此方法不能插在头部和尾部!!!\n");
            printf("请输入k、x的值:\n");
            scanf("%d%d",&k,&x);
            insert_to_list(k,x);

            printflist();
        }
        else if(op == 3)
        {
            int k;
            printf("请输入k的值:\n");
            scanf("%d",&k);
            remove(k);

            printflist();
        }
    }

    return 0;
    
}

上面的结构体数组中年最后一个下标应该是MaxSize - 1

使用结构体数组,定义一个cur域(作用相当于链表结点的指针域),存放下一个结点的下标(位置),下标为0的cur存放数组用到哪个位置。

const int MaxSize = 1000;

typedef struct{
    int cur;
    int data;
}Link_list[MaxSize];

初始化

status initlinklist(Link_list list)
{
    list[0].cur = 1;
    
    for(int i = 1; i < MaxSize - 1; i ++)
    {
        list[i].cur = i + 1;
    }
    list[MaxSize - 1].cur = 1;

    return OK ;
}

插入操作

自己的malloc函数

int Malloc_list(Link_list list)
{
    int i = list[0].cur;
    list[0].cur = list[i].cur;

    return i;
}
posted @ 2021-10-28 20:06  r涤生  阅读(16)  评论(0编辑  收藏  举报