面試題—資料結構之單連結串列詳述(基本篇)
單連結串列的結構是資料結構中最簡單的,它的每一個節點只有一個指向後一個節點的指標。
單連結串列節點的定義:
typedef struct node
{
int data; //節點內容
node *next; //下一個節點
}node;
單連結串列的建立://建立單連結串列
node *create()
{
int i=0; //連結串列中資料的個數
node *head, *p, *q;
int x = 0;
head = (node *)malloc(sizeof(node)); //建立頭節點
while(1)
{
printf("Please input the data: ");
scanf("%d", &x);
if(0 == x) //data為0時建立結束
{
break;
}
p = (node *)malloc(sizeof(node));
p->data = x;
if(++i == 1) //連結串列只有一個元素
{
head->next = p; //連線到head的後面
}
else
{
q->next = p; //連線到連結串列尾端
}
q = p; //q指向末節點
}
q->next = NULL; //連結串列的最後一個指標為NULL
return head;
}
上面的程式碼中,while迴圈每次從終端讀入一個整型資料,並呼叫malloc動態分配連結串列節點記憶體儲存這個整型資料,然後在插入到單連結串列的末尾;最後當資料為0時表示插入資料結束,此時把末尾節點的next指標置為NULL。單連結串列的測長:
//單連結串列的測長
int length(node *head)
{
int len = 0;
node *p = head->next;
while(NULL != p)
{
len++;
p = p->next;
}
return len;
}
單連結串列的列印://列印連結串列
void print(node *head)
{
int pos = 0;
node *p = NULL;
if(NULL == head->next)
{
printf("Link is empty!\n");
return ;
}
p = head->next;
while(NULL != p) //遍歷連結串列
{
printf("The %dth node is: %d\n", ++pos, p->data);
p = p->next;
}
}
單連結串列的查詢節點://單連結串列的節點查詢
//查詢pos位置的節點,返回節點指標
//pos從0開始,0返回head節點
node *search_node(node *head, int pos)
{
node *p = head->next;
if(pos < 0) //pos位置不正確
{
printf("incorrect position to search node!\n");
return NULL;
}
if(0 == pos)
{
return head;
}
if(NULL == p)
{
printf("Link is empty!\n"); //連結串列為空
return NULL;
}
while(--pos)
{
if((p = p->next) == NULL)
{
printf("incorrect position to search node!\n");
break; //超出連結串列返回
}
}
return p;
}
單連結串列的節點插入://單連結串列節點插入
//在單連結串列pos位置處插入節點,返回連結串列頭指標
//pos從0開始計算,0表示插入到head節點後面
node *insert_node(node *head, int pos, int data)
{
node *item = (node *)malloc(sizeof(node));
node *p = NULL;
item->data = data;
if(0 == pos) //插入連結串列頭後面
{
head->next = item; //head後面是item
return head;
}
p = search_node(head, pos); //獲得位置pos的節點指標
if(NULL != p)
{
item->next = p->next; //item指向原pos節點的後一個節點
p->next = item; //把item插入到pos的後面
}
return head;
}
單連結串列的節點刪除://單連結串列節點刪除
//刪除單連結串列的pos位置的節點,返回連結串列頭指標
//pos從1開始計算,1表示刪除head後的第一個節點
node *delete_node(node *head, int pos)
{
node *del;
node *p = head->next;
if(NULL == p) //連結串列為空
{
printf("Link is empty!\n");
return NULL;
}
p = search_node(head, pos-1); //獲得位置pos的節點指標
if(NULL != p && NULL != p->next)
{
del = p->next;
p->next = del->next;
delete del;
}
return head;
}
下面程式碼是上面各個函式的測試主程式:int main()
{
node *head = create(); //建立單連結串列
printf("Length: %d\n", length(head)); //測量單連結串列長度
head = insert_node(head, 2, 5); //在第2個節點之後插入5
printf("insert integer 5 after 2th node: \n");
print(head); //列印單連結串列
head = delete_node(head, 2); //刪除第2個節點
printf("delete the 2th node: \n");
print(head);
return 0;
}
下面是程式執行結果:Please input the data: 1
Please input the data: 2
Please input the data: 3
Please input the data: 4
Please input the data: 0
Length: 4
insert integer 5 after 2th node:
The 1th node is: 1
The 2th node is: 2
The 3th node is: 5
The 4th node is: 3
The 5th node is: 4
delete the 2th node:
The 1th node is: 1
The 2th node is: 5
The 3th node is: 3
The 4th node is: 4
Press any key to continue
相關文章
- 資料結構之單連結串列資料結構
- 實戰PHP資料結構基礎之單連結串列PHP資料結構
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- Redis基礎資料結構之連結串列Redis資料結構
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構之連結串列篇(單連結串列的常見操作)資料結構
- 資料結構之「連結串列」資料結構
- 資料結構之連結串列資料結構
- 畫江湖之資料結構【第一話:連結串列】單向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 單向連結串列資料結構
- 資料結構04——單連結串列資料結構
- 資料結構基礎 連結串列資料結構
- 資料結構之連結串列與陣列(2):單向連結串列上的簡單操作問題資料結構陣列
- 【資料結構之連結串列】詳細圖文教你花樣玩連結串列資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- 資料結構之連結串列【上】資料結構
- 資料結構之連結串列操作資料結構
- JAVA資料結構之連結串列Java資料結構
- 資料結構之php實現單向連結串列資料結構PHP
- 資料結構和演算法面試題系列—連結串列資料結構演算法面試題
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 資料結構之連結串列與陣列(3):單向連結串列上的簡單操作資料結構陣列
- 資料結構之迴圈連結串列資料結構
- 資料結構之雙向連結串列資料結構
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構連結串列筆試題資料結構筆試
- 資料結構之單連結串列的建立與刪除資料結構
- python 資料結構之單連結串列的實現Python資料結構
- 資料結構-連結串列資料結構
- 資料結構--連結串列資料結構
- 資料結構—連結串列資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- js實現資料結構--單連結串列JS資料結構
- 單連結串列的歸併(資料結構)資料結構