單鏈表的增刪查改代碼:
1.創建結構體
// 結構體類型的創建
struct node
{int data; // 數據域struct node *next; // 指針域
};
2.創建節點,節點的存儲在malloc申請的空間內,也就是堆空間。
// 創建節點
struct node *create_node(int data)
{struct node *xnew = malloc(sizeof(struct node));if (xnew == NULL){perror("創建失敗\n");}xnew->data = data;xnew->next = xnew;return xnew; // 返回xnew的地址
}
3.頭插入節點,先讓節點指向頭,在讓頭節點指向新節點
// 頭插入節點
void top(struct node *head, struct node *xnew)
{xnew->next = head->next;head->next = xnew;
}
4.尾插法,定義一個游走的節點,讓該節點偏移到單鏈表的最后一個節點,再讓該游走節點指向新節點,并且使新的節點指向頭節點,實現單鏈表循環
// 尾插法
void wei(struct node *head, struct node *xnew)
{struct node *pos = head->next;// 讓節點走起來 不斷地走到下一位while (pos->next != head){pos = pos->next;}pos->next = xnew;xnew->next = head;
}
5.顯示節點數據函數,同樣定義一個游走的節點,先讓其指向頭節點的下一位,再讓其走過單鏈表的每個一個節點,并答應出來
// 顯示節點
void show_node(struct node *head)
{struct node *pos = head->next;while (pos != head){printf("%d ", pos->data);pos = pos->next;}printf("\n");
}
6.刪除節點,我們同意定義一個游走的節點指針,讓該節點走過單鏈表并逐一判斷是否是我們要刪除的節點,如果是則退出來,并用一個新的節點指針p來指向該地址,在設計游走節點的時候使用pos->next-data,這樣可以讓節點始終停留在節點p的上一位,并讓該指針pos指向節點p的下一位,然后讓節點p指向NULL,并釋放堆內存
// 刪除節點
void delete_node(struct node *head, int data)
{struct node *pos = head->next;while (pos->next->data != data){pos = pos->next;}struct node *p = pos->next;pos->next = p->next;p->next = NULL;free(p);
}
7.修改節點,定義一個游走的節點指針,讓該節點游走單鏈表,如果找到了我們要的數據,那就賦值進行修改。
// 修改節點
void modify_node(struct node *head, int data, int new_data)
{struct node *pos = head->next;while(pos->data != data){pos = pos->next;}pos->data = new_data;}
完整代碼:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 結構體類型的創建
struct node
{int data; // 數據域struct node *next; // 指針域
};// 創建節點
struct node *create_node(int data)
{struct node *xnew = malloc(sizeof(struct node));if (xnew == NULL){perror("創建失敗\n");}xnew->data = data;xnew->next = xnew;return xnew; // 返回xnew的地址
}
// 頭插入節點
void top(struct node *head, struct node *xnew)
{xnew->next = head->next;head->next = xnew;
}
// 尾插法
void wei(struct node *head, struct node *xnew)
{struct node *pos = head->next;// 讓節點走起來 不斷地走到下一位while (pos->next != head){pos = pos->next;}pos->next = xnew;xnew->next = head;
}
// 顯示節點
void show_node(struct node *head)
{struct node *pos = head->next;while (pos != head){printf("%d ", pos->data);pos = pos->next;}printf("\n");
}
// 刪除節點
void delete_node(struct node *head, int data)
{struct node *pos = head->next;while (pos->next->data != data){pos = pos->next;}struct node *p = pos->next;pos->next = p->next;p->next = NULL;free(p);
}
// 修改節點
void modify_node(struct node *head, int data, int new_data)
{struct node *pos = head->next;while(pos->data != data){pos = pos->next;}pos->data = new_data;}
//主函數
int main()
{struct node *head = create_node(0);for (int i = 1; i < 10; i++){top(head, create_node(i));}show_node(head);delete_node(head, 3);show_node(head);modify_node(head,2,999);show_node(head);
}