C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)
生活随笔
收集整理的這篇文章主要介紹了
C语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單循環鏈表是C語言中比較常見的一種鏈式儲存結構。
相較于普通的單鏈表,其特點就在于單循環鏈表的尾指針指向的是頭結點。
即:
1.單鏈表
2.
單循環鏈表的有點就在于方便訪問第一個結點,還方便訪問最后一個結點。
那么,話不多說,先建立一個單循環鏈表:
(先給出相關的定義:PNode 、LinkList 分別表示結點和鏈表,DataType即int,結構體Node含有兩個成員:data和next指針)
接下來就是建立單循環鏈表的函數:
ps:這樣建立的單鏈表,會有一個空的頭節點(head)。
鏈表建立好了之后,就可以開始進行移動了~
ps: tail為已經建立好的鏈表
temp用來記錄頭結點
pre為p的前驅結點,p為用于判斷的結點。
來看全部代碼與運行結果:
//實現對單循環鏈表中奇數和偶數結點的移動 #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语言-实现对单循环链表中奇数和偶数结点的移动(前面奇数结点后面偶数结点)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Markdown整理备忘(一)-- 符号
- 下一篇: 电商新趋势来临!?解析Dtop 环球嘉年