1. 程式人生 > >快速定位到單鏈表的中間位置的節點

快速定位到單鏈表的中間位置的節點

#include <stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *Next;
}Node,*LinkedList;
/*
下面的程式為尾差法建立單鏈表
*/
void tailCreat(LinkedList &L,int i)
{
int j;
LinkedList p1,p2;
L = (LinkedList)malloc(sizeof(Node));
p1=L;

for(j=1;j<=i;j++)
{
p2=(LinkedList)malloc(sizeof(Node));
p2->data=j;
p1->Next=p2;
p1=p2;
}
p1->Next=NULL;
}
/*
刪除單鏈表
*/
void remove(LinkedList &L)
{
LinkedList p,q;//p為當前要刪除的節點,如果他被刪除之後。我們還要刪除他的下一個節點。由於此時p已經不在,所以此時,
//就需要我們用q記錄p的下一個節點。
p=L->Next;
while(p)
{
q=p->Next;
free(p);
p=q;
}
L->Next=NULL;
}
/*
快速定位到單鏈表的中間節點
定義了一個快指標search和一個慢指標middle。快的每次走兩步,慢的每次走一步。當快的走到終點的時候,慢的剛好走到中間。
*/
int middle(LinkedList L,int *e)
{
LinkedList search,middle;
search=middle=L;
while(search->Next!=NULL)
{
if(search->Next->Next!=NULL)
{
search=search->Next->Next;
middle=middle->Next;
}
else
{
search=search->Next;
}
}
*e=middle->Next->data;
return 1;
}
int main()
{
int e;
LinkedList L,p;
tailCreat(L,9);
printf("%d\n",L->Next->data);
p=L->Next;

while(p!=NULL)//檢視連結串列裡面的全部元素
{
printf("%d",p->data);
p=p->Next;
}
printf("\n");
middle(L,&e);
printf("%d\n",e);
//remove(L);
//printf("%d\n",L->Next->data);//此時程式則無法執行,因為L-Next為空,
return 1;
}