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

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

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

猜你喜欢

转载自blog.csdn.net/qq_39906884/article/details/109741264