数据结构链式存储
链式存储的基本概念:
基本特点
- 逻辑上连续,物理上不连续
专有名词
-
头指针(head):要想找到这个链表必须有头指针,它指向链表的第一个结点的地址
-
头结点:可有可不有,并不存放数据,可以存放一些信息,如链表的长度等信息,也可以为空
-
首元结点:第一个开始存放数据的结点
单链表、双链表、循环链表
-
单链表:结点只有一个指针域的链表叫做单链表
-
双链表:结点有两个指针域的链表叫做双链表
-
循环链表:最后一个元素指向第一个结点
通过有无头结点可以将链表划分为两种类型:
- 有头节点的链表:
- 空表表示:头结点的指针域为空
- 头结点的好处:便于首元结点的处理,便于空表和非空表的处理
- 无头结点的链表:
- 空表表示:头指针为空
链表的一些基本操作
定义
typedef struct Lnode {
int stuNum[8];
char stuName[15];
int score;
struct Lnode* next;
}Lnode,*LinkList;
链表的初始化
void initList(LinkList& L) {
L = (LinkList)malloc(sizeof(Lnode));
L->next = NULL;
}
判断是否为空表
void judgeBlank(LinkList& L) {
if (L->next == NULL)
printf("该表为空\n");
else
printf("该表不为空\n");
}
链表销毁
void destroyList(LinkList& L) {
LinkList p;
while (L) {
p = L;
L = L->next;
free(p);
}
printf("链表销毁成功!!");
}
清除链表
void clearList(LinkList& L) {
LinkList p = L->next;
LinkList q;
while (p) {
q = p->next;
free(p);
p = q;
}
}
链表元素个数
int lengthList(LinkList& L) {
Lnode* p;
p = L->next;
int length = 0; //记录长度的变量
while (p) {
length++;
p = p->next;
}
return length;
}
按照元素的个数取值
int getElem(LinkList& L,int i,int getScore) {
Lnode* p;
p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
printf("没有这个元素");
return ERROR;
}
else {
printf("有这个成绩,成绩的值为:%d", p->score);
getScore = p->score;
return OK;
}
}
寻找输入元素的地址
Lnode* Locationaddress(LinkList& L, int getScore) {
Lnode* p = L->next;
while (p && p->score != getScore) {
p = p->next;
}
return p;
}
寻找输入元素的是第几个元素
int LocationIndex(LinkList& L, int getScore) {
Lnode* p = L->next;
int index = 1;
while (p && p->score != getScore) {
p = p->next;
index++;
}
return index;
}
按照索引插入元素
int insertList(LinkList& L, int index, int stuNum, char stuName, int score) {
Lnode* p = L;
int i = 0;
while (p && i < index-1) {
p = p->next;
i++;
}
if (!p || i > index - 1)
return ERROR;
Lnode* s = (Lnode *)malloc(sizeof(Lnode));
s->stuNum = stuName;
s->stuName = stuNum;
s->score = score;
s->next = p->next;
p->next = s;
return OK;
}
前插法建立链表
void createListHead(LinkList& L, int n) {
L = (Lnode*)malloc(sizeof(Lnode));
L->next = NULL;
for (int i = n; i > 0; i--) {
Lnode* p = (Lnode*)malloc(sizeof(Lnode));
scanf("%d%s%d", p->stuNum, p->stuName, &(p->score));
p->next = L->next;
L->next = p;
}
}
后插法建立链表
void createListR(LinkList& L, int n) {
L = (Lnode*)malloc(sizeof(Lnode));
Lnode* r = L;
for (int i = n; i > 0; i--)
{
Lnode* p = (Lnode*)malloc(sizeof(Lnode));
scanf("%d%s%d", p->stuNum, p->stuName, &(p->score));
r->next = p;
r = p;
}
}