1.构建链表
链表的构建通常从头部开始,并为每个新节点分配内存并设置引用。在创建链表时,需要考虑如何存储数据和下一个节点的引用。
Node *getNewNode(int val){ //创建一个链表
Node *p = (Node *)malloc(sizeof(Node)); //给这个链表申请一个空间
p->data = val;
p->next = NULL;
return p;
}
2.查找元素
链表的查找是从头部开始,沿着每个节点的引用逐步向下进行,直到找到包含所需数据的节点或到达链表的末尾。此操作的时间复杂度为O(n),其中n是链表中的节点数。
for(int i = 0; i < n ;i++){ //n链表的大小
if(i==a){ //要查找链表的位置
printf(" ^\n");
}
3.插入元素
在链表中的特定位置插入元素需要找到该位置的节点,并在该节点之后插入新的节点。如果要在链表的开始处插入元素,需要特别处理头节点。插入操作的时间复杂度也是O(n)。
Node *insert(Node *head, int pos, int val){ //查找这个链表第pos个数插入数值val
if(pos == 0){
Node *p = getNewNode(val);
p -> next = head;
return p;
}
Node *p = head;
for(int i = 1; i < pos; i++) p = p->next;
Node *node = getNewNode(val);
node->next = p->next;
p->next = node;
return head;
}
4.释放内存
当链表不再需要时,应释放为其分配的所有内存。这包括释放所有节点的内存以及对每个节点引用的内存。
void clear(Node *head){
if(head == NULL) return;
for(Node *p = head , *q ; p; p = q){
q = p -> next;
free(p); //释放这个链表
}
return ;
}
详细代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node {
int data;
struct Node *next ;
} Node;
Node *getNewNode(int val){ //创建一个链表
Node *p = (Node *)malloc(sizeof(Node)); //给这个链表申请一个空间
p->data = val;
p->next = NULL;
return p;
}
void clear(Node *head){
if(head == NULL) return;
for(Node *p = head , *q ; p; p = q){
q = p -> next;
free(p); //释放这个链表
}
return ;
}
Node *insert(Node *head, int pos, int val){ //查找这个链表第pos个数插入数值val
if(pos == 0){
Node *p = getNewNode(val);
p -> next = head;
return p;
}
Node *p = head;
for(int i = 1; i < pos; i++) p = p->next;
Node *node = getNewNode(val);
node->next = p->next;
p->next = node;
return head;
}
void output_linklist(Node *head, int a){
int n = 0;
for(Node *p = head; p; p = p->next) n += 1;
for(int i = 0; i < n ;i++){
printf("%3d", i);
printf(" ");
}
printf("\n");
for(Node *p = head; p; p = p->next){
printf("%3d", p->data);
printf("->");
}
printf("\n");
for(int i = 0; i < n ;i++){
if(i==a){
printf(" ^\n");
}
else {
printf(" ");
}
}
printf("\n");
return ;
}
int main(){
srand(time(0));
#define MAX_OP 5
Node *head = NULL;
for(int i = 0;i< MAX_OP;i++){
int pos = rand() % (i + 1), val = rand() % 100;
printf("insert %d at %d to linklist\n", val, pos);
head = insert(head, pos, val);
output_linklist(head,3);
}
clear(head);
return 0;
}
结果: