[数据结构]无头单链表冒泡排序的两种方式

  1. 交换节点数据的方式
  2. 交换节点指针的方式
# include <iostream>
using namespace std;

typedef int ElemType;
typedef struct LinkList {
	ElemType data;
	struct LinkList *next;
}LinkList, *Node;

// 创建无头链表 
Node createList(ElemType num) {
	Node head = new LinkList;
	head->next = NULL; 
	head->data = num;
	return head;
}

// 添加节点, 头插法, 需要换头 
void insertList(Node &head, ElemType num) {
	Node t = head;
	Node newNode = new LinkList;
	newNode->next = head;
	newNode->data = num;
	// 头插法换头 
	head = newNode;
} 

// 链表冒泡排序  交换数据 
void bubbleSort1(Node &head) {
	// 只有一个节点的情况 
	if (head->next == NULL) {
		return;
	}
	
	// 每次循环到每次最后交换位置 
	Node flag = NULL, j = NULL, t = NULL;
	do {
		j = head;
		t = flag;
		flag = NULL;
		
		while (j->next != t) {
			if (j->data > j->next->data) { //交换数据域 
				ElemType tData = j->data;
				j->data = j->next->data;
				j->next->data = tData;
				flag = j->next; 
			}
			j = j->next;
		}
	} while (flag != NULL);
	
	
}


// 链表排序  交换指针  
/**
	因为要考虑到是无头链表, 
	可以先用冒泡排序使得除头节点之外有序, 
	然后再更换头节点, 并把原来头节点插入到合适的位置(一次插排)
*/ 
void bubbleSort2(Node &head) {
	// 只有一个节点的情况 
	if (head->next == NULL) {
		return;
	}
	
	// 每次循环到每次最后交换位置, 对除头节点外的节点进行排序 
	Node flag = NULL, j = NULL, t = NULL;
	do {
		j = head;
		t = flag;
		flag = NULL;
		
		while (j->next->next != t) {
			//交换指针
			if (j->next->data > j->next->next->data) {  
				Node p1 = j->next;
				Node p2 = j->next->next;
				p1->next = p2->next;
				j->next = p2;
				p2->next = p1;
				flag = j->next->next; 
			}
			j = j->next;
		}
	} while (flag != NULL);
	
	// 更换头节点, 并且将头节点插入到合适的位置(一次插排)
	Node q = head, h = head;
	head = head->next; 
	//Node q = head->next;
	while (q->next != NULL) {
		if (q->next->data > h->data) {
			h->next = q->next;
			q->next = h;	
			break;
		}
		q = q->next;
	} 
}

// 打印链表 
void printList (Node &head) {
	Node t = head;
	while (t != NULL) {
		cout << t->data << " ";
		t = t->next;
	} 
	cout << endl;
}

// 销毁链表
void destoryList(Node &head) {
	Node t = head;
	while (t != NULL) {
		Node p = t->next;
		delete t;
		t = p;
	}
} 

int main() {
	Node head = createList(5);
	insertList(head, 7); 
	insertList(head, 9); 
	insertList(head, 3); 
	insertList(head, 6); 
	insertList(head, 2); 
	insertList(head, 15); 
	insertList(head, 100); 
	insertList(head, 52); 
	insertList(head, 4); 
	printList(head);
	bubbleSort2(head);
	printList(head);
	destoryList(head);
	
	return 0;
}

输出结果如下:
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是C语言单链表冒泡排序和查找的实现方法: 1. 单链表冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的元素,比较相邻的两个元素大小,并根据大小交换位置,直到没有任何一对数字需要比较为止。在单链表中,需要交换节点的指针而不是节点的数据。 ``` void bubble_sort(struct node *head) { struct node *p, *q, *end = NULL; while (head != end) { p = head; while (p->next != end) { q = p->next; if (p->data > q->data) { int tmp = p->data; p->data = q->data; q->data = tmp; } p = p->next; } end = p; } } ``` 上面的代码中,`head` 是链表的头指针,`end` 是排序的结束位置。每次排序结束后,`end` 移动到上一次排序中最后一个节点的位置。内循环中的 `p` 指向当前节点,`q` 指向它后面的节点。如果 `p` 的数据大于 `q` 的数据,交换它们的值。 2. 单链表的查找 单链表的查找和数组的查找类似,也是遍历整个链表,依次比较每个节点的值和目标值是否相等。如果找到了相等的节点,返回该节点的指针,否则返回 NULL。 ``` struct node *search(struct node *head, int value) { struct node *p = head; while (p != NULL) { if (p->data == value) { return p; } p = p->next; } return NULL; } ``` 上面的代码中,`head` 是链表的头指针,`value` 是要查找的值。每次循环中,`p` 指向当前节点,如果当前节点的值等于目标值,返回该节点的指针。如果遍历完整个链表都没有找到相等的节点,返回 NULL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哇咔咔负负得正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值