前言
用链式存储实现了线性结构,一个结点存储一个数据元素,各个结点的先后关系用一个指针表示
一、为什么使用typedef
没有使用typedef时
struct LNode{ //定义单链表结点类型
ElemType data; //数据域,每个节点存放一个一个数据元素
struct LNode *next;
};
struct LNode* p=(struct LNode *)malloc(sizeof(struct LNode)); //增加一个新结点,在内存中申请一片空间,并用指针p指向这个结点
typedef为关键字,即数据类型重命名
typedef<数据类型><别名>
eg typedef int zhengshu
int x=1 可为 zhengshu x=1
使用了typedef
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*Linklist;
//等同于以下代码
struct LNode{
ElemType data;
struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *Linklist;
注:要表示一个单链表,只需要申明一个头指针,指向单链表的第一个结点
LNode *L;
Linklist L;
两者均为申明指向单链表第一个结点的指针
前者强调这是一个结点,后者强调这是一个单链表
二、单链表的定义
1.不带头结点
//不带头结点的单链表
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*Linklist;
bool Initlist(Linklist &L){
L=NULL; //空表,防止脏数据
return ture;
}
//判断链表是否为空
bool Empty(Linklist L){
return(L==NULL);
}
void test(){
LinkList L;
Initlist(L); //声明一个指向单链表的指针
}
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 ture;
}
//判断链表是否为空
bool Empty(Linklist L){
return(L->next==NULL);
}
void test(){
LinkList L;
Initlist(L); //声明一个指向单链表的指针
}
总结
单链表不要求大量连续的存储空间,改变容量方便,但不可随机存取,要耗费一定空间存放指针