[英]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.