C 线性表的链式存储实现及插入、删除等操作示例

一、链式存储的优势

线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低。而链式结构不依赖于地址连续的存储空间,可以克服数组表现线性表的缺陷。

二、基于链式存储线性表的基本操作

2.1 PtrToLNode Creat(int length):创建一个长度为length的线性表

//创建长度为length的链表
PtrToLNode Creat(int length)
{
	PtrToLNode pHead = (PtrToLNode)malloc(sizeof(struct LNode));//链表头
	PtrToLNode p0 = pHead;//新创建链表节点地址
	PtrToLNode p1 = pHead;//链表尾节点地址
	p0->Data = 0;
	int i = 1;
	for (i = 1; i < length; i++)
	{
		p0 = (PtrToLNode)malloc(sizeof(struct LNode));
		p0->Data = i;
		p1->pNext = p0;//新创建节点的首地址是上一节点的pNext
		p1 = p0;//更新尾节点
	}
	p1->pNext = NULL;//最后有一个节点的pNext为NULL
	return pHead;
}

2.2 int Length(PtrToLNode ptr):求表头为ptr的链表的长度

//求表长
int Length(PtrToLNode ptr)
{
	int len = 0;
	while (ptr != NULL)
	{
		len++;
		ptr = ptr->pNext;
	}
	return len;
}

3.3 int FindKth(PtrToLNode ptr, int n):求表头为ptr的链表第n个结点的Data值

//求第n个结点的Data
int FindKth(PtrToLNode ptr, int n)
{
	if (n > Length(ptr))
	{
		printf("该节点不在链表范围内");
		system("pause");
		return -1;
	}
	int i = 1;
	for (i = 1; i < n; i++)
	{
		ptr = ptr->pNext;
	}
	int result = ptr->Data;
	return result;
}

3.4 int Find(PtrToLNode ptr, int num):求表头为ptr的链表中第一个Data值为num的节点的序号

//求链表中第一个Data值为num的节点的序号
int Find(PtrToLNode ptr, int num)
{
	int n = 1;//序号从1开式计
	while (ptr->Data != num && n <= Length(ptr))
	{
		n++;
		ptr = ptr->pNext;
	}
	if (n > Length(ptr))
	{
		printf("该链表内无Data为%d的节点\n", num);
		system("pause");
		return -1;
	}
	return n;
}

3.5 PtrToLNode Insert(PtrToLNode ptr, int n, int num):在第n个节点处插入Data值为num的节点

//在第n个节点处插入Data值为num的节点
PtrToLNode Insert(PtrToLNode ptr, int n, int num)
{
	PtrToLNode head = ptr;
	if (n > Length(ptr) + 1)
	{
		printf("请重新输入插入位置");
		system("pause");
		return NULL;
	}
	if (n == 1)//n=1即插入新的表头
	{
		PtrToLNode pNewHead = (PtrToLNode)malloc(sizeof(struct LNode));
		pNewHead->Data = num;
		pNewHead->pNext = ptr;
		return pNewHead;
	}
	int i = 1;
	for (i = 1; i < n-1; i++)//找出第n-1个节点的首地址
	{
		ptr = ptr->pNext;
	}
	PtrToLNode pTem = ptr->pNext;
	PtrToLNode pNew = (PtrToLNode)malloc(sizeof(struct LNode));
	pNew->Data = num;
	ptr->pNext = pNew;
	pNew->pNext = pTem;
	return head;
}

3.6 PtrToLNode Delete(PtrToLNode ptr, int n):删除第n个节点

//删除第n个节点
PtrToLNode Delete(PtrToLNode ptr, int n)
{
	PtrToLNode head = ptr;
	if (n > Length(ptr))
	{
		printf("请重新输入删除位置");
		system("pause");
		return NULL;
	}
	if (n == 1)
	{
		PtrToLNode pNewHead = ptr->pNext;
		free(ptr);//注意将删除的节点free掉
		return pNewHead;
	}
	int i = 1;
	for (i = 1; i < n - 1; i++)//找出第n-1个节点的首地址
	{
		ptr = ptr->pNext;
	}
	PtrToLNode pTem = (ptr->pNext)->pNext;
	free(ptr->pNext);
	ptr->pNext = pTem;
	return head;
}

注:本程序中节点序号都是从1计起

posted @ 2018-08-13 20:28  秋沐霖  阅读(1564)  评论(0编辑  收藏  举报
Live2D