c数据结构 -- 线性表之 复杂的链式存储结构
复杂的链式存储结构
循环链表
定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环)
优点:从表中任一节点出发均可找到表中其他结点
注意:涉及遍历操作时,终止条件是判断 p->next == L?
双向链表
定义:在单链表的每个结点离再增加一个指向直接前驱的指针域 prior,这样链表中就形成了有
两个方向不用的链,故称为双向链表
双向循环链表
定义:
和单链的循环表类似,双向链表也可以有循环表
·让头节点的前驱指针指向链表的最后一个结点
·让最后一个结点的后继指针指向头结点
示例图(2张):


注意:
在双向链表中有些操作(如:ListLength、GetElem等),
因仅涉及一个方向的指针,故它们的算法与线性链表的相同。
但在插入、删除时,需同时修改两个方向上的指针
算法:
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
// 双向循环链表
typedef struct Londe{
int number;
struct Londe *prev; //
struct Londe *next;
}Londe;
typedef Londe *Linklist; // LinkList为指向结构体 Londe 的指针类型
// 初始化
int initList_L(Linklist *L);
// 通过索引获取结点对象
Linklist getLinkListByI(Linklist *L,int i);
// 遍历结点
int showList_L(Linklist L);
// 插入数据
int insertList_L(Linklist *L,int number);
// 删除指定索引的结点
int delLinkByI(Linklist *L,int i);
int main(void){
Linklist L = NULL;
// 初始化单链表
initList_L(&L);
// 插入数据
insertList_L(&L,);
insertList_L(&L,);
delLinkByI(&L,);
showList_L(L);
}
// 初始化
int initList_L(Linklist *L){
Linklist node = (Linklist)malloc(sizeof(Londe));
if(!node){
return ERROR;
}
node->number = ;
node->next = node;
node->prev = node;
*L = node;
return OK;
}
// 插入数据
int insertList_L(Linklist *L,int number){
Linklist node = (Linklist)malloc(sizeof(Londe)); if(!node){
return ERROR;
} node->number = number; (*L)->prev->next = node;
node->prev = (*L)->prev;
node->next = (*L);
(*L)->prev = node;
return OK;
}
// 遍历结点
int showList_L(Linklist L){
Linklist temp = L;
do{
printf("前驱指针%p;值:%d;后继指针%p \n",L->prev,L->number,L->next);
L = L->next;
}while(temp != L);
return OK;
}
// 通过索引获取结点对象
Linklist getLinkListByI(Linklist *L,int i){
int ii = ;
Linklist T = *L;
while(ii != i){
T = T->next;
ii++;
}
return T;
}
// 删除指定索引的结点
int delLinkByI(Linklist *L,int i){
printf("打点1");
Linklist temp = getLinkListByI(L,i);
printf("值是%d \n",temp->number);
temp->prev->next = temp->next;
temp->next->prev = temp->prev;
return OK;
}
c数据结构 -- 线性表之 复杂的链式存储结构的更多相关文章
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 数据结构导论 四 线性表的顺序存储VS链式存储
前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char nam ...
- 线性表的Java实现--链式存储(单向链表)
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...
- 线性表的顺序存储和链式存储的实现(C)
//线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...
- 线性表的顺序存储和链式存储c语言实现
一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...
- 线性表的Java实现--链式存储(双向链表)
有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm; publi ...
- javascript实现数据结构:线性表--线性链表(链式存储结构)
上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...
- [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...
- c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)
线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...
随机推荐
- 消息队列MQ如何保证高可用性?
保证MQ的高可用性,主要是解决MQ的缺点--系统复杂性变高--带来的问题 主要说一下 rabbitMQ 和 kafka 的高可用性 一.rabbitMQ的高可用性 rabbitMQ是基于主从做 ...
- 哈夫曼树 动态数组的使用vector
问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. ...
- P1341 当然是选择AC它了!(字符串处理)
A. 当然是选择AC它了! 题目描述 听闻第八届程序设计大赛马上就要开始了,已经报名的童鞋们都纷纷去 OJ 刷题.但你的女朋友 (tan90°) 想知道她写的 "A + B 问题" ...
- 复习node中加载静态资源--用express+esj
不做解释,代码一看就懂 app.js import express from 'express' import config from './config' const app = express() ...
- 【spring boot】SpringBoot初学(1) - Hello World
前言 此文只是记录自己简单学习spring boot的笔记.所以,文章很多只是初步理解,可能存在严重错误. 一.Spring boot的初步理解 1.spring boot的目标 (摘自:spring ...
- php弱语言特性-计算科学计数法
php处理字符串时存在一个缺陷问题,如果字符串为“1e1”,本该是一个正常的字符串,但是php会将它认为是科学计数法里面的e: 也就是按照数学的科学计数法来说:1e1=10^1=10,因此php会把这 ...
- Firefox下载.net服务器文件时中文乱码
ASP.NET中产生一个Excel报表,供浏览器下载.显然,下载时经常有汉字报表名称.针对当前的两个主流的浏览器IE和Firefox,似乎没有兼容的解决办法.网上搜索了一些解决方法,但在Firefox ...
- PAT (Basic Level) Practice (中文)1033 旧键盘打字 (20 分)
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及坏掉的那些键,打出的结果文字会是怎样? 输入格式: 输入在 2 行中分别给出坏掉的那些键.以及应该输入 ...
- BZOJ5137&&lg4081(广义后缀自动机,set启发式合并)
BZOJ5137&&lg4081(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 给定多个文本串,让你查询每个文本串中有多少个本质不同的子串且这个子串只出现在当前这个文本 ...
- 题解 AT1812 【テレビ】
题目大意 高桥君有一个宽\(w\),高\(h\)的电视机. 判定\(w:h\)是\(4:3\)还是\(16:9\). 分析 我们可以理解成把一个比\(w:h\)化为最简整数比,也就是将\(w:h\)化 ...