zoukankan      html  css  js  c++  java
  • 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计起

  • 相关阅读:
    Jmeter之http性能测试实战 非GUI模式压测 NON-GUI模式 结果解析TPS——干货(十一)
    UI Recorder 自动化测试 回归原理(九)
    UI Recorder 自动化测试 录制原理(八)
    UI Recorder 自动化测试 整体架构(七)
    UI Recorder 自动化测试 配置项(六)
    UI Recorder 自动化测试 工具栏使用(五)
    UI Recorder 自动化测试 回归测试(四)
    UI Recorder 自动化测试 录制(三)
    UI Recorder 自动化测试工具安装问题疑难杂症解决(二)
    UI Recorder 自动化测试安装教程(一)
  • 原文地址:https://www.cnblogs.com/HL-space/p/10546596.html
Copyright © 2011-2022 走看看