数组:一段连续的内存空间顺序存储
链表:一种新的数据组织形式,链式
typedef int Datatype;
typedef struct Node{
Datatype data;
struct Node *next;
}Node,*Linklist;
//头插建立:将新节点插入到当前链表的表头结点之后
int main(){
//初始化空表
Linklist L=(Linklist)malloc(sizeof(Node));
L->next=NULL;
//p1指向的节点
Linklist p1=(Linklist)malloc(sizeof(Node));
p1->data=1;
//将p1指向的节点与L指向的节点相连
p1->next=L->next;
L->next=p1;
Linklist p2=(Linklist)malloc(sizeof(Node));
p2->data=2;
p2->next=L->next;
L->next=p2;
}
//尾插建立:将新节点插入到当前链表的表尾上
int main(){
Linklist L=(Linklist)malloc(sizeof(Node));
L->next=NULL;
Linklist R=L;//建立尾指针R,并始终指向链尾
Linklist p1=(Linklist)malloc(sizeof(Node));
p1->data=1;
p1->next=R->next;
R->next=p1;
R=p1;//更新R,指向链尾
Linklist p2=(Linklist)malloc(sizeof(Node));
p2->data=2;
p2->next=R->next;
R->next=p2;
R=p2;
}
//单链表的长度
int list_length (Linklist L){//传入单链表的表头指针L
int count=0;
Linklist p=L->next;
while(p){
count++;
p=p->next;
}
return count;
}
//找到值为x的节点
Linklist search_x(Linklist L,Datatype x){
Linklist p=L->next;
while(p){
if(p->data!=x){
p=p->next;
}else{
break;//查找成功
}
}
if(p==NULL){//查找失败
printf("没有找到值为%d的节点!",x);
}
return p;
}
删除
//删除L中p指向的节点
void Dellist(Linklist L,Linklist p){
Linklist pre=L->next;
while(pre->next!=p){//找到p的前驱节点
pre=pre->next;
}
pre->next=p->next;
free(p);
}
//将单链表就地逆置(L指向的节点不存数据,dummy node),使用头插的方式
void rev(Linklist L){
Linklist p=L->next,q;//p先预存第一个节点的位置
L->next=NULL;//将表头和其他节点断开
while(p){
q=p->next;//记录q为p的后一个节点,预存后边节点的位置
p->next=L->next;//p指向的节点作为新插入的节点,头插建立,插入到头节点之后
L->next=p;
p=q;//更新p
}
}
单链表的合并
非递减有序排列:即递增,但不是严格单调递增
两个单链表LA和LB,其元素均为非递减有序排列.现将他们合并为LC,要求LC也是非递减有序排列
// 将两个非递减有序排列单链表 LA 和 LB 合并为非递减有序排列 LC
Linklist merge(Linklist LA,Linklist LB){
Linklist pa,pb,LC,R;
pa=LA->next; // 预存后边节点的位置
pb=LB->next;
LC=LA; // 可以选择 LA 或 LB作为合并后单链表的表头指针 LC
LC->next=NULL; // 进行断开
R=LC; // 设置尾指针
// 循环比较找到值最小的节点进行尾插。
while(pa&&pb){
if(pa->data<=pb->data){
R->next=pa;
R=pa; // pa指向的节点中的数据更小时,将 pa 指向的节点进行插入 (尾插)。
pa=pa->next; // pa 向后移
}else{
R->next=pb;
R=pb; // pb指向的节点中的数据更小时,将 ....
pb=pb->next; // pb 向后移
}
}
// 循环结束后没有结束的表节点 直接串联到尾指针之后。
if(pa){
R->next=pa;
}else{ // 当 pa和pb二者有一个是 NULL时 直接将尾指针和后续节点连接
R->next=pb;
}
free(LB);
return LC;
}