下方采取了两种排序算法,冒泡(short1)与插入排序(Short2),特别需要注意的是,排序算法的操作的是phead本身地址,而冒泡排序只是简单的数据(data)交换,而且此处虽然创建了头节点函数creat(),但是在进行数值插入时,会把头节点覆盖,所以本质上是没有头节点的(头节点只有指针指向,无数据)。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} linklist;
linklist*creat()
{
linklist*p=(linklist*)malloc(sizeof(linklist));
if(p==NULL) return NULL;
p->data=-1;
p->next=NULL;
return p;
}
int len_list(linklist* head)
{
if(head==NULL) return 0;
int num=0;
while (head!=NULL)
{
num++;
head=head->next;
}
return num;
}
int sort1(linklist *head)
{
if(head==NULL) return -2;
if(head->next==NULL) return -1;
linklist *pt1=head;
int k=len_list(head);
for (int i = 0; i < k-1; i++)
{
head=pt1;
for (int j = 0; j <k-i-1; j++)
{
if((head->data)>(head->next->data))
{
int pt=head->data;
head->data=head->next->data;
head->next->data=pt;
}
head=head->next;
}
}
return 0;
}
void Sort2(linklist** head) {//无头节点,即第一个节点有数据。
if (*head == NULL || (*head)->next == NULL)
return; // 如果链表为空或只有一个元素则直接返回
linklist* sort = NULL; // 创建一个新链表用于存储排序后的结果
linklist* h = *head;
while (h != NULL) {
linklist* next = h->next;
// 插入当前节点到sort链表中的正确位置
if (sort == NULL || sort->data >= h->data) {
h->next = sort;
sort = h;
} else {
linklist* temp = sort;
while (temp->next != NULL && temp->next->data < h->data) {
temp = temp->next;
}
h->next = temp->next;
temp->next = h;
}
h=next;
}
*head = sort; // 更新原链表的头指针
}
//插入头插入
int insart_linklist(linklist**head,int val)
{
linklist* new=(linklist*)malloc(sizeof(linklist));
struct Node* pt1 = *head;
if (new!=NULL)
{
new->data=val;
new->next=NULL;
//链接
if (NULL==*head||pt1->data==-1)//清空后可以再次插入,pt1->data==-1代表头节点head的data值没有被赋值,但是我们这个是无空值头节点。
{
*head=new;
}
else
{
struct Node* pt = *head;
while (pt->next!=NULL)//找尾节点
{
pt = pt->next;
}
pt->next = new;
}
}
return 0;
}
int out(linklist*head)
{
if(head==NULL) return -1;
while(head->next!=NULL)
{
printf("%d ",head->data);
head=head->next;
}
printf("%d ",head->data);
return 0;
}
int main()
{
linklist*phead=creat();
insart_linklist(&phead,3);
insart_linklist(&phead,6);
insart_linklist(&phead,1);
insart_linklist(&phead,5);
insart_linklist(&phead,4);
insart_linklist(&phead,2);
insart_linklist(&phead,7);
insart_linklist(&phead,0);
// sort1(phead);
Sort2(&phead);
out(phead);
return 0;
}