冒泡排序实现链表交换节点排序(C语言)

   在用C语言解决链表排序问题时,如果遇到字符串,采用交换数据域的方式来就比较困难,本文章介绍如何以交换节点的方式来实现链表排序。
   废话不多直接上代码:
struct STUDENT *xuehaopai(struct STUDENT *head)
{
   
	struct STUDENT *min=head,*p1=head,*L=head,*pr=head,*pd=head,*p=NULL,*q=NULL;
	struct STUDENT *p2=head,*p3=head;
	if(head==NULL) return head;
	while(p1!=NULL)
	{
   
		p2=p1;
		while(p2!=NULL)//找气泡的循环
		{
   
			if(strcmp(min->studentId,p2->studentId)==1)
			{
   
				min=p2;
			}
			p2=p2->next;
		}
		if(L==head&&min==head)
		{
   
			head=min;//保持头指针的位置
			p1=min;		
		}else if(L==head&&min!=head	){
   
			pd=findNode(head,min);//找到min的上一个节点
			p=min
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言使用链表实现冒泡排序的代码实现如下: struct listNode { int data; struct listNode *next; }; void BubbleSort(struct listNode* head) { struct listNode *p, *q; int temp; if (head == NULL || head->next == NULL) return; for (p = head; p->next != NULL; p = p->next) { for (q = head; q->next != NULL; q = q->next) { if (q->data > q->next->data) { temp = q->data; q->data = q->next->data; q->next->data = temp; } } } } ### 回答2: 下面是用C语言实现冒泡排序算法的链表形式的代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; struct Node* createNode(int data) { struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); if (newNode == NULL) { printf("内存分配失败\n"); exit(1); } newNode->data = data; newNode->next = NULL; return newNode; } struct Node* insertNode(struct Node* head, int data) { if (head == NULL) { return createNode(data); } else { struct Node* newNode = createNode(data); newNode->next = head; return newNode; } } struct Node* bubbleSort(struct Node* head) { if (head == NULL || head->next == NULL) { return head; } struct Node* current; struct Node* next; int swapped; do { swapped = 0; current = head; while (current->next != NULL) { next = current->next; if (current->data > next->data) { int temp = current->data; current->data = next->data; next->data = temp; swapped = 1; } current = next; } } while (swapped); return head; } void printList(struct Node* head) { struct Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } int main() { struct Node* head = NULL; int n, data; printf("请输入要排序的数字个数:"); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("请输入第%d个数字:", i+1); scanf("%d", &data); head = insertNode(head, data); } printf("排序前的链表:"); printList(head); head = bubbleSort(head); printf("排序后的链表:"); printList(head); return 0; } ``` 以上代码创建了一个称为 Node 的结构体,表示链表中的节点。`createNode` 函数用于创建新的节点,`insertNode` 函数用于向链表插入节点。`bubbleSort` 函数用于实现冒泡排序算法并返回排好序的链表节点。 在主函数中,首先获取要排序的数字个数,并逐个插入到链表中。然后调用 `bubbleSort` 对链表进行排序,最后打印排序前和排序后的链表。 请注意,这里的冒泡排序算法是从头节点开始两两比较相邻节点的值,如果顺序不对则交换。算法会一直遍历链表直到没有发生交换操作,即达到最佳排序顺序为止。 ### 回答3: 冒泡排序是一种简单的排序算法,通过反复交换相邻元素的位置来实现排序。使用链表实现冒泡排序需要以下步骤: 1. 定义链表节点结构体,包含一个整型数据域和一个指向下一个节点的指针域。 2. 创建链表,并向其中插入待排序的元素。 3. 定义一个排序函数,用于对链表进行冒泡排序。函数内部使用两层循环,外层循环遍历链表节点个数次,内层循环进行相邻节点的比较和交换操作。 在内层循环中,如果当前节点的数据大于下一个节点的数据,则交换它们的位置;否则,继续比较下一对节点。 通过这样的循环操作,每次内层循环结束后,链表最后的节点就是当前未排序部分的最大值。 外层循环重复执行该过程,每次只需要遍历到上一轮未排序部分的前一个节点。 4. 在排序函数中添加适当的边界判断和指针操作,确保链表正确排序。 5. 输出排序后的链表。 以下是一个使用链表实现冒泡排序的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 链表节点结构体 typedef struct Node { int data; // 数据域 struct Node* next; // 指针域 } Node; // 创建链表 Node* createList(int arr[], int size) { Node* head = NULL; Node* tail = NULL; for (int i = 0; i < size; i++) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = arr[i]; newNode->next = NULL; if (head == NULL) { head = newNode; tail = newNode; } else { tail->next = newNode; tail = newNode; } } return head; } // 冒泡排序 void bubbleSort(Node* head) { if (head == NULL || head->next == NULL) { return; } Node* p; Node* q = NULL; int swapped; do { swapped = 0; p = head; while (p->next != q) { if (p->data > p->next->data) { int temp = p->data; p->data = p->next->data; p->next->data = temp; swapped = 1; } p = p->next; } q = p; } while (swapped); } // 打印链表 void printList(Node* head) { Node* p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int arr[] = {4, 2, 6, 3, 1, 5}; int size = sizeof(arr) / sizeof(arr[0]); Node* head = createList(arr, size); bubbleSort(head); printList(head); return 0; } ``` 运行结果为:1 2 3 4 5 6,表示链表已经成功按照升序进行冒泡排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值