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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

又见链表 --- 另一种Creat方式与反转

發布時間:2023/12/2 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 又见链表 --- 另一种Creat方式与反转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鏈表

作為一種數據結構,鏈表以其方便的增刪查改功能,實現了無數經典有用的程序。
在之前的帖子里,我構建鏈表的方式是建立一個不儲存數據的head節點,然后通過一邊輸入數據一邊建立結點的方式構建整個鏈表。
與之前不同的是,這里建立的是包含數據的頭結點head:

下面是代碼,包含創建部分,輸出部分,刪除部分,和插入部分。

struct Node {int data;Node *next; };int n = 0; // 結點數 //=============Node_Creat==============// Node *Node_Creat() {Node *head = NULL; // 頭指針置NULL Node *p1,*p2; // 開辟一個Node大小的空間 使p1和p2指向該空間 p1 = p2 = (Node *)malloc(sizeof(Node));if(p1 == NULL || p2 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data); while(p1 -> data >= 0){n++;if(head == NULL){head = p1;} else{p2 -> next = p1;}p2 = p1;p1 = (Node *)malloc(sizeof(Node));if(p1 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data);}p1 = NULL;p2 -> next = NULL;return head; }//============Node_Print==============// void Node_Print(Node *head) {Node *p = head;if(head == NULL) // 鏈表為空 {printf("Empty!\n");return ;}else{printf("Total: %d Node\n",n);while(p != NULL){printf("%d ",p -> data);p = p -> next; }printf("\n");} }//==============Node_Delete()===============// void Node_Delete(Node *head,int num) {Node *p1,*p2;p1 = head;if(p1 == NULL) // 鏈表為空{printf("Empty\n");return ;} if(num > n) // 結點不存在 {printf("Not Found!\n");return ;}n--; // 結點數-1 int i;for(i = 1; i < num; i++){if(p1 -> next == NULL)break;p2 = p1;p1 = p1 -> next;}if(p1 == head) // 頭節點 即第一個{head = p1 -> next;}else{p2 -> next = p1 -> next;free(p1);}Node_Print(head); }//============Node_Insert()============// void Node_Insert(Node* head,int num,int i_data) {Node * newNode;newNode = (Node *)malloc(sizeof(Node));if(newNode == NULL){printf("Overflow\n");exit(1);}newNode -> data = i_data;newNode -> next = NULL;Node *p1,*p2;p1 = head;for(int i = 1 ;i < num; i++){p2 = p1;p1 = p1 -> next;}p2 -> next = newNode;newNode -> next = p1;n++; // 結點數+1 Node_Print(head); }

樣例:

鏈表的反轉

我這里采用的方法是 改變兩個結點間next指針的指向,原結點next指針指向下一個結點,反轉后指向前一個結點。

Node* Node_Reverse(Node* head) {Node* pNow = head;//當前結點Node* pPrv = NULL;//當前結點的前一個結點Node* pReversedHead = NULL;//反轉鏈表頭結點Node* pNext = NULL;//當前結點的下一個結點while(pNow != NULL){pNext = pNow -> next;if(pNext == NULL)//如果當前結點的下一個結點為空,那么反轉鏈表的頭結點就是當前結點。pReversedHead = pNow;pNow -> next = pPrv;//當前結點指向前一個結點pPrv = pNow;//pPrv和pNow往前移動。pNow = pNext;//這里要使用前面保存下來的pNext,不能使用pNow->next}return pReversedHead;//返回反轉鏈表頭指針。 }

大概的一個流程圖(反轉第一個結點)

注:紅色箭頭代表pPrev,pNext和pNow的移動,藍色代表next指針的指向。

轉載于:https://www.cnblogs.com/qq952693358/p/5503244.html

總結

以上是生活随笔為你收集整理的又见链表 --- 另一种Creat方式与反转的全部內容,希望文章能夠幫你解決所遇到的問題。

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