1,表的实现分为数组和链表两种,对比一下优缺点。
对于表的操作分为:增删改查
①增:数组增加一个值需要两部:查找+后移 而链表只需要查找即可
②删:数组删除一个值需要两部:查找+前移 而链表只需要查找即可
这两种情况运行时间非常慢,并且需要已知数组大小;用链表实现最多妥当。
2,关于链表的简单demo实现
①链表节点的数据结构形式
struct Node{
int val;
struct Node* next;
};
②测试一个链表是否为NULL(带表头的空表)
Bool isEmpty(List L){
return L->next == NULL;
}
③测试当前是否为链表的末尾
BOOL isLast(Position P,List L){
return P->next == NULL;
}
④find例程
Positon Find(int x, List L){
Position P;
P = L->next;
while(P != NULL && P->val != x){
P = P->next;
}
return P;
}
⑤delete 例程
void Delete(int x, List L){
Position P = Find(x, L);
if(!isLast(P,L)){
Position tmp = P->next;
P->next = tmp->next;
free(tmp);
}else{
free(P);
P = NULL;
}
}
⑥插入例程
void Insert(int val, List L, Position P){
Position TempL = malloc(sizeof(struct Node));
if(TempL == NULL){
print("error!");
}
TempL->val = val;
Templ->next = P->next;
P->next = TempL;
}
⑦删除链表
void Destory(List L){
Position P, Tmp;
P = L->next;
L->Next = NULL;
while(P != NULL){
Tmp = P->next;
free(P);
P = Tmp;
}
}
3,链表的简单应用
①多项式ADT
f(x) = ax + bx + c
如何用链表来表示呢?
思想:定义一个数据结构: highval + nums[i]
highval表示最高幂 nums[i]表示从低到高各项系数的值(空为0)
多项式相加demo
#define MAXNUM 100
typede struct{
int highval;
int nums[MAXNUM+1];
}*Polynum;
void addPoly(Polynum Poly1, Polynum Poly2, Polynum ans){
int highval = fmax(Poly1->highval, Poly2->highval);
for(int i = highval; i >=0;i--){
ans->nums[i] = Poly1->nums[i] + Poly2->nums[i];
}
ans->highval = highval;
}
多项式相乘demo
typede struct{
int highval;
int nums[MAXNUM + 1];
}* Polynum
void MulPoly(Polynum Poly1, Polynum Poly2, Polynum ans){
ans->highval = Poly1->highval + Poly2->highval;
if(highval > MAXNUM){
return;
}
for(int i = Poly1->highval;i >= 0;i--){
for(int j = Poly2->highval;j >= 0;j--){
ans->nums[i+j] += Poly1->nums[i] + Poly2->nums[j];
}
}
}
②基数排序demo
首先先了解桶排序
这个排序原理非常简单!
①假设一个数据nums[100]元素 0 < nums[i] < 1000
②此时你就可以建立一个新的数组 hash[1000] = {0}
③遍历数组nums hash[nums[i]] ++;
④然后再把hash数组打印出来
基数排序也不难,基就是你准备排序的准则,可以基于10进制,也可以基于16进制
至此,链表你应该就学明白啦,下面开始做题啦!
1,反转链表
2,反转链表Ⅱ
3,两数相加
4,随机链表的复制
5,环形链表Ⅱ
6,重排链表
7,LRU 缓存
9,合并K的升序链表
10,K个一组翻转链表