C语言链表冒泡排序

大一学习C语言的作业,管理系统中需要排序,而且要求用链表,所以来分享两个链表排序的方法。第一种是交换链表的结点,第二种是链表中的数据交换。推荐第二种代码少,效率高。

方法一:

void Sort()//排序函数
{
 int i ,count = 0, num;//count记录链表结点的个数,num进行内层循环,
 NODE *p, *q, *tail;//创建三个指针,进行冒泡排序
 p = L;L首个链表
 while(p->next != NULL)//计算出结点的个数
 {
  count++;//结点的个数
  p = p->next;
 }
 for(i = 0; i < count - 1; i++)//外层循环,跟数组冒泡排序一样
 {
  num = count - i - 1;//记录内层循环需要的次数,跟数组冒泡排序一样,
  q = L->next;//令q指向第一个结点
  p = q->next;//令p指向后一个结点
  tail = L;//让tail始终指向q前一个结点,方便交换,也方便与进行下一步操作
  while(num--)//内层循环 次数跟数组冒泡排序一样
  {
   if(q->data > p->data)//如果该结点的值大于后一个结点,则交换
   {
    q->next = p->next;
    p->next = q;
    tail->next = p;//交换结点
   }
   tail = tail->next;
   q = tail->next;
   p = q->next;//让链表往下走
   } 
 } 
}


方法二:

void sort()//排序函数
{
	struct wareList *p,*t;//创建2个链表,temp临时链表,H头链表
	t=(struct wareList*)malloc(sizeof(struct wareList));
	for(temp = H->next ; temp!=NULL ; temp=temp->next)
	{
		for(p = H->next ; p->next!=NULL ; p = p->next)
		{
			if(p->b.num > p->next->b.num){
				t->b = p->b;
				p->b = p->next->b;
				p->next->b = t->b;//交换数据区
			}
		}
	}
}

还有很多不足,欢迎各位留言提出。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个 C 语言实现链表冒泡排序的示例代码: ``` #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct Node { int data; struct Node *next; }; // 开始冒泡排序 void bubbleSort(struct Node *start) { int swapped, i; struct Node *ptr1; struct Node *lptr = NULL; // 遍历链表节点直到链表的最后一个节点 do { swapped = 0; ptr1 = start; // 按顺序比较相邻的两个节点值 while (ptr1->next != lptr) { if (ptr1->data > ptr1->next->data) { int temp = ptr1->data; ptr1->data = ptr1->next->data; ptr1->next->data = temp; swapped = 1; } ptr1 = ptr1->next; } lptr = ptr1; } while (swapped); } // 在链表的最后一个节点后面添加新节点 void push(struct Node **head_ref, int new_data) { struct Node *new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = NULL; struct Node *last = *head_ref; if (*head_ref == NULL) { *head_ref = new_node; return; } while (last->next != NULL) last = last->next; last->next = new_node; return; } // 打印链表中的所有元素 void printList(struct Node *node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } } // 主函数 int main() { struct Node *start = NULL; push(&start, 5); push(&start, 20); push(&start, 4); push(&start, 3); push(&start, 30); printf("链表排序前的元素: \n"); printList(start); bubbleSort(start); printf("\n链表排序后的元素: \n"); printList(start); return 0; } ``` 对于以上代码,我们先定义了一个链表节点结构体,包括一个数据成员和一个指向下一个节点的指针成员。然后编写了冒泡排序和其他帮助函数。在主函数中,我们通过调用 `push()` 函数向链表中添加元素,并在调用 `bubbleSort()` 函数时对链表进行排序。最后再使用 `printList()` 函数打印链表中的所有元素。 希望这个示例代码能够帮助你学习如何使用 C 语言进行链表冒泡排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是乐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值