数据结构(C/C++)
P271 3.1
- 用链表做插入排序
/*
链表插入排序
1. 链表创建
2. 输入
3. 插入和排序
*/
#include <iostream>
using namespace std;
struct insLink
{
// 链表
int data;
insLink *next;
};
insLink *create(int *data, int length)
{
// 创建一个带头部的链表
insLink *head = (insLink *)malloc(sizeof(insLink)); // 创建链表头部
head->next = NULL; // 初始化头部的下一个节点
insLink *node = head; // 创建一个头部指针
if (length <= 0)
{
// 如果输入长度为空
free(head);
return NULL;
}
else
{
for (int i = 0; i < length; i++)
{
// 逐个创建节点
node->next = (insLink *)malloc(sizeof(insLink));
node->next->data = data[i];
node->next->next = NULL;
node = node->next;
}
return head;
}
}
void output(insLink *head)
{
// 输出链表
printf("sorted ->");
do
{
head = head->next;
printf("%d ", head->data);
} while (head->next != NULL);
printf("\n");
}
void rearInsert(insLink *node, insLink *newnode)
{
// 在node节点后插入newnode
newnode->next = node->next;
node->next = newnode;
}
void sort(insLink *head)
{
// 升序排序
insLink *node = head;
do
{
node = node->next;
insLink *tempnode = head;
while (tempnode->next != node->next)
{
if (node->next != NULL && node->next->data <= tempnode->next->data)
{
insLink *tempnext = node->next->next;
rearInsert(tempnode, node->next);
node->next = tempnext;
}
tempnode = tempnode->next;
}
} while (node->next != NULL);
}
int main()
{
int i;
printf("请输入共有几个数字:");
scanf("%d", &i);
int nums[i];
for (int j = 0; j < i; j++)
{
scanf("%d", &nums[j]);
}
insLink *head = create(nums, i);
sort(head);
output(head);
return 0;
}
运行结果例子: