0
在main
函數中,我用n
= 50和next
= NULL
構成一個節點。當我將add
添加到鏈表時,儘管它已被添加,但它在遍歷時不會顯示。發生這種情況的原因是因爲當調用add函數時,指向具有50的節點的start
指針未更新爲指向具有10的新節點。 (第28行到第34行)。在c中鏈接列表遍歷
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int n;
struct node* next;
} node;
void traverse(node* start)
{
while(true)
{
printf("%i\n",start->n);
start = start->next;
if(start == NULL)
{
break;
}
}
}
void add(int num, node* start)
{
node* previous = NULL;
node* current = start;
if(num<current->n)
{
//------------------------------------------------------------------------------
//The problem is inside this if block.
node* tmp = malloc(sizeof(node));
tmp->next = current;
current = tmp;
//-------------------------------------------------------------------------------
}
else
{
while(true)
{
previous = current;
current = current->next;
if(current == NULL)
{
node *tmp = malloc(sizeof(node));
tmp->n = num;
tmp->next = NULL;
previous->next = tmp;
break;
}
else
{
if(current->n > num)
{
node *tmp = malloc(sizeof(node));
tmp->n = num;
tmp->next = current;
previous->next = tmp;
break;
}
}
}
}
}
int main(void)
{
node* start = malloc(sizeof(node));
start->n = 50;
start->next = NULL;
add(10,start);
traverse(start);
}
我該如何解決這個問題?
你的函數應該能夠正確地管理一個* empty *列表(即空頭指針)。在'main()'中加載一個導入哨兵noad'start'的柺杖最好是脆弱的,結果函數依賴於它(例如:如果傳遞NULL指針,'traverse'將調用UB)。而你的'add()'比它需要的時間長大約85%。 – WhozCraig
@WhozCraig在add()中我需要'current'和'previous'嗎?我怎樣才能縮短'add()'? –
沒有。你可以用一個臨時指針和一個指向指針(你將作爲參數傳遞)來做到這一點。 [**現場直播**](http://ideone.com/OwzYFk) – WhozCraig