单链表:由头指针唯一确定,因此单链表可以用头指针的名字来命名。
如何表示空表?
- 无头节点时,头指针为空时表示空表
- 有头节点时,当头结点的指针域为空时为空表
typedef struct LNode//声明结点类型 和 指向结点的指针类型
{
ElemType data;//结点的数据域
struct LNode* next;//结点的指针域
}LNode,*LinkList;//LinkList为指向结构体LNode的指针类型
存储学生学号、姓名、成绩的单链表结点类型定义如下:
typedef struct student
{
char num[8];//数据域
char name[8];//数据域
int score;//数据域
struct student* next;//指针域
}Lnode,*LinkList;
但通常要这样写:
typedef struct student
{
char num[8];//数据域
char name[8];//数据域
int score;//数据域
}ElemType;
typedef struct Lnode
{
ElemType data;//数据域
struct student* next;//指针域
}Lnode,*LinkList;
单链表的基本操作:
单链表的初始化:
Status InitList_L(LinkList& L)//LinkList为指针类型
{
L = new LNode;
L->next = NULL;//创建了一个头结点,即同时运用了头指针和头结点。只要加上->next就说明创建了头节点。
return OK;
}
判断链表是否为空:
int ListEmpty(LinkList L)//若L为空表,返回1,否则返回0
{
if (L->next)
return 0;
else
return 1;
}
单链表的销毁:
L为头指针,存放的是头结点的地址,我们额外再定义一个指针p,让p也指向头结点(即也存放头结点的地址,将L的值赋给P即可)
一开始L存放的是头结点的地址,即L->next为头结点地址。(理解为头结点只有next域没有数据域)
我们只需要让L存放的地址变成a1结点的地址就行了,即L->next为a1的地址
Status DestoryList(LinkList& L)
{
Lnode* p;
while (L)
{
p = L;
L = L->next;
delete p;
}
return OK;
}
清空链表
链表仍存在,但链表中无元素,成为空链表(头指针和头结点仍在)
Status ClearList(LinkList& L)
{
Lnode* p;
Lnode* q;
p = L->next;
while (p)
{
q = p->next;
delete p;
p = q;
}
L->next == NULL;
return OK;
}
求链表表长
int ListLength(LinkList L)
{
Lnode* p;
p = L->next;
int i = 0;
while (p)
{
i++;
p = p->next;
}
return i;
}
取值:取单链表中第i个元素的内容
Lnode* GetElem(LinkList L, int i)
{
Lnode* p;
int j = 1;
p = L->next;
if (i == 0)
return L;
if (i < 1)
return NULL;
while (p && j < i)
{
p = p->next;
j++;
}
return p;
}
按值查找
根据指定数据获取该数据所在位置
Lnode* Locate(LinkList L, ElemType e)
{
//在线性表L中查找值为e的数据元素
//找到,则返回值为e的数据元素的地址,查找失败返回NULL
Lnode* p = L->next;
while (p != NULL && p->data != e)
{
p = p->next;
}
return p;
}
插入:在第i个结点前插入值为e的新结点
Status Insert(LinkList& L, int i, ElemType e)
{
Lnode* p;
Lnode* s;
p = GetElem(L, i - 1);
s = new Lnode;
s->data = e;
s->next = p->next;
p->next = s;
}
删除第i个结点
Status Delete(LinkList& L, int i, ElemType e)
{
Lnode* p;
Lnode* q;
p = GetElem(L, i - 1);
q = p->next;
p->next = q->next;
delete q;
}
头插法:
void Create1(LinkList& L, int n)
{
L = new Lnode;
L->next = NULL;
for (int i = n; i > 0; --i)
{
p = new Lnode;
cin >> p->data;
p->next = L->next;
L->next = p;
}
}
尾插法:
void Creat2(LinkList& L, int n)
{
L = new Lnode;
L->next = NULL;
Lnode* r;//创建尾指针
Lnode* p;
r = L;
for (int i = 0; i < n; i++)
{
p = new Lnode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}