一般情况下,我们要嘛用数组,要嘛就用链表来实现一些线性的数据结构,很少用静态链表。一种基于数组的,具有链表的性质的数据结构。简单的写了个小程序。
#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。这样就是一个链着的链表了,数据还是存放在那里,不过只是有个光标的指向不同而已。就好比,单链表中数据也是动态申请来了后固定在一个内存空间,然后有个指针把所有的串起来。但是这个静态链表他又有可以当数组用,可见他的强大了。