链表的概念
一、链表的概念
1、链表是一种存储空间能动态进行增长或缩小的数据结构。
2、链表主要用于:
(1)建立不定长度的数组。
(2)可以在不重新安排整个存储结构的情况下,方便且迅速地插入和删除数据元素。
3、链表广泛应用于数据管理中。
二、结点
struct NODE{
//结点数据类型
ElemType data;//数据域
NODE *link;//指针域
};
1、ElemType 可以是简单的内置数据类型,也可以是复杂的数据类型,
typedef struct tagElemType{
// 复杂的数据元素类型
//任意数目、任意组合、任意类型的数据成员
} ElemType;//对结构体tagElemType重新命名。
(1)数据域是链表中的信息对象(元素),实际应用中结合具体要求设计其数据类型。为方便介绍,将ElemType简单设定为int型,即:
typedef int ElemType;
(2)link成员表示指针域,存放另一个结点的地址,是链表中的组织者。
L:为头指针
头节点:第一个结点
尾结点:最后一个结点的指针域为0;
链表的分类
一、单链表
单链表每个结点包含一个指向直接后继结点指针域。其形式为:
struct LNode{
//单链表结点类型
ElemType data;//数据域
LNode *next;//指针域:指向直接后继结点
};
typedef LNode* LinkList;//LNode 为单链表结构体类型,LinkeList为单链表指针类型
next指向直接后继结点,由他构成了一条链。
二、双链表
双链表每个结点包含指向前驱节点和指向后继结点的指针域。
struct DNode{
//双链表结点类型
ElemType data;//数据域
DNode *prev,*next;//指针域:分别指向前驱结点和后继结点
};
typedef DNode *DLinklist;//DNode 为双链表结构体类型,DinkeList为双链表指针类型
三、循环链表
1、若单链表尾结点指向头结点而不是0,则该链表是循环单链表。
2、若双链表尾结点next指向头节点而不是0,头节点的prev指向尾结点而不是0,则该链表是循环双链表。
创建单链表
LinkList p;//链表指针
p=new LNode;//分配LNode 类型内存单元且将地址保存到p中
创建链表常用两种方法:头插法和尾插法
一、头插法创建链表
1、头插法创建链表的步骤:
(1)创建头节点L,设置L的next为0;
(2)动态分配一个结点s,输入s的数据域。
(3)将s插入到开始结点之前,头结点之后。
(4)重复(2)~(4)步骤加入更多结点。
#include <iostream>
using namespace std;
typedef int ElemType;//简单的数据元素类型
struct LNode{
//单链表结点类型
ElemType data;//数据域
LNode *next;//指针域:指向直接后继结点
};
typedef LNode* LinkList;//LNode为单链表结构体类型,LinkList为单链表指针类型
void input(