C語言學習 18-10-26
阿新 • • 發佈:2018-12-06
1.在連結串列任意位置插入節點
(1) 節點的內容包括 id、name、telphone number以及p_next,可編寫程式對任意 id 位置之前進行插入;
(2) 實現步驟:
1.) (頭插入)判斷是否 head 的 id 即為所要插入的位置,若是,則先將 node 的 p_next 指向 head 所指向的位置,再將 head 指向 node;
2.) (中間插入)若 id 不是頭位置,則找出 id 所在位置的前一個位置,因為要先將 id 所在的節點連線到 node 上,再將 id 的前一個連線到 node之前
3.) (尾插入)若 id 位置為尾節點所在的位置或並沒有要插入的 id,則將新節點插入到連結串列末尾。
#include<stdio.h>
#include<stdlib.h>
typedef struct NAMENOTE
{
int id;
char *name;
char *tel_num;
struct NAMENOTE *p_next;
}NameNote;
NameNote *CreatNode(int id, char *name, char *tel_num);
void AppendNode(NameNote **pp_head, NameNote **pp_end, NameNote *node);
void InsertNode(NameNote * *pp_head, NameNote **pp_end, NameNote *node, int id);
int main()
{
NameNote *p_head = NULL;
NameNote *p_end = NULL;
AppendNode(&p_head, &p_end, CreatNode(1, "c", "111"));
AppendNode(&p_head, &p_end, CreatNode(2, "python", "222"));
AppendNode(&p_head, &p_end, CreatNode(3 , "java", "333"));
return 0;
}
NameNote *CreatNode(int id, char *name, char *tel_num)
{
NameNote *node = (NameNote*)malloc(sizeof(NameNote));
node->id = id;
node->name = name;
node->tel_num = tel_num;
node->p_next = NULL;
return node;
}
void AppendNode(NameNote **pp_head, NameNote **pp_end, NameNote *node)
{
if(*pp_head == NULL)
{
*pp_head = node;
*pp_end = node;
}
else
{
(*pp_end)->p_next = node;
}
return;
}
void InsertNode(NameNote **pp_head, NameNote **pp_end, NameNote *node, int id)
{
NameNote *p_flag = *pp_head;
//頭插入
if(p_flag->id == id)
{
node->p_next = *pp_head;
*pp_head = node;
return;
}
//中間插入
while(p_flag->p_next != NULL)
{
p_flag = p_flag->p_next;
if(p_flag->p_next->id == id)
{
node->p_next = p_flag->p_next;
p_flag->p_next = node;
}
}
//尾插入
(*pp_end)->p_next = node;
*pp_end = node;
return;
}
2.刪除某個節點
(1) 對於連結串列的刪除,我們給定某個想刪除的節點的 id,通過 id 查詢到要刪除的位置;
(2) 實現步驟:
1.) 首先判斷要刪除的 id 是否是頭節點的 id,若是,則將 head 指向 head 的下一個位置,並free掉被刪除的節點;
2.) 若不是頭節點,則尋找要刪除的 id 的位置,這裡需要兩個指標來進行標註,一個用來標記刪除的節點的位置 p_del,另一個用來標註 p_del 的前一個位置 p_flag,因為需要 p_flag 來連結 p_del 的下一個節點;
3.) 若要刪除的 id 是尾節點的 id,則改變 end 指向的位置(更新尾節點)。
void DeleteNode(NameNote **pp_head, NameNote **pp_end, int id)
{
NameNote *p_del = *pp_head; //標註要刪除的節點的位置
NameNote *p_flag = NULL; //標註要刪除的節點的前一個位置
//若刪除的節點為頭節點
if(p_del->id == id)
{
*pp_head = p_del->p_next;
free(p_del);
p_del = NULL;
return;
}
//若刪除中間的節點
while(p_del->p_next != NULL)
{
p_flag = p_del;
p_del = p_del->p_next;
if(p_del->id == id)
{
p_flag->p_next = p_del->p_next;
free(p_del);
p_del = NULL;
if(p_flag->p_next == NULL)
*pp_end = p_flag;
return;
}
}
return;
}