ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

考研数据结构(九):单链表排序(直接插入排序、冒泡排序、选择排序)

2021-11-23 17:32:50  阅读:153  来源: 互联网

标签:head LNode 插入排序 冒泡排序 next printf 排序 data 节点


#include <stdio.h> 
#include <stdlib.h>

typedef struct LNode {
	int data;
	struct LNode *next; 
}LNode,*ListLink;

// 初始化带头节点的单链表 
void initListLink(ListLink &L) {
	L = (LNode *)malloc(sizeof(LNode));
	L->next = NULL;
	return ;
}

// 尾插法建立单链表 
void tailCreateListLink(ListLink &L) {
	initListLink(L);
	
	LNode *p,*s,*r;
	r = L;
	int x;
	while(scanf("%d",&x) != EOF) {
		if(x == -1) break;
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next =s;
		r = s;
	}
	r->next = NULL;
	return ;
}

// 单链表的遍历输出 
void print(ListLink &L) {
	LNode *p = L->next;
	while(p != NULL) {
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
	return ;
}

void insertSort(ListLink &L) {
	/*
		p节点 : 代表每一个即将待插入的节点   
		temp节点 : 代表 p 节点的后继节点,因为我们在插入完当前节点后,
				   可能并不是插入到了最后一个节点,如果是插入到了当前
				   节点之前,则顺序发生改变, 所以我们就需要保留待插入
				   节点的下一个节点,以便于我们执行完插入操作后下一个
				   节点的插入。
		head 节点 : 用于去遍历已排好序的链表,寻找合适的位置进行插入 
	
	*/ 
	LNode *p,*temp,*head;
	
	p = L->next;
	temp = p->next;
	p->next = NULL;
	p = temp;
	
	// 此时 L 中只有一个元素  
	
	while(p != NULL) {
		// 暂存 p 节点的后继节点 
		temp = p->next;
		
		// 在已经排好序的链表中找到合适的位置 
		head = L;
		while(head->next != NULL && p->data > head->next->data) {
			head = head->next;
		}
		
		// 在合适的位置进行插入 
		p->next = head->next;
		head->next = p;
		
		// 接着对下一个进行排序 
		p = temp;
	}
	
	
	return ;
	
}

/*
   冒泡排序:
   因为我们只交换节点的数据,所以在函数
   传递参数时不再需要引用地址。		 
   
*/ 
void bubbleSort(LNode *head) {
	for(LNode *temp = head->next; temp->next != NULL; temp = temp->next) {
		for(LNode *p = head->next; p->next != NULL; p = p->next) {
			if(p->data > p->next->data) {
				int t = p->data;
				p->data = p->next->data;
				p->next->data = t;
			}
		}
	}
	
	return ;
} 

// 选择排序
void selectSort(ListLink &L) {
	for(LNode *p = L->next; p->next != NULL; p = p->next) {
		// 与顺序表排序类似,先找假定一个最小的,接着遍历,寻找一个最小的与之交换数据 
		LNode *minNode = p;
		for(LNode *q = p->next; q->next != NULL; q = q->next) {
			if(q->data < minNode->data) {
				minNode = q;
			}
		}
		int t = minNode->data;
		minNode->data = p->data;
		p->data = t; 
	}
	return ;
} 


int main() {
	ListLink L;
	printf("单链表的排序:\n");
	printf("尾插法建立单链表:") ;
	tailCreateListLink(L);
	printf("初始序列:");
	print(L);
	
	printf("直接插入排序:");
	insertSort(L);
	print(L);


	printf("尾插法建立单链表:") ;
	tailCreateListLink(L);
	printf("初始序列:");
	print(L);
	
	printf("冒泡排序:");
	bubbleSort(L);
	print(L);
	
	printf("尾插法建立单链表:") ;
	tailCreateListLink(L);
	printf("初始序列:");
	print(L);
	
	printf("选择排序:");
	selectSort(L);
	print(L);
	return 0;
}

// 5 6 3 1 9 8 2 4 -1

请添加图片描述
参考链接:https://blog.csdn.net/weixin_43054397/article/details/111415144

标签:head,LNode,插入排序,冒泡排序,next,printf,排序,data,节点
来源: https://blog.csdn.net/qq_43619271/article/details/121498278

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有