cjozGV 的學(xué)生作業(yè):
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef int datatype_t;
typedef struct linknode{
datatype_t data; //數(shù)據(jù)域
struct linknode *next; //節(jié)點域
}linknode_t;
//1.創(chuàng)建一個新鏈表,為頭節(jié)點在棧區(qū)創(chuàng)建空間
linknode_t *create_empty_linklist(){
//1.為頭節(jié)點在堆區(qū)分配空間,用指針head保存
linknode_t *head = NULL;
head = (linknode_t*)malloc(sizeof(linknode_t));
//2.頭節(jié)點的指針域為NULL
if (NULL == head){
printf("malloc is fail!\n");
return NULL;
}
memset(head,0, sizeof(linknode_t));
return head;
}
//2.按從小到大的順序插入數(shù)據(jù)
void insert_order_linklist(linknode_t *head,datatype_t data){
//1.創(chuàng)建新節(jié)點
linknode_t *new_node = NULL;
new_node = (linknode_t*)malloc(sizeof(linknode_t));
new_node->data = data; //1.設(shè)置新節(jié)點的數(shù)據(jù)
//2.找到插入的位置
linknode_t *p = head; //從鏈表的頭開始
while (p->next != NULL && p->next->data > data){
p = p->next; //向后移動指針,直到找到合適的插入位置
}
//3.插入新節(jié)點
new_node->next = p->next; //新節(jié)點指向p的下一個節(jié)點
p->next = new_node; //p指向新節(jié)點
}
// 打印鏈表中的數(shù)據(jù)(從大到?。?void printf_data_linklist(linknode_t *head) {
linknode_t *p = head->next; // 跳過頭節(jié)點
printf("Linked List: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//刪除鏈表中所有值為target的節(jié)點
void delete_all_target_nodes(linknode_t *head,datatype_t target){
linknode_t *p = head; //p指向當(dāng)前節(jié)點的前一個節(jié)點
while (p->next != NULL){
if (p->next->data == target){
// 找到目標(biāo)點刪除它
linknode_t *temp = p->next; //暫存目標(biāo)節(jié)點
p->next = temp->next; //前驅(qū)節(jié)點跳過目標(biāo)節(jié)點
free(temp);
} else {
p = p->next; //繼續(xù)遍歷
}
}
}
//4.釋放鏈表占用的內(nèi)存
void free_linklist(linknode_t *head) {
linknode_t *p = head; // 從頭節(jié)點開始釋放
while (p != NULL) {
linknode_t *temp = p; // 暫存當(dāng)前節(jié)點
p = p->next; // 移動到下一個節(jié)點
free(temp); // 釋放當(dāng)前節(jié)點
}
}
int main(){
//1.創(chuàng)建空鏈表
linknode_t *head = create_empty_linklist();
//2.準(zhǔn)備要插入的數(shù)據(jù)
datatype_t data[] = {1, 5, 3, 7, 9, 5, 8, 5, 3};
int n = sizeof(data) / sizeof(data[0]);
//3.有序插入數(shù)據(jù)
for (int i = 0; i < n; i++) {
insert_order_linklist(head,data[i]);
}
//4.打印鏈表
printf_data_linklist(head);
//5.刪除所有值為3的節(jié)點
delete_all_target_nodes(head,3);
//6.再次打印
printf_data_linklist(head);
//7.釋放鏈表內(nèi)存
free_linklist(head);
return 0;
}