单链表直接插入排序

单链表直接插入排序 王道P50

void sort(LinkList &L){
	LinkList *p,*pre,*q;
	p = L->next->next;		// 先保存下L的第二个元素,因为下一步要将L变成只有一个元素的有序表。  
	L->next->next = NULL;	// 将L变成只有一个元素的有序表
	// 从L的第二个元素开始遍历整个L直至表尾 
	while(p != NULL){
		q = p->next;
		pre = L;	//待插入结点的前驱,每次都从从表头开始寻找插入位置
		while(pre->next !=NULL && pre->next->data < p->data) // 遍历pre所指向的有序表L,直至找到比p大的节点 
			pre = pre->next; 
		p->next = pre->next;
		pre->next = p;
		p = q;	
	} 
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是单链表直接插入排序的C语言实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node *next; } Node; // 定义链表结构体 typedef struct List { Node *head; int length; } List; // 初始化链表 void initList(List *list) { list->head = NULL; list->length = 0; } // 在链表尾部插入节点 void append(List *list, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; if (list->head == NULL) { list->head = newNode; } else { Node *p = list->head; while (p->next != NULL) { p = p->next; } p->next = newNode; } list->length++; } // 打印链表 void printList(List *list) { Node *p = list->head; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 单链表直接插入排序 void insertSort(List *list) { if (list->head == NULL || list->head->next == NULL) { return; } Node *p = list->head->next; list->head->next = NULL; while (p != NULL) { Node *q = list->head; Node *pre = NULL; while (q != NULL && q->data < p->data) { pre = q; q = q->next; } if (pre == NULL) { list->head = p; } else { pre->next = p; } Node *tmp = p->next; p->next = q; p = tmp; } } int main() { List list; initList(&list); // 在链表尾部插入节点 append(&list, 3); append(&list, 1); append(&list, 4); append(&list, 2); append(&list, 5); printf("排序前:"); printList(&list); // 单链表直接插入排序 insertSort(&list); printf("排序后:"); printList(&list); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值