数据结构-静态链表
静态链表
双数组实现(没有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;
}
rds_blogs