链表(主要是单链表)

单链表:只指出后继关系的链表

双链表:同时存储前趋和后继

循环链表:指出后继的同时指出头结点和尾结点的关系

单链表的存储

定义一个结点类型

struct  linkRec

{

datatype  data;

linkRec  *next;

}

单链表操作-插入

在结点p后插入一个结点

*申请空间

*输入数据放入申请到的空间

*链入p后

tmp = new linkRec;  // 创建一个新结点

tmp->data = x;        // 把x放入新结点的数据成员中

tmp->next = p->next;   // 把新结点和p的下一成员相连

p->next = tmp;        //把p和新结点连接起来

单链表操作-删除

把结点p后的结点删除

delPtr=p->next;

p->next=delPtr->next;

delete delPtr;

单链表操作-建立

*定义头指针:linkRec  *head;

*建立头结点

-申请空间

-设为头结点

*逐个从键盘输入数据,存入链表

-接受输入

-申请空间

-输入数据放入申请到的空间

-链入链表尾

*置链表结束标志

 1 head = new  linkRec;
 2 rear = head;
 3 cin >> in_data;
 4 while (输入未结束)
 5   { p = new linkRec;
 6      p->data = in_data;
 7      rear->next = p;
 8      rear = p;
 9      cin >> in_data;
10   }
11 rear->next = NULL; //这一行是很重要的

单链表操作-输出

1 p = head->next;
2 while ( p != NULL)
3    { cout << p->data;
4       p = p->next;
5    } 

链表总结

*实现较复杂

*插入、删除效率高,但查找第i个元素效率低

*无表满的问题

*适合于动态表

时间: 2024-10-19 01:22:16

链表(主要是单链表)的相关文章

数据结构实验之链表五:单链表的拆分

数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. 输入 第一行输入整数N;: 第二行依次输入N个整数. 输出 第一行分别输出偶数链表与奇数链表的元素个数: 第二行依次输出偶数子链表的所有数据: 第三行依次输出奇数子链表的所有数据. 示例输入 10 1 3 22

静态单链表和动态单链表的区别

链表中结点的分配和回收是由系统提供的标准函数malloc和free动态实现的,称之为动态链表. 如果程序支持指针,则可按照我们的一般形式实现链表, 需要时分配,不需要时回收即可. 动态链表的空间是可以动态扩展的. typedef struct  node{ EleType data; struct node * pNext; }Node; 有些高级语言中没有"指针"数据类型,只能用数组来模拟线性链表的结构, 数组元素中的指针"域"存放的不是元素在内存中的真实地址,而

链表1-单链表

链表也是一种线性表,但与线性表不同的是,链表的物理存储结构是一堆地址任意的存储单元.也就是说,链表的数据在内存中的物理位置可能相互邻接,也有可能不邻接. 单链表的基本操作如下: 1 //链表的基本操作 2 //定义结点类 3 template <typename Type> class Node{ 4 public: 5 Type data; 6 Node<Type> *next; 7 Node(const Type &_data){ 8 data=_data; 9 nex

C语言:【单链表】查找单链表的中间节点,要求只能遍历一次

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next; }SListNode; SListNode* BuyNode(DataType x) {     SListNode* next = (SListNode*)malloc

数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插入一个节点,需要修改它前面的节点(前驱),使其指向新加入的节点,而新加入的节点则指向原来前驱指向的节点(见下图). 由上图可知,B.C之间插入D,三者之间的关系为 current为插入节点的前驱节点 current->next = new              // B节点指向新节点D new->n

链表之循环单链表(用C语言描述)

上回说到建立链表的三种形式,分别是头插法,尾插法,和尾插法MAX?? ??下面讲一下循环单链表?? 循环单链表,字面意思,就是单链表循环了起来,尾节点在输入结束后不会指向NULL,而是指向了头节点head 酱紫,链表就循环了起来 下面是代码实现 #include <stdio.h> #include <stdlib.h> typedef char datatype; typedef struct node { datatype data; struct node *next; in

【链表】实现单链表的逆序

1 public class Main { 2 3 // 就地逆序法 4 public Node reverse(Node head) { 5 // no need to reverse 6 if (head == null || head.next == null || head.next.next == null) { 7 return head; 8 } 9 10 // pointer 11 Node pre = head; 12 Node cur = head.next; 13 Node

JAVA实现具有迭代器的线性表(单链表)

一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用到依次遍历单链表中的每一个元素.一般而言,我们就是用for循环来实现遍历,这样,当你新增一个对单链表的操作并需要使用遍历时,你就得重新写一个for循环而实现遍历.那么,为什么不将迭代(遍历)作为一种基本的ADT操作(基本的ADT操作如:新增一个元素.删除一个元素)呢?于是,迭代器就出场了. 2,鉴于

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

动态单链表的传统存储方式和10种常见操作-C语言实现

顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. 一般链表的存储方法 一组物理位置任意的存储单元来存放线性表的数据元素,当然物理位置可以连续,也可以不连续,或者离散的分配到内存中的任意位置上都是可以的.故链表的逻辑顺序和物理顺序不一定一样. 因为,链表的逻辑关系和物理关系没有必然联系,那么表示数据元素之间的逻辑映象就要使用指针,每一个存储数据元素