C语言实现直插排序(链表)

头文件:

#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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值