單向鍊錶:
鍊錶結點通常包含資料域與指標域,資料域用來儲存相關的使用者的資料,指標域用來指向下乙個結點。訪問單向鍊錶,需要從頭部(head)開始單向順序訪問,訪問終結於指標域(next)為null的結點;其儲存方式不同於以往的陣列,按照非連續位址方式儲存。
優點:鍊錶長度可以實現動態增長,不必像陣列一樣在建立時確定大小。
採取動態記憶體分配,不會造成記憶體浪費。
鍊錶內部結點的插入與刪除方便,只需修改相應的next指標。
在刪除結點時,只需修改前一結點的指標,並釋放本結點,不需要大量移動後面的元素。
實現:結構體:
//結點結構體
#define elemtype int
typedef struct nodenode;
鍊錶初始化:
//初始化頭結點
//return:返回頭結點指標
node *create_list()
head->next = null;
head->value = 0;
return head;
}
增加結點
//尾部增加結點
//@num:增加節點數量
//@head:頭結點的位址
void add_node(int num,node **head)
node *p,*q;//p指向新結點 q指向鍊錶尾部
q = *head;
while(q->next != null)//遍歷鍊錶至尾部,在尾部插入新結點
q = q->next;
while(num--)
p->next = null;
printf("input value:");
scanf("%d",&p->value);
q->next = p;//將新結點連線至鍊錶尾部
q = p;//讓q重新指向鍊錶尾部
}}
遍歷列印
//遍歷列印鍊錶
//@head:頭結點
void print_list(node *head)
node *p = head;
while(p->next)//當p的指標域為null時,此結點為尾結點
}
刪除第n個結點
//刪除第num個結點
//@num:被刪除的結點
//@head:頭結點
void delete_node(int num,node **head)
node *q,*p = *head;
//迴圈中斷條件
//當num == 0終止時,找到結點
//當p->next == null 終止時,鍊錶長度小於或等於num
while(num-- && p->next != null)
q = p;
p = p->next;
}//迴圈正常結束後,執行到此處時,代表找到num結點。
q->next = p->next;
free(p);
p = null;
}
插入結點
//在num處後插入新結點
//@num:搜尋的結點
//@value:新結點的值
//@head:頭結點
void insert_node(int num,int value,node **head)
node *q,*p = *head;
//迴圈中斷條件
//當num == 0終止時,找到結點
//當p->next == null 終止時,鍊錶長度小於或等於num
while(num-- && p->next != null)
p = p->next;
}q = (node *)malloc(sizeof(node));
q->value = value;
q->next = p->next;
p->next = q;
}
銷毀鍊錶
//銷毀鍊錶
//@head:頭結點的指標
void destroy_list(node **head)
node *q =
*head;
node *p =
*head;
//遍歷刪除頭結點以外的結點
while(p->next)
free(p);//刪除頭結點
p =null;
q =null;
*head =
null;
}
c語言 資料結構 單鏈表
將線性表l a0,a1,an 1 中各元素分布在儲存器的不同儲存塊,稱為結點,通過位址或指標建立它們之間的聯絡,所得到的儲存結構為鍊錶結構,表中 ai的結點形式如圖表示 其中結點的data 域存放資料元素 ai,而 next 域是乙個指標,指向 ai的直接後繼 ai 1 所在的結點。單鏈表結構如下 ...
C語言資料結構 單鏈表
單鏈表在資料結構裡十分常見,是一種常見的線性表,下面介紹其性質並用 實現相關功能 單鏈表以鏈結方式儲存資料 1 鍊錶的具體儲存表示為 用一組任意的儲存單元來存放線性表的結點 這組儲存單元既可以是連續的,也可以是不連續的 鍊錶中結點的邏輯次序和物理次序不一定相同。為了能正確表示結點間的邏輯關係,在儲存...
C語言資料結構(單鏈表)
單鏈表的整表建立 對於順序儲存結構的線性表的整表建立,我們可以用陣列的初始化來直觀理解。而單鏈表和順序儲存結構就不一樣了,它不像順序儲存結構這麼集中,他的資料可以是分散在記憶體各個角落的,他的增長也是動態的。對於每個單鏈表來說,他所占用空間的大小和位置是不需要預先分配劃定的,可以根據系統的情況和實際...