2.12 静态链表——严蔚敏

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的值,才能找到存储的数据内容。该总结仅供参考,个人能力有限。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值