• 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的节点
    ", 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计起

  • 相关阅读:
    [TCP/IP] HTTPS的工作原理
    [TCP/IP] SSL的通讯原理
    ESLint笔记
    MacBook Pro维修过程
    论前端工程化
    听书,怅然若失
    js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)
    Windows和Mac浏览器启动本地程序
    科目三(番禺化龙展贸东路)考试录20170224
    写jQuery插件该注意的
  • 原文地址:https://www.cnblogs.com/HL-space/p/10546596.html
Copyright © 2020-2023  润新知