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计起
C 线性表的链式存储实现及插入、删除等操作示例的更多相关文章
- C++线性表的链式存储结构
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- 线性表 顺序存储 链式存储 ---java实现
首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- typedef struct LNode命名结构指针(线性表的链式存储)
一.typedef 关键字 1. 简介: typedef工具是一个高级数据特性,利用typedef可以为某一些类型自定义名称. 2. 工作原理: 例如我们定义链表的存储结构时,需要定义结点的存储数据元 ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
- 线性表的链式存储结构的实现及其应用(C/C++实现)
存档----------- #include <iostream.h> typedef char ElemType; #include "LinkList.h" voi ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
随机推荐
- iserver频繁崩溃、内存溢出事故解决小记
一.事故分析 在生产项目中,频繁遇到iserver隔一段时间就会出现崩溃的情况. 将iserver错误日志发给技术客服后,说是内存溢出的问题. 查看服务器的配置是32g内存,按理说不该出现此类问题. ...
- 一个不错的多叉树, stl风格
tree<std::string> tr9; tree<std::string>::pre_order_iterator iter1; tr9.set_head("h ...
- [二分答案][NOIP2015]跳石头
跳石头 题目描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起 ...
- linux jdk 环境变量
一.jdk的安装 1.下载 jdk-7u79-linux-i586.tar.gz 2.tar -zxvf jdk-7u79-linux-i586.tar.gz 解压 3.mv jdk1.7.0_79 ...
- SHELL脚本学习-练习写一个脚本3
#通过ping命令测试192.168.1段的所有主机是否在线,如果在线就显示is up并显示蓝色,如果不在线就显示is down. #!/bin/bash #Program Description: ...
- SpringBoot处理日期转换问题
前台传一个datetime类型的数据即yyyy-MM-dd HH:mm:ss格式的数据黑后台controller,结果发现接收到的对象为yyyy-MM-dd 00:00:00,处理这个问题可以在con ...
- sql_calc_found_rows原理
- Java实现多线程生产者消费者模型及优化方案
生产者-消费者模型是进程间通信的重要内容之一.其原理十分简单,但自己用语言实现往往会出现很多的问题,下面我们用一系列代码来展现在编码中容易出现的问题以及最优解决方案. /* 单生产者.单消费者生产烤鸭 ...
- java35
1.变量的访问:就近原则 2.this.name 本类的name 3.枚举:一个事物的固定状态 修饰符 enum 枚举名称{ } 4.枚举相当于一个特殊的类,默认继承了Enum 5.枚举不能直接创建对 ...
- 【Selenium】【BugList5】chrom窗口未关闭,又新开窗口,报错:[8564:8632:0522/111825.341:ERROR:persistent_memory_allocator.cc(845)] Corruption detected in shared-memory segment.
环境信息:Windows7 64位 + python 3.6.5 + selenium 3.11.0 +pyCharm 解决方法: 执行 driver = webdriver.Chrome()前必须把 ...