和菜鸟一起学数据结构之简单静态链表实现
一般情况下,我们要嘛用数组,要嘛就用链表来实现一些线性的数据结构,很少用静态链表。一种基于数组的,具有链表的性质的数据结构。简单的写了个小程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUM 1000
typedef struct
{
int data;
int cur;
}List[MAXNUM], Link;
void list_create(Link *list);
void list_insert(Link *list, int value);
void list_delete(Link *list, int value);
void list_print(Link *list);
int main(void)
{
List list;
int i;
list_create(list);
for(i = 1; i < 9; i++)
list_insert(list, i);
list_print(list);
printf("\n");
list_delete(list, 2);
list_print(list);
printf("\n");
return 0;
}
/*
静态链表的链表头
*/
void list_create(Link *list)
{
list[0].cur = 0;
list[0].data = 1;
}
/*
静态链表中插入一个元素
*/
void list_insert(Link *list, int value)
{
int i;
int len;
i = 0;
while(list[i].cur != 0) i = list[i].cur;
len = list[0].data++;
list[i].cur = len;
list[len].data = value;
list[len].cur = 0;
}
/*
静态链表中删除一个元素
*/
void list_delete(Link *list, int value)
{
int i;
int len;
if(list[0].data == 1)
{
printf("Empty list\n");
return;
}
i = 0;
while(list[i].cur != 0)
{
if(list[list[i].cur].data == value)
{
list[i].cur = list[list[i].cur].cur;
}
i = list[i].cur;
}
}
/*
打印数组中所有的元素,或者打印链表中的元素
*/
void list_print(Link *list)
{
int i;
if(list[0].data == 1)
{
printf("Empty list\n");
return;
}
i = 0;
while(list[i].cur != 0)
{
printf("%d %d\n", list[i].data, list[i].cur);
i = list[i].cur;
}
printf("%d %d\n", list[i].data, list[i].cur);
/*
for(i = 0; i < list[0].data; i++)
printf("%d %d\n", list[i].data, list[i].cur);
*/
}
所谓的静态链表就是多了一个光标,类似于链表中的指针,好比把所有的数据都串起来了一样。
比如:
I data cur
0 5 1
1 1 3
2 2 4
3 5 2
4 6 0
上面就是一个静态链表了。
首先从表头i=0处开始吧。0-->1 , 1-->3, 3-->2, 2-->4, 4-->0。这样就是一个链着的链表了,数据还是存放在那里,不过只是有个光标的指向不同而已。就好比,单链表中数据也是动态申请来了后固定在一个内存空间,然后有个指针把所有的串起来。但是这个静态链表他又有可以当数组用,可见他的强大了。
浙公网安备 33010602011771号