链式线性表的创建(顺序存取)
- 数据域:存储元素数值数据
- 指针域:存储直接后继结点的存储位置
头指针:是指向链表中第一个结点的指针
首元结点:是指链表中存储第一个数据元素的结点
头结点:是在链表的首元结点之前附设的一个结点
1、创建链表的结构体
typedef int ElemType;
typedef struct Londe { //声明结点的类型和指向结点的指针类型
ElemType data; //结点的数据域
struct Londe* next; //结点的指针域
}Londe,*LinkList; //LinkList为指向结构体Londe的指针类型
2、链表的初始化
//单链表的初始化
//生成新的结点作为头结点,用头指针L指向头结点
//将头结点的指针域置空
void InitList(LinkList& L) {
L->data = 0;
L->next = NULL;
}
这里需要注意的是在主函数中需要在声明定义了链表后,紧接着分配该链表的存储空间
即:L = (LinkList)malloc(sizeof(Londe)); 否则链表初始化无法传入主函数中
3、单链表的销毁
void DestroyList(LinkList& L) {
LinkList p;
while (L) { //当L=NULL时结束循环
p = L;
L = L->next;
free(p);
}
}
4、清空单链表
//只保留头指针和头结点
void ClearList(LinkList& L) {
LinkList p, q; //p用来存储将要删除的结点,q用来存储下一结点的地址
p = L->next;
while (p) { //当p=NULL时结束循环
q = p->next;
delete p;
p = q;
}
L->next = NULL; //将头结点指针域为空
}
5、求链表的表长
//从首元结点开始统计所有结点的个数
int LengthList(LinkList& L) {
LinkList p; //用来存储下一个结点的地址
int i=0; //用来统计指针移动次数进而确定链表长度
p = L->next;
while (p) {
i++;
p = p->next;
}
return i;
}
6、取单链表中第i个元素的内容
ElemType Get(LinkList& L, int i) {
LinkList p;
int j = 0; //使用计数从头结点开始指针开始移动,并且逐个
p = L->next; //比对对应的数据域是否与传入的参数相同,若是
while (p) { //相同则输出j的值即为要查找的位置
j++;
if (j == i) {
return p->data;
}
p = p->next;
}
//else if (!p || i < 1) { //当输入要查找的位置小于1时或者链表为空时
return -1;
}
7 1、按值查找(返回其对应的位置)
int Find(LinkList& L, ElemType e) {
LinkList p;
p = L->next;
int j = 1;
while (p) {
if (p->data == e) {
return j;
}
p = p->next;
j++;
}
return 0;
}
2、按所给位置查找(返回对应位置的数据域)
Londe* Find1(LinkList& L, int i) {
LinkList p;
int j = 0;
p = L->next;
while (p && j < i) {
p = p->next;
j++;
}
return p;
}
8、插入
void Inser(LinkList& L, int i, ElemType e) {
LinkList p;
//先找到i位置的i-1的结点
p = L->next;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) { //插入位置大于表长+1或小于1,插入位置非法
printf("输入的位置非法");
}
LinkList s = new Londe;
s->data = e;
s->next = p->next;
p->next = s;
}
9、删除
ElemType Delete_L(LinkList& L, int i,ElemType &e) {
LinkList p,q;
p = L;
int j = 0;
while (p->next&& j < i-1) {
p = p->next;
j++; //找到i-1位置结点并将p指向该结点
}
if (!(p->next) || j > i - 1)
return 0;
q = p->next; //要删除的元素的指针域
e = q->data;
delete q; //释放要删除的结点的空间
return 1;
}