1. 程式人生 > >數據結構-尋找單鏈表的中間元素

數據結構-尋找單鏈表的中間元素

使用 中間 -1 stream rect eap play search please

1:這裏使用一個只用一遍掃描的方法。描述如下:

假設mid指向當前已經掃描的子鏈表的中間元素,cur指向當前已掃描鏈表的末節點,那麽繼續掃描即移動cur到cur->next,這時只需判斷一下應不應該移動mid到mid->next就行了。所以一遍掃描就能找到中間位置。代碼如下:

技術分享
// ConsoleApplication15.cpp : 定義控制臺應用程序的入口點。
//

#include "stdafx.h"
#include <malloc.h>
#include <iostream>
using namespace std;

typedef struct
node//定義鏈表結構體 { int data;//節點內容 node *next;//指向結構體的指針,下一個節點 }node; node *create()//創建單鏈表 { int i = 0;//鏈表中數據的個數 node *head, *p, *q;//這些的本質是節點的地址 int x = 0; head = NULL; q = NULL;//初始化q,q代表末節點 p = NULL; while (1) { printf("please input the data:"); scanf_s("%d
", &x); if (x == 0) break;//data為0時創建結束 p = (node *)malloc(sizeof(node));//用於每次輸入鏈表的數據 p->data = x; if (++i == 1)//鏈表頭的指針指向下一個節點 { head = p; q = p; } else { q->next = p;//連接到鏈表尾端 q = p; } q
->next = NULL;/*尾結點的後繼指針為NULL(空)*/ } return head; } int length(node *head) { int len = 0; node *p; p = head->next; while (p != NULL) { len++; p = p->next; } return len; } void print(node *head) { node *p; p = head; while (p)/*直到結點q為NULL結束循環*/ { printf("%d ", p->data);/*輸出結點中的值*/ p = p->next;/*指向下一個結點*/ } } node *search_node(node *head, int pos)//查找單鏈表pos位置的節點,返回節點的指針。pos從0開始,0返回head節點 { node *p = head->next; if (pos < 0)//pos位置不正確 { printf("incorrect position to search node!");//pose位置不正確 return NULL; } if (pos == 0) { return head; } if (pos == NULL) { printf("Link is empty!");//鏈表為空 return NULL; } while (--pos) { if ((p = p->next) == NULL) { printf("incorrect position to search node!");//超出鏈表返回 break; } } return p; } node *insert_node(node *head, int pos, int data)//單鏈表的插入 { node *item = NULL; node *p; item = (node *)malloc(sizeof(node)); item->data = data; if (pos == 0)//插在head後面 { head->next = item;//head後面是item return head; } p = search_node(head, pos);//獲得pos的節點指針 if (p != NULL) { item->next = p->next;//item指向原pos節點的後一個節點 p->next = item;//把item插入到pos的後面 } return head; } node *delete_node(node *head, int pos)//刪除節點 { node *item = NULL; node *p = head->next; if (p = NULL) { printf("link is empty!"); return NULL; } p = search_node(head, pos - 1);//獲得位置pos節點的指針 if (p != NULL&&p->next != NULL) { item = p->next; p->next = item->next; delete item; } return head; } node *reverse(node *head)//鏈表的逆置 { node *next; node *prev = NULL; while (head != NULL) { next = head->next; head->next = prev; prev = head; head = next; } return prev; } node *search(node *head) { int i = 0; int j = 0; node *current = NULL; node *middle = NULL; current = middle = head->next; while (current != NULL) { if (i / 2 > j) { j++; middle = middle->next; } i++; current = current->next; } return middle; } int main() { node *head = create();//創建單鏈表 print(head);//輸出鏈表 node *mid; mid = search(head); cout << "中間的元素是:"<<mid ->data << endl; return 0; }
View Code

運行結果:

技術分享

數據結構-尋找單鏈表的中間元素