1、静态链表示意图
(1)初始化,0长度
(2)在尾部插入一个元素
(3)在尾部插入第二个元素
(4)在尾部插入第三个元素
(4)在尾部删除一个元素
(5)在尾部删除第二个元素
2、代码实现
(1)类型定义
#define MAX_SIZE 10
typedef struct
{
char* data;
int cur;
}S_NODE;
typedef struct
{
S_NODE node[MAX_SIZE]; /*数据链表*/
int array[MAX_SIZE]; /*备用链表*/
int lenght;
}S_LIST;
(2)链表初始化
void InitList(S_LIST* list)
{
int i = 0;
memset(list->node, 0, sizeof(S_NODE) * MAX_SIZE);
list->lenght = 0;
for(i = 0; i < MAX_SIZE - 1; i++)
{
list->array[i] = i + 1;
}
list->array[MAX_SIZE - 1] = 0; /*表示尾节点*/
}
(3)在尾部添加节点
/*在尾部添加节点*/
int AddList(S_LIST* list, char* ele)
{
int cur_index = 0;
/*取出备用链表的位置*/
cur_index = list->array[0];
/*备用链表位置的第一个节点的cur指向改变*/
list->array[0] = cur_index + 1;
list->node[cur_index - 1].cur = cur_index;
list->node[cur_index - 1].data = (char*)malloc((strlen(ele) + 1) * sizeof(char));
strcpy(list->node[cur_index - 1].data, ele);
list->node[cur_index - 1].data[strlen(ele)] = '\0';
(list->lenght)++;
}
(4)在索引处插入节点
/*在索引出插入节点
index >= 1 && index <= list->length
*/
int InsertList(S_LIST* list, int index, char* ele)
{
int cur_index = 0;
int i = 0;
if(index < 1 || index > list->lenght)
return -1;
/*取出备用链表的位置*/
cur_index = list->array[0];
/*备用链表位置的第一个节点的cur指向改变*/
list->array[0] = cur_index + 1;
#if 0
for(i = 0; i < list->lenght; i++)
{
printf("%d: cur %d\n", i, list->node[i].cur);
}
#endif
/*节点的最后一个cur改变*/
for(i = 0; i < list->lenght; i++)
{
if(list->node[i].cur == list->lenght)
{
list->node[i].cur = 0;
break;
}
}
/*插入位置处的cur指向的前一个节点的cur指向改变*/
for(i = 0; i < list->lenght; i++)
{
if(list->node[i].cur == index)
{
list->node[i].cur = cur_index - 1;
break;
}
}
#if 0
for(i = 0; i < list->lenght; i++)
{
printf("%d: cur %d\n", i, list->node[i].cur);
}
#endif
list->node[cur_index - 1].cur = index;
list->node[cur_index - 1].data = (char*)malloc((strlen(ele) + 1) * sizeof(char));
strcpy(list->node[cur_index - 1].data, ele);
list->node[cur_index- 1].data[strlen(ele)] = '\0';
(list->lenght)++;
}
(5)打印链表
void PrintList(S_LIST list)
{
int i = 0;
#if 0
for(i = 0; i < MAX_SIZE; i++)
{
printf("%d: %d ", i, list.array[i]);
}
printf("\n");
for(i = 0; i < MAX_SIZE; i++)
{
printf("%d: %d ", i, list.node[i].cur);
}
printf("\n-----------------------\n");
#endif
printf("list contains %d: \n", list.lenght);
for(i = 0; i < list.lenght; i++)
{
printf("i: %d cur: %d: %s \n", i, list.node[i].cur, list.node[i].data);
}
printf("\n");
}
(6)测试
int main()
{
S_LIST list;
int i = 0;
InitList(&list);
PrintList(list);
AddList(&list, "ZHAO");
AddList(&list, "QIAN");
AddList(&list, "SUN");
AddList(&list, "LI");
AddList(&list, "ZHOU");
AddList(&list, "WU");
AddList(&list, "ZHENG");
AddList(&list, "WANG");
PrintList(list);
InsertList(&list, 1, "111");
PrintList(list);
InsertList(&list, 5, "555");
PrintList(list);
return 0;
}
(7)输出
3、总结
该静态链表没有把书中的所有功能都实现,个人感觉静态链表不是很好用,用cur的值并不能用类似数组的索引功能查找到该节点的位置,依旧得用while或for循环,查找到cur的值,才能找到存储的数据内容。该总结仅供参考,个人能力有限。