数据结构(C语言版)---线性表链式存储表示
1、单链表:线性表的链式存储。
1)特点:用一组任意的存储单元存储数据元素(存储单元可以连续,也可以不连续),逻辑上相邻的元素存储位置不一定相邻。
2)结点包括两个域:数据域(存储数据元素信息)、指针域(存储直接后继存储位置)
3)指针或链:指针域中存储的信息。
2、头指针:链表中第一个结点的存储位置,整个链表的存取必须从头指针开始。
3、头结点:在单链表的第一个结点前附设一个结点,其数据域可不存储信息,可存储附加信息。若指针域为空,则线性表为空表。
引入头结点的优点:
1)使得在链表的第一个位置上的操作和在表的其他位置上的操作一致。
2)空表和非空表的处理一致。
4、单链表的结点类型
typedef struct LNode {
int data;
struct LNode * next;
}LNode,* Linklist;
5、 单链表
LNode * s, *p, *q;
Linklist L;
int i, temp;
1)插入结点的代码片段,时间复杂度为O(n)。
p = GetElem(L, i - 1);
s->next = p->next;
p->next = s;
2)将* s结点插入到* p之前的代码片段,时间复杂度为O(1)。
s->next = p->next;
p->next = s;
temp = p->data;
p->data = s->data;
s->data = temp;
3)删除结点的代码片段,,时间复杂度为O(n)。
p = GetElem(L, i - 1);
q = p->next;
p->next = q->next;
free(q);
4)删除结点* p,时间复杂度为O(1)。
q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
6、采用头插法建立单链表,从表尾到表头逆向建立单链表L,每次均在头结点之后插入元素,时间复杂度为O(n)。
Linklist list_headinsert(Linklist &L)
{
LNode * s;
int x;
L = (Linklist)malloc(sizeof(LNode));
L->data = NULL;
scanf("%d", &x);
while (x!=9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
7、采用尾插法建立单链表,从表尾到表头正向建立单链表L,每次均在表尾插入元素,时间复杂度为O(n)。
Linklist List_tailinsert(Linklist &L)
{
int x;
L = (Linklist)malloc(sizeof(LNode));
LNode * s, *r = L;//r为表尾指针。
scanf("%d", &x);
while (x!=9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
8、按序号查找结点的值,取出单链表L中第i个位置的结点指针,时间复杂度为O(n)。
LNode * GetElem(Linklist L, int i)
{
int j = 1;
LNode * p = L->next;
if (i == 0)
{
return L;
}
if (i < 1)
{
return NULL;
}
while (p&&j<i)
{
p = p->next;
j++;
}
return p;
}
9、按值查找表结点,查找单链表L中数据域值等于e的结点指针,时间复杂度为O(n)。
LNode * LocateElem(Linklist L, int e)
{
LNode *p = L->next;
while (p!=NULL&&p->data!=e)
{
p = p->next;
}
return p;
}
10、求表长,时间复杂度为O(n)。
int listlength(LNode * p)
{
int len = 0;
while (p->next != NULL)
{
len++;
p = p->next;
}
return len;
}
11、循环单链表:表中最后一个结点的指针指向头结点。
1)判空条件:头结点的指针指向头指针。
2)设头指针,对表尾进行操作,时间复杂度为O(n)。
3)设尾指针,对表尾和表头进行操作,时间复杂度为O(1)。
12、双链表结点中含有两个指针域,一个指向前驱结点,一个指向后继结点。
13、双链表结点类型
typedef struct DNode {
int data;
struct DNode * prior, * next;
}DNode,* DLinklist;
14、 双链表
DNode * m, *k;
1)插入操作片段,时间复杂度为O(1)。
m->next = k->next;
k->next->prior = m;
m->prior = k;
k->next = m;
2)删除操作片段,时间复杂度为O(1)。
m->next = k->next;
k->next->prior = m;
free(k);
15、静态链表:借助数组来描述线性表的链式存储结构。其中指针是结点的相对地址(数组下标),又称游标。
16、静态链表的结构类型
#define maxsize 50
typedef struct {
int data;
int next;
}slinklist[maxsize];
数据结构(C语言版)---线性表链式存储表示的更多相关文章
- 线性表链式存储设计与实现 - API实现
基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以 ...
- guoshiyv 数据结构与算法2-1 线性链式存储
线性链式存储: 包含两部分:1.存储的单个元素 2.指针,指向下一个的地址 typedef struct() { ElementType Data; struct Node *Next; }Lis ...
- 【C语言--数据结构】线性表链式存储结构
直接贴代码 头文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__ typedef void LinkList; typedef struct _tag_L ...
- 线性表链式存储方式的C语言实现
/* 编译器:Dev-c++ 5.1.0 文件名:linkList3.cpp 代码版本号:1.0 时间:2015年9月24日11:34:16 */ #include <stdio.h> # ...
- 02线性表链式存储_LinkList--(线性表)
#include "stdio.h" #include "string.h" #include "ctype.h" #include &qu ...
- 数据结构C语言实现系列——线性表(线性表链接存储(单链表))
#include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...
- 【数据结构(C语言版)系列一】 线性表
最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
随机推荐
- 常用的FTP命令
FTP命令 ftp> ascii # 设定以ASCII方式传送文件(缺省值) ftp> bell # 每完成一次文件传送,报警提示. ftp> binary # 设定以二进制方式传送 ...
- 洛谷1880 区间dp+记忆化搜索 合并石子
题目网址:https://www.luogu.com.cn/problem/P1880 题意是:给定一个序列,最小规则是相邻两个值的合并,开销是他们的和,将整个序列合并成一个值的情况下,求解该值的最小 ...
- Vue组件通信方式全面详解
vue组件通信方式全面详解 众所周知,Vue主要思想就是组件化开发.因为,在实际的项目开发中,肯定会以组件的开发模式进行.形如页面和页面之间需要通信一样,Vue 组件和组件之间肯定也需要互通有无.共享 ...
- .Net Core2.2 使用 AutoMapper进行实体转换
一.遇到的问题 在. Core Api 的编写中,我们经常会对一些功能点进行新增编辑操作,同时我们有时也会进行查询,但是我们查询的表的数据与我们返回的数据相差甚大,这是我们有需要自己手动进行类型的转换 ...
- iOS nil,Nil,NULL,NSNULL的区别
nil (id)0 是OC对象的空指针,可正常调用方法(返回空值,false,零值等) Nil (Class)0 是OC类的空指针,主要运用于runtime中,Class c = Nil; 其他特性 ...
- 字符串中的count()方法
描述 Python count() 方法用于统计字符串里某个字符出现的次数.可选参数为在字符串搜索的开始与结束位置. 语法 count()方法语法: str.count(sub, start= 0,e ...
- [vijos1048]送给圣诞夜的贺卡<DFS剪枝>
题目链接:https://www.vijos.org/p/1048 很多人一看就想出了思路,不就是一个裸的dfs蛮...但是..在n<=50的情况下,朴素会直接tle..... 然后我就开始剪枝 ...
- python基础学习-字符串常见操作
字符串常见操作 索引 s = "abcdefg" # 字符串数据,切片后取出的数据都是字符串类型 # 从左至右取值:从0开始 # 从右向左取值:从-1开始 print(" ...
- Java读源码之ReentrantLock
前言 ReentrantLock 可重入锁,应该是除了 synchronized 关键字外用的最多的线程同步手段了,虽然JVM维护者疯狂优化 synchronized 使其已经拥有了很好的性能.但 R ...
- B 方块消消乐
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,128m 问题描述 何老板在玩一款消消乐游戏,游戏虽然简单,何老板仍旧乐此不疲.游戏一开始有n个边长为1的方块叠成一个高为n的 ...