头文件:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}link,*linkP;
linkP insertNode(linkP head,int data);
linkP insertSort(linkP head);
被调函数:
#include"insertsort.h"
linkP insertNode(linkP head,int data){
linkP q = head;
if(head->next == NULL){ //第一次插入
linkP newnode = (linkP)malloc(sizeof(link));
newnode->data = data;
newnode->next = NULL;
head->next = newnode;
}else{
while(q->next!=NULL){
q=q->next;
}
linkP newnode = (linkP)malloc(sizeof(link));
newnode->data = data;
newnode->next = NULL;
q->next = newnode;
}
return head;
}
linkP insertSort(linkP head){
linkP newhead=(linkP)malloc(sizeof(link));
newhead->next=NULL;
linkP q=head; //用q访问head
linkP max; //max用来记录最大值
linkP tmp = NULL;
max = (linkP)malloc(sizeof(link));
max->data = head->data;
linkP maxpre = head; //用来记录最大值前的指针,以移除已被记录的最大值
while(head != NULL){ //head空,则排序完成
max->data = head->data;
q = head;
while(q->next!=NULL){ //q->next为空,则一轮最大值找出
if(q->next->data > max->data){
max->data = q->next->data;
tmp = q->next;
maxpre = q;
}
q=q->next;
}
insertNode(newhead,max->data);
if(tmp != NULL){ //最大数不是第一个
maxpre->next = tmp->next;
free(tmp);
tmp = NULL;
}else{ //最大数为第一个
tmp = head;
head = head->next;
free(tmp);
tmp = NULL;
}
}
free(max); //排完序释放max结点
max = NULL;
return newhead;
}
主函数:
#include <stdio.h>
#include <stdlib.h>
#include"insertsort.h"
int main(int argc, char *argv[]) {
linkP head = (linkP)malloc(sizeof(struct node));
linkP p=head;
int i=0;
while(i<20){
p->next = (linkP)malloc(sizeof(struct node));
p = p->next;
p->data = rand()%10;
p->next = NULL;
i++;
}
//insertNode(head,5);
printf("排序前输出:");
p = head->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
//head = head->next;
head = insertSort(head->next);
printf("排序后输出:");
p=head;
while(p!=NULL){
p = p->next;
printf("%d ",p->data);
}
printf("\n");
return 0;
}