1. 程式人生 > >C語言學習 18-10-26

C語言學習 18-10-26

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;
}