日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言的单链表分割

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言的单链表分割 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

已知鏈表頭指針head與數值x,將所有小于x的節點放在大于或等于x 的節點前,且保持這些節點的原來的相對位置。

這個過程有點類似于快速排序,尋找一個閾值,比該閾值小的放左邊,比該閾值大的放右邊。只是由數組遍歷變為來鏈表遍歷,操作變成了指針的指向。

具體步驟如下:

  1. 創建一個less_ptr,負責對less端的鏈表進行維護
  2. 創建一個more_ptr,負責對more端的鏈表進行維護
  3. 最終進行less的尾和more的頭進行合并,返回頭節點。

這個過程需要注意保存less端和more端的頭節點,算法實現如下

Data *part_list(Data *head, int n) {Data less_head;Data more_head;less_head.data = 0;less_head.next = NULL;more_head.data = 0;more_head.next = NULL;Data *less_ptr = &less_head;Data *more_ptr = &more_head;/*遍歷鏈表,將大于n的放在右端,小于等于n的放在左端*/while(head) {if(head->data > n){more_ptr->next = head;more_ptr = head;} else {less_ptr->next = head;less_ptr = head;}head = head->next;}/*連接小端的尾和大端的頭,并將大端的尾置空*/less_ptr->next = more_head.next;more_ptr->next = NULL;/*返回小端的頭,因為此時它是鏈表的表頭*/return less_head.next;
}

源代碼測試如下:

#include <stdio.h>
#include <stdlib.h>typedef struct Link_list
{/* data */int data;struct Link_list *next;
}Data;/*打印鏈表*/
void print_list(Data *head) {while (head) {printf("%d ",head->data);head = head -> next;}printf("\n");
}/*尾插法創建鏈表*/
Data *insert_tail(Data *head, int n) {head = (Data *)malloc(sizeof(Data));head->next = NULL;Data *r = head;int b;while(n--){scanf("%d",&b);Data *p = (Data *)malloc(sizeof(Data));p->data = b;r->next = p;p->next = NULL;r = p;}return head;
}/*分割鏈表*/
Data *part_list(Data *head, int n) {Data less_head;Data more_head;less_head.data = 0;less_head.next = NULL;more_head.data = 0;more_head.next = NULL;Data *less_ptr = &less_head;Data *more_ptr = &more_head;while(head) {if(head->data > n){more_ptr->next = head;more_ptr = head;} else {less_ptr->next = head;less_ptr = head;}head = head->next;}less_ptr->next = more_head.next;more_ptr->next = NULL;return less_head.next;
}int main(){Data *head;int i ,b ;printf("construct link list :\n");head = insert_tail(head,5);Data *test = head -> next;print_list(test);printf("after part list :\n");/*設置3為閾值,大于3的都放在右端,小于等于3的都放在左端*/Data *part = part_list(head->next,3);print_list(part);return 0;
}

輸出如下:

construct link list :
5 4 3 2 1
5 4 3 2 1 
after part list :
3 2 1 5 4 

總結

以上是生活随笔為你收集整理的C语言的单链表分割的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。