有一个带头结点的单链表L,设计一个算法使其元素递增有序
代码思路:
我这里懒得搞那个指针了,直接遍历一遍链表,把链表的元素复制到数组arr里面
对数组A进行一下排序,排完之后再把元素复制到L里面。
至于排序你用啥算法都行,我这里用插入排序,你也可以用别的。
c
void linkSort(LinkList* L) {
int arr[10] = { 0 };//这里默认L的最大长度不超过10
int i = 0;
int j = 0;
LNode* p = (*L)->next;//用p来遍历链表
for (i = 0;i < 10;i++) {//把链表元素赋给arr
arr[i] = p->data;
p = p->next;
}
//插入排序-升序
for (i = 1;i < 10;i++) {//插入排序-升序
int tmp = arr[i];
for (j = i;j >= 0;j--) {
if (tmp < arr[j - 1]) {
arr[j] = arr[j - 1];//后移一位
}
else {
arr[j] = tmp;
break;
}
}
}
printf("\n");
p = (*L)->next;//p重新回到链头
for (i = 0;i < 10;i++) {//把链表元素赋给arr
p->data = arr[i];
p = p->next;
}
}
int main() {
LinkList L;
InitList2(&L);//初始化一个带头结点的链表3,9,1,4,2,8,5,7,6,10
printf("初始链表为:");
print2(L);
linkSort(&L);
printf("排序后链表为:");
print2(L);
return 0;
}
ps:链表定义及初始化,还有打印函数
c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
#include<malloc.h>
//单链表定义
//链表结点
int A[10] = { 3,9,1,4,2,8,5,7,6,10 };
typedef struct {//定义单链表结点类型
int data;//数据域
struct LNode *next;//指针域
}LNode, *LinkList;
//带头结点初始化-尾插法
void InitList2(LinkList* L) {
(*L) = (LNode*)malloc(sizeof(LNode));
(*L)->next = NULL;
LNode* rear = (*L);//标记表尾
int i = 0;
for (i = 0;i < 10;i++) {
LNode* p = (LNode*)malloc(sizeof(LNode));//创建一个新结点
p->data = A[i];//新结点赋值
rear->next = p;//接到L上
rear = p;//标记表尾
}
rear->next = NULL;
}
void print2(LinkList L) {//打印带头结点的链表
LNode* i = L->next;//用i指针遍历整个链表
while (i != NULL) {
printf("%d ", i->data);
i = i->next;
}
}