簡體   English   中英

鏈接列表的插入和選擇

[英]Linked List Insertion & Selection

我定義鏈表的方式與常用方式相同,即包含數據部分和

自引用指針。 我的插入邏輯如下:

struct node
{
    int data; //or any type.
    struct node *nextPtr;
}*start = NULL;
//main
struct *newPtr = (struct node *)malloc(sizeof(struct node *));
scanf("%d", newPtr->data); //or cout
newPtr->nextPtr = NULL;
if(start == NULL)
    start = newPtr;
else
{
    while(tempPtr->nextPtr != NULL)
    {
        tempPtr = tempPtr->nextPtr;
    }
    tempPtr->nextPtr = newPtr;
}

i)這個邏輯正確嗎?

ii)a)當我在一個系統中插入兩個節點或在另一個系統中插入三個節點時,可能會出現運行時錯誤。 b)每次插入節點時,都以正確的順序插入節點。

該代碼是否導致運行時錯誤... ???

struct node *newPtr, **hnd;

newPtr = malloc(sizeof *newPtr);
if (!newPtr) barf();

scanf("%d", &newPtr->data);
newPtr->nextPtr = NULL;

for(hnd = &start; *hnd; hnd = &(*hnd)->next) {;}

*hnd = newPtr;

忽略答案,因為它是c ++,原始問題被標記為c ++

一旦解決了小問題(節點的實際分配,設置值,臨時指針的定義以幫助遍歷列表),原始代碼就應該起作用。 但是,您還可以采用其他方法來簡化代碼(嗯,不是很復雜),這基本上意味着在創建之前先創建插入點,然后再創建新元素:

Node** insertPoint = &start;
while (*insertionPoint) 
   insertionPoint = &((*insertionPoint)->next);
*insertionPoint = new Node(value);

使用指針來遍歷列表,並使用頭指針的地址初始化指針,直到將其指向要附加新元素的Node* (注意,已附加,未插入)為止。 然后在該位置創建新節點。 假定Node構造函數負責復制值並初始化next指針。

或者,您可以遞歸地編寫此代碼,並讓編譯器為您執行尾部優化(它可能更容易閱讀,有些人發現遞歸更簡單,有些則不然):

void append( Node*& tail, Value value ) {
   if ( tail==NULL )
      list = new Node(value);
   else
      append( list->next, value );
}

調用代碼:

append( start, 100 ); // assuming nits contained in the list

在這種情況下,我們可以使用對指針的引用來代替雙指針,因為我們不需要修改它

struct node
{
    int data; //or any type.
    struct node *nextPtr;
}*start = NULL;
//main
struct *newPtr = (struct node *)malloc(sizeof(struct node));// You dont need * here

scanf("%d", newPtr->data); //or cout
newPtr->nextPtr = NULL;

if(start == NULL)
    start = newPtr;
else
{ 
    tempPtr = start; // you missed this.
    while(tempPtr->nextPtr != NULL)
    {
        tempPtr = tempPtr->nextPtr;
    }
    tempPtr->nextPtr = newPtr;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM