一、链表的逆序
(一)图解
1、使用pb、pr来记录断开后的节点地址
-
在反向链接(1与2)前需要断开当前节点与后续节点的链接(2与3的链接)
2、移动pb、head形成循环
- 将2变为头节点,重复操作1
3、循环后
4、代码演示
(二)代码实现(重要)
STU* reverse_link(STU *head)
{
// 判断链表是否存在
if(head == NULL)
{
printf("链表创建失败\n");
return;
}
else
{
STU *pb,*pr; // 结构体指针类型
pb = head‐>next; // pb保存head‐>next(原因head‐>next会置NULL)
head‐>next = NULL; // 将head‐>next置NULL (原因:头节点变尾节点)
while(pb != NULL)
{
pr = pb‐>next; // pr保存pb‐>next (原因:pb‐>next会指向head)
pb‐>next = head; // pb‐>next 指向 head (原因:逆转方向)
head = pb; //保存 逆转方向的代码 可以重复 执行
pb = pr;
}
return head;
}
return head;
}
二、链表的排序
(一)选择法排序(以数组实现)
1、图解
2、代码实现
#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++)
{
min=i; // 记录给定的最小的数
for(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;
}
(二)选择法排序(以链表实现)
1、图解
2、代码实现
void sort_link(STU *head)
{
// 判断链表是否存在
if(NULL == head)
{
printf("链表创建失败\n");
return;
}
else
{
STU *p_i = head; // i=0
while(p_i‐>next != NULL) // i<n‐1 外层循环
{
STU *p_min = p_i;//min = i;
STU *p_j = p_min‐>next; // j = min+1
while(p_j != NULL) // j<n 内层循环
{
// 寻找成员num最小值的 节点
if(p_min‐>num > p_j‐>num) // if(arr[min] > arr[j])
p_min = p_j; // min = j
p_j = p_j‐>next; // j++
}
if(p_min != p_i)//min != i
{
// 只交换数据域(1、节点内容整体交换 2、只交换指针域)
// 1、节点内容整体交换(数据域交换第1次 指针域交换第1次)
STU tmp;
tmp = *p_i;
*p_i = *p_min;
*p_min = tmp;
// 2、只交换指针域(指针域交换第2次)
tmp.next = p_i‐>next;
p_i‐>next = p_min‐>next;
p_min‐>next = tmp.next;
}
p_i = p_i‐>next; // i++
}
}
}