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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)

發布時間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單循環鏈表是C語言中比較常見的一種鏈式儲存結構。
相較于普通的單鏈表,其特點就在于單循環鏈表的尾指針指向的是頭結點。
即:
1.單鏈表

2.

單循環鏈表的有點就在于方便訪問第一個結點,還方便訪問最后一個結點。
那么,話不多說,先建立一個單循環鏈表:
(先給出相關的定義:PNode 、LinkList 分別表示結點和鏈表,DataType即int,結構體Node含有兩個成員:data和next指針)

typedef int DataType; typedef struct Node* PNode; typedef struct Node* LinkList; struct Node {DataType data;struct Node* next; };

接下來就是建立單循環鏈表的函數:
ps:這樣建立的單鏈表,會有一個空的頭節點(head)。

LinkList CreateList_Tail_loop() {LinkList head = (LinkList)malloc(sizeof(struct Node));PNode cur = NULL;PNode tail = head;DataType data;printf("please input some Numbers:\n");scanf_s("%d", &data);while (data != -1){cur = (struct Node*)malloc(sizeof(struct Node));cur->data = data;tail->next = cur;tail = cur;scanf_s("%d", &data);}tail->next = head;//尾指針指向頭結點return tail; }

鏈表建立好了之后,就可以開始進行移動了~

ps: tail為已經建立好的鏈表
temp用來記錄頭結點
pre為p的前驅結點,p為用于判斷的結點。

PNode Move_Odd_Even(LinkList tail) {PNode last = NULL, p = NULL, pre = NULL, temp = NULL;int flag = 1;last = tail;temp = tail->next;pre = tail->next;p = (tail->next)->next;tail->next = NULL;while (flag){if (p == tail){break;}if ((p->data) % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;p = pre->next;}else{pre = p; //記錄p的前驅p = p->next;}}if (tail->data % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;}last->next = temp;tail = last;return tail; }

來看全部代碼與運行結果:

//實現對單循環鏈表中奇數和偶數結點的移動 #include<stdio.h> #include<stdlib.h> #include <cstddef>typedef int DataType; typedef struct Node* PNode; typedef struct Node* LinkList; struct Node {DataType data;struct Node* next; }; PNode Move_Odd_Even(LinkList tail);LinkList CreateList_Tail_loop() {LinkList head = (LinkList)malloc(sizeof(struct Node));PNode cur = NULL;PNode tail = head;DataType data;printf("please input some nums:\n");scanf_s("%d", &data);while (data != -1){cur = (struct Node*)malloc(sizeof(struct Node));cur->data = data;tail->next = cur;tail = cur;scanf_s("%d", &data);}tail->next = head;return tail; }void print(LinkList tail) {PNode head = tail->next;PNode p = head->next;while (p != head){printf("%d ", p->data);p = p->next;} }void DestoryList_Link(LinkList tail) {PNode pre = tail->next;PNode p = pre->next;while (p != tail){free(pre);pre = p;p = pre->next;}free(pre);free(tail); }int main() {LinkList tail = NULL;LinkList p = NULL;tail = CreateList_Tail_loop();p = Move_Odd_Even(tail);print(p);DestoryList_Link(tail);return 0; }PNode Move_Odd_Even(LinkList tail) {PNode last = NULL, p = NULL, pre = NULL, temp = NULL;int flag = 1;last = tail;temp = tail->next;pre = tail->next;p = (tail->next)->next;tail->next = NULL;//第一個結點的data為奇數時while (flag){if (p == tail){break;}if ((p->data) % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;p = pre->next;}else{pre = p; //記錄p的前驅p = p->next;}}if (tail->data % 2 == 0){pre->next = p->next;p->next = NULL;last->next = p;last = p;}last->next = temp;tail = last;return tail; }

運行結果:

剛寫的單循環鏈表時候還是遇到了蠻多的坑,吃了一些 有無空頭節點 的苦。若是題目要求寫一個函數實現鏈表操作的某一個功能時,一定要注意題中提供的鏈表有無頭結點!

可以將tail以及其后面幾個結點的值打印出來,這樣就可以知道鏈表的模樣了。

第一次寫博客,若是有哪些寫錯的地方,歡迎大家在評論區留言指正~

總結

以上是生活随笔為你收集整理的C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)的全部內容,希望文章能夠幫你解決所遇到的問題。

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