一.单链表
(1)链表定义
将 指向int型变量的指针 定义为 zhengshuzhizhen:
typedef <数据类型> <别名》
typedef int *zhengshuzhizhen
用代码定义一个单链表:
用指针p来接收malloc函数的返回值,让p它指向这个结点的起始地址
struct LNode { //LNode为结点,定义单链表结点类型
ElemType data; //每个结点存放一个数据元素
struct LNode *next; //指针指向下一个节点
};
//增加一个新的节点:在内存中申请一个结点所需空间,并用指针p指向这个结点
struct LNode *p = (struct LNode *)malloc(sizeof(struct LNode)); //malloc分配内存
简化写法
typedef struct LNode LNode;
LNode *p = (LNode*) malloc(size of(LNode));
定义的结构体其实就是定义一个节点,只需要找到这个表的第一个节点就能访问整个表,所以LinkList代表的就是第一个节点的指针。
typedef struct LNode *LinkList; //LinList为指向struct LNode的指针
LNode *L; //声明一个指向单链表第一个结点的指针
或
LinList L; //声明一个指向单链表第一个结点的指针
简化为:
tyepedef struct LNode{
ElemType data; //数据域:每个节点存放一个数据元素
struct LNode *next; //指针域:指针指向下一个节点
}LNode,*LinkList;
基本单链表返回值函数:LNode *强调的是返回的是一个结点p;LinkList强调的是在一个单链表里寻找i。
LNode *GetElem(LinkList L,int i){
int j = 1;
LNode *p = L -> next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p!=NULL && j < i){
p = p->next;
j++;
}
return p;
}
不带头结点的单链表:
//初始化一个空的单链表
bool InitList(LinkList &L)
{
L = NULL; //空表,暂时还没有任何结点(防止脏数据)
return true;
}
void test(){
LinkList L; //声明一个指向单链表的指针
InitList(L); //初始化
}
//判断单链表是否为空
bool Empty(LinkList L){
if(L == NULL)
return true;
else
return false;
}
//另一种写法
bool Empty(LinkList L)
{
return (L==NULL);
}
带头结点的单链表:头指针L,头结点不存储数据
//初始化一个单链表(带头结点)
bool InitList(LinkList &L){
L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点
if(L==NULL) //内存不足,分配失败
return false;
L->next = NULL; //头结点之后暂时还没有节点
return true;
}
//判断单链表是否为空(带头结点)
bool Empty(LinkList L)
{
if(L->next == NULL)
return true;
else
return false;
}
总结:
带头结点:虚拟出来的,为了写代码方便,因此头指针L指向的该头结点不存储数据;
不带头结点:指针L指向的下一个数据就是存储数据的节点;
(2)链表插入和删除
在第i个位置插入元素e(带头结点):
如果i=1,则满足p不为NULL,因为p指向头结点不为空。
如果①和②对调,则会出现e指向e。
bool ListInsert(LinkList &L, int i, ElemType e)
{
if(i<0)
return false;
LNode *p; //指针p指向当前扫描到的结点
int j = 0; //当前p指向的第几个结点
p = L; //L指向头结点,头结点是第0个结点(不存数据)
while(p!=NULL && j<i-1) //循环找到第i-1个结点
{
p=p->next;
j++;
}
if(p==NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next; //①
p->next = s; //②
return true;
}