顺序表(链式)

本文详细介绍了链式数据结构的理解,包括结构体定义、节点创建、表头封装以及数据的插入、删除和打印等操作。通过实际的主函数调试,展示了在找不到数据和成功删除数据两种情况下的处理结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、链式的理解

/*
	链式存储的顺序表
		把插入方式改为指定位置插入
			也就是说直接找大于我这个键的第一次
				然后直接中间插入
					这边需要两个指针跑
*/

二、结构体

2.1 数据结构体

struct MM
{
	char name[20];
	int age;
};

2.2 添加键值结构体

struct Data
{
	int index;
	struct MM mmData;
};

2.3 节点

typedef struct Node
{
	struct Data data;
	struct Node* next;
}NODE,*LPNODE;

2.4 添加个数

typedef struct sqList
{
	LPNODE headNode;
	int sqListSize;
}SQL,*LPSQL;

三、封装节点与表头

3.1 创建节点

LPNODE createNode(struct Data data)
{
	LPNODE newNode = (LPNODE)malloc(sizeof(NODE));
	if (newNode == NULL)
	{
		return NULL;
	}
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

3.2 创建表头

LPNODE createList()
{
	LPNODE headNode = (LPNODE)malloc(sizeof(NODE));
	if (headNode == NULL)
	{
		return NULL;
	}
	headNode->next = NULL;
	return headNode;
}

四、封装整个表

LPSQL createSqList()
{
	LPSQL sqList = (LPSQL)malloc(sizeof(SQL));
	if (sqList == NULL)
	{
		return NULL;
	}
	sqList->headNode = createList();
	sqList->sqListSize = 0; 
	return sqList;
}

五、插入数据

void insertData(LPSQL sqList, struct Data data)
{
	LPNODE newNode = createNode(data);
	//找指定位置
	LPNODE leftPos = sqList->headNode;
	LPNODE posNode = sqList->headNode->next;
	//实现短路,不会出现NULL访问
	while (posNode != NULL && posNode->data.index < data.index)
	{
		leftPos = posNode;
		posNode = leftPos->next;
	}
	//有头链表所以这里插入不会有问题
	leftPos->next = newNode;
	newNode->next = posNode;
	//链式必须插入成功
	sqList->sqListSize++;
}

六、删除数据

void delete(LPSQL sqList,int index)
{
	LPNODE leftNode = sqList->headNode->next;
	LPNODE rightNode = sqList->headNode->next;
	while (rightNode != NULL && rightNode->data.index!=index)
	{
		leftNode = rightNode;
		rightNode = leftNode->next;
	}
	if (leftNode == NULL)
	{
		printf("此列表没有数据!无法删除!\n");
	}
	if (rightNode == NULL)
	{
		printf("此列表没有该人!无法删除!\n");
	}
	else
	{
		printf("删除成功!\n");
		leftNode->next = rightNode->next;
		free(rightNode);
		rightNode=NULL;
		sqList->sqListSize--;
	}
}

七、打印

void printSqList(LPSQL sqList)
{
	//顺序打印就完了!
	LPNODE pMove = sqList->headNode->next;
	while (pMove != NULL)
	{
		printf("%d:%s\t%d\n", pMove->data.index, pMove->data.mmData.name, pMove->data.mmData.age);
		pMove = pMove->next;
	}
}

八、主函数

int main(void)
{
	srand((unsigned int)time(0));
	LPSQL sqList = createSqList();
	
	for (int i = 0; i < 3; i++)
	{	
		struct Data data = { rand()%3,"wd",rand()%3 };
		insertData(sqList, data);
	}
	printSqList(sqList);
	delete(sqList, rand()%3);
	printSqList(sqList);
	return 0;
}

九、调试结果

9.1 没有找到

9.2 找到了并删除成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值