复杂的链式存储结构
  循环链表
    定义:是一种头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环)
    优点:从表中任一节点出发均可找到表中其他结点
    注意:涉及遍历操作时,终止条件是判断 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数据结构 -- 线性表之 复杂的链式存储结构的更多相关文章

  1. 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...

  2. 数据结构导论 四 线性表的顺序存储VS链式存储

    前几章已经介绍到了顺序存储.链式存储 顺序存储:初始化.插入.删除.定位 链式存储:初始化.插入.删除.定位 顺序存储:初始化 strudt student{ int ID://ID char nam ...

  3. 线性表的Java实现--链式存储(单向链表)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在 ...

  4. 线性表的顺序存储和链式存储的实现(C)

    //线性表的顺序存储 #include <stdio.h>typedef int DataType;#define MaxSize 15//定义顺序表typedef struct { Da ...

  5. 线性表的顺序存储和链式存储c语言实现

    一.线性表的顺序存储 typedef int ElemType;typedef struct List { ElemType *data;//动态分配 ,需要申请空间 int length; }Lis ...

  6. 线性表的Java实现--链式存储(双向链表)

    有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm;      publi ...

  7. javascript实现数据结构:线性表--线性链表(链式存储结构)

    上一节中, 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示.然后,另一方面来看,这个特点也造成这种存储 ...

  8. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  9. c数据结构 -- 线性表之 顺序存储结构 于 链式存储结构 (单链表)

    线性表 定义:线性表是具有相同特性的数据元素的一个有限序列 类型: 1:顺序存储结构 定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构 算法: #include <stdio. ...

随机推荐

  1. Java数列循环右移

    描述 有n个整数组成一个数组(数列).现使数列中各数顺序依次向右移动k个位置,移出的数再从开头移入.输出移动后的数列元素,元素之间逗号隔开. 题目没有告诉你n的范围,要求不要提前定义数组的大小. 另外 ...

  2. 【jQuery实例】Ajax登录页面

    登录界面是信息系统提供的必备的功能,是提供给用户提供维护信息的接口.接下来,我来带领大家打造一个漂亮.安全的登录界面,使用的技术是ASP.NET+jQuery 先来看看预览效果   Ajax登录重点在 ...

  3. python全栈学习 day03

    换行符: \n 制表符: \t 字符串截取:顾头不顾尾 s[首:尾:步长] 首--->尾走向 和 步长方向一致 s[0:4:2] s[4:0:-2] a = "qwertyui&quo ...

  4. 在eclipse更新启动项目

    说明:figfree是基于模块化开发,代码重用,可拆解性高. 功能模块分为:接口工程(*.Iface).接口实现工程(*.Impl).客户端工程(*.Client) 接口工程(*.Iface):对其他 ...

  5. H5-当你想在出现遮罩的时候,锁住用户的滚动行为,你可以这么做。

    <div class="mask"> <div class="content">我是弹框</div> </div> ...

  6. 论文阅读笔记(十一)【ICCV2017】:Jointly Attentive Spatial-Temporal Pooling Networks for Video-based Person Re-Identification

    Introduction (1)Motivation: 当前采用CNN-RNN模型解决行人重识别问题仅仅提取单一视频序列的特征表示,而没有把视频序列匹配间的影响考虑在内,即在比较不同人的时候,根据不同 ...

  7. 数位dp(模板+例题)

    文章参考:数位dp之总结 首先,什么是数位dp?它是干什么的? 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数. 举个栗子: 加入我们要枚举所有上界不超过231 ...

  8. Docker最全教程——从理论到实战(二十二)

    前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...

  9. Net项目添加 WebAPI

    1.新建一个  WebApiConfig.cs public static void Register(HttpConfiguration config) { // Web API 配置和服务 // ...

  10. 852. spfa判断负环

    给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你判断图中是否存在负权回路. 输入格式 第一行包含整数n和m. 接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点 ...