以下是我對鍊錶一些簡單知識點的總結,包括鍊錶的建立,遍歷以及刪除,清除等。
一,建立鍊錶
鍊錶同一維陣列類似,用於存放線性表,並且便於邊讀入,邊輸出,即鍊錶的長度可不必預先設定;因此鍊錶在增添,刪除資料方面要簡便於陣列,但同時,鍊錶難以實現類似於陣列一樣通過下標直接訪問對應內容,常需遍歷。
首先,鍊錶的建立依賴於資料結構即構造一種新的結構(由儲存內容與指向下一結構的指標構成),在我看來指向下乙個結構的指標正是構成連表的「鏈」。
typedef struct _nodenode;
注意!!此處不能為
typedef struct _nodenode;
在這裡構建鍊錶以輸入一系列數字,以-1為結束的標誌
構建鍊錶的函式如下
node *add(node *head , int number)//為保證能多次使用,返回一指標,返回不能為空
//attach
last->next = p;//
} else
return head;
}
主函式如下
int main()
}while ( number != -1);
return 0;
}
以上是較常用的鍊錶構建函式
方案二:
為防止將
head=add(head,number);
此步給head賦值遺漏,可以嘗試將head的位址傳入
int main()
}while ( number != -1);
return 0;
}node *add(node** phead , int number)
last->next = p;//attach
} else
return head;//此處有無返回不重要
}
此方法直接傳入head的位址,對其修改,可以省去再給head賦值的步驟
方案三:
構建新的資料結構
typeddef struct _listlist;
void add(list* list , int number)
last->next = p;//attach
} else
}int main()
}while ( number != -1);
return 0;
}
以上即有關鍊錶構建的內容,需注意,這裡並沒有解決malloc失敗的情況!!!
二,鍊錶的遍歷
此處以輸出鍊錶中所有資料為例進行遍歷
void print ( node* head)
}
三,搜尋到特定數字並刪除
搜尋到特定數字:
scanf("%d",&number1);
node *p;
int isfound = 0;
for ( p=head ; p ; p=p->next )
} if ( !isfound )
刪除找到的數字:
node* q,*p;
for ( q=null,p=head ; p ; q=p,p=p->next)
else
free(p);
break;
} }
四,清除鍊錶
for ( p=head ; p ; p=q )
五,關於加標指標tail
tail用於標註指標末尾,便於搜尋
typeddef struct _listlist;
void add(list* list , int number)
last->next = p;//attach
} else
list->tail->next = p;//find the tail ; tail->next = n ; n->next = 0;
}
以上即關於鍊錶的一些簡單內容,複雜的方面後續會有介紹。 關於鍊錶的一些題目
2.刪除遞增有序鍊錶中大於min,小於max的元素 3.逆置鍊錶 4.合併兩個鍊錶 4.合併n個鍊錶 分治法 測試 前乙個與後乙個比較,相同就刪除結點,並釋放記憶體。返回頂部 先找到兩個前驅,釋放中間結點,並且將鍊錶重新鏈起來。返回頂部 public listnode reverselist lis...
關於鍊錶的一些總結
1.在鍊錶頭部新增空頭以消除頭部特殊判斷比較常見,用於刪除和新增元素,啞結點的意思就是在head第乙個節點之前設立乙個節點。2.因為鍊錶的操作有限,所以很多時候我們可以把鍊錶中的元素儲存在陣列中,進行操作。3.鍊錶從前往後遍歷元素簡單,但是從後往前遍歷元素確實困難重重,所以我們可以使用棧來儲存資料,...
關於雙向鍊錶的一些分析
一 插入操作 insert 一 基本原理 雙鏈表就好像是手拉手站成一排的人,每個人的右手 next 拉著下乙個人,左手 prior 拉著前乙個人,每兩個人之間有兩支手互聯.插入操作實際是 向隊伍中增加人員,他需要拉上左右兩邊的人,即共三個人要發生關係,由於每兩個人之間有兩支手互聯,所以要發生4次操作...