知识点1【链表的插入】0-1
1、在链表的尾部插入
//链表的尾部插入
STU* insert_link(STU *head, STU tmp)
{
//1、申请待插入的节点
STU *pi = (STU *)calloc(1,sizeof(STU));
if(pi == NULL)
{
perror(calloc);
return head;
}
//2、将tmp的数据 赋值到 *pi
*pi = tmp;
pi->next = NULL;
//3、将节点插入到链表的尾部
if(head == NULL)//链表不存在
{
head = pi;
return head;
}
else//链表存在
{
//a、寻找链表的尾节点
STU *pb = head;
while(pb->next != NULL)//如果不是尾节点
pb = pb->next;//pb就指向下一个节点
//b、用尾结点 pb 链接上 插入的节点pi
pb->next = pi;
return head;
}
return head;
}
2、链表的有序插入(难度)0-2
//链表的有序插入 以num的顺序为准(小--->大)
STU* insert_link(STU *head, STU tmp)
{
//1、给待插入的节点pi 申请 堆区空间
STU *pi = (STU *)calloc(1,sizeof(STU));
if(pi == NULL)
{
perror("calloc");
return head;
}
//2、将tmp的内容 赋值给 *pi
*pi = tmp;
pi->next = NULL;
//3、链表节点pi的插入
if(head == NULL)//链表不存在
{
head = pi;
return head;
}
else//存在
{
//a、寻找插入点
STU *pb = head, *pf = head;
while(pb->num < pi->num && pb->next != NULL)
{
pf = pb;
pb = pb->next;
}
//b、插入点的判断
if(pb->num >= pi->num)//头部 中部插入
{
if(pb == head)//头部之前插入
{
pi->next = head;
head = pi;
return head;
}
else//中部插入
{
pf->next = pi;
pi->next = pb;
return head;
}
}
else//尾部插入
{
pb->next = pi;
return head;
}
}
return head;
}
知识点2【链表查询某个节点】 按姓名 查找
STU* search_link(STU *head, char *name)
{
//1、判断链表是否存在
if(head == NULL)//不存在
{
printf("link not found\n");
return NULL;
}
else//链表存在
{
STU *pb = head;
//逐个将节点中的name 和 name比较 如果不相等 pb=pb->next
while(strcmp(pb->name,name)!=0 && pb->next != NULL)
pb = pb->next;
//判断是否找到
if(strcmp(pb->name,name)==0)//找到
return pb;
else//没找到
return NULL;
}
return NULL;
}
知识点3【删除链表指定节点】1-1
STU* detele_link(STU *head,char *name)
{
//1、判断链表是否存在
if(head == NULL)//不存在
{
printf("link not found\n");
return head;
}
else//存在
{
//2、寻找删除点
STU *pf=head, *pb = head;
while(strcmp(pb->name,name)!=0 && pb->next != NULL)
{
pf = pb;
pb = pb->next;
}
//3、找到删除点
if(strcmp(pb->name,name)==0)//找到删除点
{
//4、判断删除的位置
if(pb == head)//删除头结点
{
head = pb->next;
free(pb);
}
else//中部 或 尾部节点
{
pf->next = pb->next;
free(pb);
}
printf("已成功删除%s的相关节点\n",name);
return head;
}
else//没找到删除点
{
printf("链表中没有%s相关的数据节点信息\n",name);
}
}
return head;
}
知识点4【链表的释放】
STU* free_link(STU *head)
{
//判断链表是否存在
if(head == NULL)
{
printf("link not found\n");
return head;
}
else//链表存在
{
STU *pb = head;
//逐个节点释放
while(pb != NULL)
{
//head保存下一个节点的位置
head = pb->next;
//释放pb指向的节点
free(pb);
//pb 指向 head
pb = head;
}
printf("链表已经释放完毕\n");
return head;
}
return head;
}
回顾一下:
链表的插入:头部之前插入 尾部插入 有序插入
1、为插入的节点pi申请空间
2、将tmp的值赋值给*pi *pi = tmp
3、判断链表是否 存在
3-1:不存在 head = pi
3-2: 存在 (尾部插入 有序插入) 寻找插入点 安装具体的位置 插入节点
链表的遍历:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点遍历 注意 别越界。
链表的查询:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点比较 比较成功返回位置 注意 别越界。
链表节点的删除:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点比较 删除指定节点 注意 别越界。
释放链表:
1、判断链表是否存在
1-1:不存在 不执行任何操作
1-2:存在 逐个节点节点释放 注意 别越界
知识点5【链表的逆序】1-2
STU* reverse_link(STU *head)
{
//判断链表是否存在
if(head == NULL)
{
printf("link not founf\n");
return head;
}
else//链表存在
{
//int *p,num;//p为int * , num为int
STU *pb,*pr;//pb为STU * , pr为STU *
//pb保存head->next(原因head->next会置NULL)
pb = head->next;
//将head->next置NULL (原因:头节点变尾节点)
head->next = NULL;
while(pb != NULL)
{
//pr保存pb->next (原因:pb->next会指向head)
pr = pb->next;
//pb->next 指向 head (原因:逆转方向)
pb->next = head;
//保存 逆转方向的代码 可以重复 执行
head = pb;
pb = pr;
}
return head;
}
return head;
}
知识点6【链表的排序】
选择法排序:(以数组实现)
#include<stdio.h>
int main()
{
int arr[10]={0};
int n = sizeof(arr)/sizeof(arr[0]);
int i=0,j=0,min=0;
printf("请输入%d个int数据\n",n);
for(i=0;i<n;i++)
{
scanf("%d",arr+i);
}
//选择法排序
for(i=0;i<n-1; i++)
{
for(min=i,j=min+1; j<n;j++)
{
if(arr[min] > arr[j])
min = j;
}
if(min != i)
{
int tmp = 0;
tmp = arr[i];
arr[i]=arr[min];
arr[min]=tmp;
}
}
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
运行结果:选择法排序:(以链表实现)