线性表相关背诵知识点
线性表的类型描述:
//单链表的结点类型
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//双链表中结点类型
typedef struct Dnode{
ElemType data;
struct Dnode *prior, *rear;
}Dnode, *DLinklist;
//静态链表的结点类型
#define MaxSize 50
typedef struct{
ElemType data;
int next;
}SLinkList[MaxSize];
//所以说静态链表本质上操作等同数组
//
栈、队列和数组的类型描述:
//栈的存储类型
define MaxSize 50
typedef struct LNode{
ElemType data[MaxSize];
int top;
}SqStack;
顺序表
1.顺序表不能完整地表示树
2.顺序存储不止能用于存储线性结构
3.用数组存储线性表时,还应该用一个变量来存储线性表的长度 指针类型:L->data[i];另一个是L.data[i]
4.若线性表最常用的操作是存取任意指定序号的元素和最后进行插入和删除运算,则利用顺序表存储方式
5.题目中要求能按下标随机存储每个元素,所以必须用数组。解决结点不等长问题,则可用一个指针数组A,使得A[i]指向第i个元素。
6.对于顺序存储的线性表,访问任一结点的时间复杂度是O(n),增加结点的时间复杂度为O(1);
在等概率时,平均情况下插入一个元素大约要移动表中的n/2个元素。
在等概率时,平均情况下删除一个元素大约要移动表中的(n-1)/2个元素,删除一个元素最坏情况下要移动n-1个元素。
原因是:插入的时候有n+1个位置可以插入,删除的时候有n个元素可以删除
具体移动次数取决于位置i和表长n两个因素
7.对一个长度为n的线性表采用顺序查找,等概率条件下,查找成功的平均检索长度为(n+1)/2
8.线性表删除结点直接用后续结点覆盖要删除结点即可。
9.对于一个长度为n的线性表,要删除第i个元素,在顺序表示的情况下,计算复杂性为n-i次移动,在链式表示的情况下,计算复杂性为两次赋值运算和一次delete运算
单链表
10.在C语言中,链式存储结构既可以用指针类型来表示,也可以用数组来描述
11.静态链表就是数组表,所以在静态链表中的指针表示的就是下一元素在数组中的位置,静态链表预分较大空间,且插入和删除不需要移动元素。
12.唐如破要在第i个结点前插入元素,修改的是第i-1个结点的指针
13.头指针、头结点和首元结点的区别:首元结点就是第一元素结点,它是头结点后边的第一个结点
14.增加一个头结点的目的是为了标识表结点中首结点的位置。
15.对给定的n个元素,建立一个有序单链表的时间复杂度为O(n2)
16.判断链表L是否递减
//只有关键代码
while(p->next !=NULL && a = true)
{
if(p->element > q->element)
{ p = q;
q = p -> next;
}
else
a = FALSE;
}
17.线性表、链表插入/删除元素后,都需要单独一条代码修改表长度
在无尾指针的单链表中,删除最后一个元素需要遍历一遍长度
18.此题看看
链表的三种插入算法时间复杂度均为O(n)
//单链表中删除一个结点的算法
int DelNode(LinkList head, LNode *p)
{
LNode * q;
q = head;
while(q -> next && p!= q-> next) q = q -> next;
if(!q -> next) return 0;
q -> next = p->next;
return p->data;
}
循环列表
**将单链表最后一个结点的指针域指向头结点便成为循环链表。循环链表的结点结构与单链表相同,操作与单链表类似,区别仅在于尾结点的判定不一样**
19.判断带头结点的单循环链表L仅有一个元素结点条件是:L->next->next == L && L->next != L
20.交换前后驱结点。