1、静态链表初始化
head指向-1代表当前为空链表,pool指向下一个可用空间(在数组下标为2的空间),2指向3,3指向4,最后的指向0表示没有下一个节点,以此链接起来。
2、实现代码
#include<stdio.h> #include<malloc.h>#define MAX_SIZE 20typedef char ElemType;typedef struct StaticList{ElemType data;int next; }StaticList;void initSList(StaticList* sList){int i = 0;//将数组链接起来 for(i;i < MAX_SIZE - 1;i++){sList[i].next = i + 1;}//数组下标为0的元素代表头结点//头结点指向-1代表后面没有元素,即为空链表 sList[0].next = -1;//指向 0 表示后续没有其他可用空间 sList[MAX_SIZE - 1].next = 0;}//获取数组下一个可用位置下标 int malloc_node(StaticList* sList){//拿到数组中可用空间的下标 int pos = sList[1].next;if(sList[pos].next != 0){//说明当前数组还有未使用空间 //指向下一个未使用空间的下标 sList[1].next = sList[pos].next;}return pos; }//头插法 void insert_head(StaticList* sList,ElemType e){ //获取数组可用空间的元素下标 int i = malloc_node(sList);if(i == 0){printf("空间不足,申请节点空间失败.\n");return;}sList[i].data = e;if(sList[0].next == -1){//说明当前插入的是第一个元素 sList[i].next = -1;}else{//说明不是第一个元素,采用头插法插入 sList[i].next = sList[0].next;}//头节点指向插入的节点下标 sList[0].next = i;}//释放节点 void free_node(StaticList* sList,int pos){//重新链接数组 sList[pos].next = sList[1].next;//下标为 pos 的节点成为下一个可用空间 sList[1].next = pos; } //删除头部 void delete_head(StaticList* sList){//获取第一个节点下标 int i = sList[0].next;if(i == -1){printf("当前链表为空,不可删除.\n");return;}//将第一个元素指向下一个元素下标给到头节点 sList[0].next = sList[i].next;//重新链接数组 // sList[i].next = sList[1].next;//删除的节点成为下一个可用空间 // sList[1].next = i; free_node(sList,i); } //打印链表 void show_SList(StaticList* sList){int i = sList[0].next;while(i != -1){printf("%c->",sList[i].data);i = sList[i].next;}printf("NULL .\n"); } int main(){StaticList staticList[MAX_SIZE];initSList(staticList);int i = 0;for(i;i <= 5;i++){insert_head(staticList,'a'+i);}show_SList(staticList);delete_head(staticList);show_SList(staticList);return 0; }