鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),它的節(jié)點不像數(shù)組一樣是連續(xù)的,而是通過指針鏈接在一起的。下面是鏈表的初始化、取值、查找、插入和刪除的示例代碼,均使用C語言實現(xiàn),并帶有標(biāo)頭。
鏈表初始化代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 初始化鏈表
ListNode* initList() {
ListNode *head = (ListNode*)malloc(sizeof(ListNode)); // 創(chuàng)建頭結(jié)點
head->next = NULL;
return head;
}
以上代碼中,定義了一個`ListNode`結(jié)構(gòu)體,其中`val`表示節(jié)點的值,`next`表示指向下一個節(jié)點的指針。在`initList`函數(shù)中,創(chuàng)建一個頭結(jié)點,并將其指針域設(shè)置為`NULL`。
鏈表取值代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 取出鏈表中第i個節(jié)點的值
int getVal(ListNode *head, int i) {
ListNode *p = head->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
printf("Error: Invalid index\n");
exit(1);
}
return p->val;
}
這段代碼定義了一個鏈表節(jié)點結(jié)構(gòu)體ListNode,包括節(jié)點的值val和指向下一個節(jié)點的指針next。另外,還定義了一個函數(shù)getVal,用于取出鏈表中第i個節(jié)點的值。
在函數(shù)中,首先定義了一個指向頭節(jié)點的指針p,并初始化為head->next,表示指向第一個節(jié)點。同時,定義一個整型變量j,用于記錄當(dāng)前遍歷到的節(jié)點位置。
接下來使用while循環(huán)遍歷鏈表,每次將p指向下一個節(jié)點,并將j加1。如果遍歷結(jié)束后p為空或者j>i,說明所尋找的節(jié)點不存在,此時輸出錯誤信息并退出程序。否則,返回p所指向節(jié)點的值val。
鏈表查找代碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 查找鏈表中第一個值為val的節(jié)點,并返回其指針
ListNode* findNode(ListNode *head, int val) {
ListNode *p = head->next;
while (p && p->val != val) {
p = p->next;
}
return p;
}
以上代碼中,定義了一個`ListNode`結(jié)構(gòu)體,其中`val`表示節(jié)點的值,`next`表示指向下一個節(jié)點的指針。在`findNode`函數(shù)中,使用循環(huán)遍歷
鏈表的插入
鏈表是一種常用的數(shù)據(jù)結(jié)構(gòu),由若干個節(jié)點組成,每個節(jié)點包括一個數(shù)據(jù)域和一個指針域。指針域指向下一個節(jié)點,最后一個節(jié)點的指針域為 NULL。
鏈表的優(yōu)點是插入和刪除操作的時間復(fù)雜度為 O(1),即不受鏈表長度的影響。缺點是訪問節(jié)點的時間復(fù)雜度為 O(n),其中 n 表示鏈表的長度。文章來源:http://www.zghlxwxcb.cn/news/detail-724984.html
#include <stdio.h>
#include <stdlib.h>
// 定義鏈表節(jié)點結(jié)構(gòu)體
typedef struct node {
int data;
struct node *next;
} Node;
// 創(chuàng)建鏈表并返回鏈表頭
Node* createList() {
Node *head = (Node*) malloc(sizeof(Node)); // 創(chuàng)建頭節(jié)點
head->next = NULL;
return head;
}
// 在鏈表的指定位置插入一個節(jié)點
void insert(Node *head, int data, int index) {
// 創(chuàng)建新節(jié)點并初始化
Node *newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 找到插入位置的前一個節(jié)點
Node *p = head; // 從頭節(jié)點開始查找
int i = 0;
while (p->next && i < index) { // p->next 表示當(dāng)前節(jié)點的下一個節(jié)點,直到找到插入位置的前一個節(jié)點
p = p->next;
i++;
}
if (i == index) {
// 在鏈表中插入新節(jié)點
newNode->next = p->next; // 先將新節(jié)點的 next 指向原來的節(jié)點
p->next = newNode; // 再將前一個節(jié)點的 next 指向新節(jié)點
} else {
printf("插入位置超出鏈表長度!\n");
}
}
// 遍歷鏈表并打印節(jié)點數(shù)據(jù)
void printList(Node *head) {
Node *p = head->next; // 從第一個節(jié)點開始遍歷
while (p) { // p 表示當(dāng)前節(jié)點,直到遍歷到最后一個節(jié)點
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *head = createList(); // 創(chuàng)建鏈表并獲得鏈表頭
// 在鏈表中插入節(jié)點并打印鏈表
insert(head, 1, 0);
insert(head, 2, 1);
insert(head, 3, 2);
insert(head, 4, 1);
printList(head);
return 0;
}
鏈表的刪除文章來源地址http://www.zghlxwxcb.cn/news/detail-724984.html
#include <stdio.h>
#include <stdlib.h>
// 定義鏈表節(jié)點結(jié)構(gòu)體
typedef struct node {
int data;
struct node *next;
} Node;
// 創(chuàng)建鏈表并返回鏈表頭
Node* createList() {
Node *head = (Node*) malloc(sizeof(Node)); // 創(chuàng)建頭節(jié)點
head->next = NULL;
return head;
}
// 在鏈表的指定位置插入一個節(jié)點
void insert(Node *head, int data, int index) {
// 創(chuàng)建新節(jié)點并初始化
Node *newNode = (Node*) malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 找到插入位置的前一個節(jié)點
Node *p = head; // 從頭節(jié)點開始查找
int i = 0;
while (p->next && i < index) { // p->next 表示當(dāng)前節(jié)點的下一個節(jié)點,直到找到插入位置的前一個節(jié)點
p = p->next;
i++;
}
if (i == index) {
// 在鏈表中插入新節(jié)點
newNode->next = p->next; // 先將新節(jié)點的 next 指向原來的節(jié)點
p->next = newNode; // 再將前一個節(jié)點的 next 指向新節(jié)點
} else {
printf("插入位置超出鏈表長度!\n");
}
}
// 在鏈表的指定位置刪除一個節(jié)點
void delete(Node *head, int index) {
// 找到需要刪除的節(jié)點的前一個節(jié)點
Node *p = head;
int i = 0;
while (p->next && i < index) { // p->next 表示當(dāng)前節(jié)點的下一個節(jié)點,直到找到需要刪除的節(jié)點的前一個節(jié)點
p = p->next;
i++;
}
if (i == index && p->next) {
// 刪除節(jié)點并釋放內(nèi)存
Node *temp = p->next; // 先保存需要刪除的節(jié)點
p->next = temp->next; // 將需要刪除的節(jié)點的前一個節(jié)點的 next 指向需要刪除的節(jié)點的下一個節(jié)點
free(temp); // 釋放需要刪除的節(jié)點的內(nèi)存
} else {
printf("刪除位置超出鏈表長度或鏈表為空!\n");
}
}
// 遍歷鏈表并打印節(jié)點數(shù)據(jù)
void printList(Node *head) {
Node *p = head->next; // 從第一個節(jié)點開始遍歷
while (p) { // p 表示當(dāng)前節(jié)點,直到遍歷到最后一個節(jié)點
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
Node *head = createList(); // 創(chuàng)建鏈表并獲得鏈表頭
// 在鏈表中插入節(jié)點并打印鏈表
insert(head, 1, 0);
insert(head, 2, 1);
insert(head, 3, 2);
insert(head, 4, 1);
printList(head);
// 在鏈表中刪除節(jié)點并打印鏈表
delete(head, 2);
printList(head);
delete(head, 0);
printList(head);
delete(head, 2);
printList(head);
return 0;
}
到了這里,關(guān)于鏈表的初始化、取值、查找、插入、刪除的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!