1.定义
线性表的链式存储又称单链表
2.单链表的定义
typedef struct LNode{//定义单链表结点类型
ElemType data;//数据域,存放数据
struct LNode *next;//指针域
}Lnode,*LinkList //重命名struct LNode为LNode;
//用*LinkList表示这是一个指向struct LNode的指针
要表示一个单链表时,只需声明一个头指针L,指向单链表的第一个结点
//意思相同,后者可读性更强
LNode *L; //强调这是一个结点
LinkList L; //强调这是一个单链表
2.1增加一个新的结点
在内存中申请一个结点所需空间,并用指针p指向该结点
struct LNode *p=(struct LNode*) malloc (sizeof(struct LNode));
typedef关键字——数据类型重命名
typedef<数据类型><别名>
如:typedef struct LNode LNode;
把struct LNode重命名为LNode,更简洁
LNode *p=(LNode*) malloc (sizeof(LNode));
2.2 初始化一个单链表
2.2.1不带头节点
typedef struct LNode{//定义单链表结点类型
ElemType data;//数据域,存放数据
struct LNode *next;//指针域
}Lnode,*LinkList
//初始化一个空的单链表
bool InitList(LinkList &L){
L=NULL;//空表,暂时没有任何结点
//防止脏数据
return true;
}
void test(){
LinkList L;//声明一个指向单链表的指针
//初始化一个空表
InitList(L);
//后续代码...
}
2.2.2 带头节点(更方便)
typedef struct LNode{//定义单链表结点类型
ElemType data;//数据域,存放数据
struct LNode *next;//指针域
}Lnode,*LinkList
//初始化一个带头节点的单链表
bool InitList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));//分配一个头结点
if (L==NULL)//内存不足,分配失败
return false;
L->next=NULL;//头结点之后暂时还没结点,即为空表
return true;
}
void test(){
LinkList L;//声明一个指向单链表的指针
//初始化一个空表
InitList(L);
//后续代码...
}
3. 基本操作
3.1 插入
时间复杂度:
最好:O(1)
平均:O(n)