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实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
随机推荐
- 旅游类的APP原型模板分享——Priceline
Priceline是一款旅游服务的APP应用.功能有查找预订酒店.车票.机票等服务. 本原型由国产Mockplus(原型工具)和iDoc(智能标注,一键切图工具)提供. 先简单看看动图: 点击这里,可 ...
- Finance版本计划
2.0.0.3 1. 支持自定义报表 提供页面自定义报表,根据存储过程,前端页面传参调用 根据存储过程数据集控制简单样式(数字靠右,列宽) 2. 支持报表公式可修改 定义公式规则(文档) 2.0.0. ...
- Vue+Webpack构建移动端京东金融(一、开发前准备)
一.开发前准备 1.node环境搭建 去node.js官网下载长期支持版本的node,采用全局安装,安装方式自行百度 网址:https://nodejs.org/zh-cn/ 安装后在cmd命令行运行 ...
- python 练习4
题目为信用卡消费管理系统: 主程序:main.py #!usr/bin/env python # encoding: utf-8 import conf,sys,time,re,os import j ...
- Cookie保存中文用户名报错(500)
在用Cookie保存用户名时候,当用户名是中文的时候服务器报错了. HTTP Status 500 - An exception occurred processing JSP page /dolog ...
- FTP模式简式:PORT/PASV/EPRT/EPSV
简介 常见FTP有两种模式:PORT(主动模式).PASV(被动模式). 而EPRT/EPSV模式出现的原因是FTP仅仅提供了建立在IPv4上进行数据通信的能力,它基于网络地址是32位这一假设.但是, ...
- idea取消double shift全局搜索
一是因为它和输入法经常冲突,二来是因为它完全可以被其它的快捷键代替,如Ctrl+n,ctrl+shift+n,ctrl+shift+f之类的: 取消的方法,按ctrl+shift+a,然后输入regi ...
- ajax动态刷新的元素,导致绑定事件失效
jquery事件绑定有2种方式: 1,普通事件绑定: $('元素').click(function(){}); 2, 事件代理或者叫事件委托 $('#chatPanelList').on('click ...
- 5随机到7随机的C++实现
一.5随机到7随机 //给定条件 int Rand1To5(){ + ; } //实现代码,使用插空法和筛的过程 int Rand1To7(){ ; do{ tmp = (Rand1To5() - ) ...
- scrollIntoView() 调用元素就可以出现在视窗中
/* 如果滚动页面也是DOM没有解决的一个问题.为了解决这个问题,浏览器实现了一下方法, 以方便开发人员如何更好的控制页面的滚动.在各种专有方法中,HTML5选择了scrollIntoView() 作 ...