1、静态链表初始化
head指向-1代表当前为空链表,pool指向下一个可用空间(在数组下标为2的空间),2指向3,3指向4,最后的指向0表示没有下一个节点,以此链接起来。
2、实现代码
#include<stdio.h> #include<malloc.h> #define MAX_SIZE 20 typedef 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; }
标签:sList,下标,静态,StaticList,pos,next,链表,int From: https://www.cnblogs.com/xpp3/p/18412041