1 链表的结构
typedef struct Node {
int data;
Node *next;
} Node;
2 链表操作
- 头节点插入
void add2head(int x) {
Node* p = (Node*)malloc(sizeof(struct Node));
p -> data = x;
p -> next = head -> next;
head -> next = p;
}
- 在第k个位置插入
void insert_k(int k, int x) {
int cnt = 0;
Node* p = head;
while (p->next != NULL && cnt++ <= k - 1) p = p->next;
Node* q = (Node*)malloc(sizeof(struct Node));
// 插入操作
q -> data = x;
q->next = p->next;
p->next = q;
}
- 删除操作
// 删除第k位置的数
void remove(int k) {
Node* p, *q;
if (k == 1) {
q = head;
head = head->next;
free(q);
}
else {
p = head;
int cnt = 1;
while (p->next != NULL && cnt++ <= k - 1) p = p->next;
q = p->next;
p->next = p->next->next;
free(q);
}
}
- 打印操作
void printList() {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p -> data);
p = p->next;
}
}
- 查找某个元素是否存在
bool exist(int x) {
Node* p = head -> next;
while (p != NULL && p->data != x) p = p->next;
return p != NULL;
}
3 测试代码
#include <stdio.h>
#include <stdlib.h>
const int N = 4;
typedef struct Node {
int data;
Node* next;
}Node;
Node* head;
// 生成链表,此处可以用随机函数随机产生数和长度代替
Node* generate(int q[], int n) {
head = (Node*)malloc(sizeof(struct Node));
head->next = NULL;
for (int i = 0; i < n; i++) {
Node* p = (Node*)malloc(sizeof(struct Node));
p->data = q[i];
p->next = head->next;
head->next = p;
}
return head;
}
void printList() {
Node* p = head->next;
while (p != NULL) {
printf("%d ", p -> data);
p = p->next;
}
}
void add2Head(int x) {
Node* p = (Node*)malloc(sizeof(struct Node));
p->data = x;
p->next = head->next;
head->next = p;
}
void insert_k(int k, int x) {
int cnt = 1;
Node* p = head;
while (p->next != NULL && cnt++ <= k - 1) p = p->next;
Node* q = (Node*)malloc(sizeof(struct Node));
q -> data = x;
q->next = p->next;
p->next = q;
}
void remove(int k) {
Node* p, *q;
if (k == 1) {
q = head;
head = head->next;
free(q);
}
else {
p = head;
int cnt = 1;
while (p->next != NULL && cnt++ <= k - 1) p = p->next;
q = p->next;
p->next = p->next->next;
free(q);
}
}
bool exist(int x) {
Node* p = head -> next;
while (p != NULL && p->data != x) p = p->next;
printf("exit : %d", p->data);
return p != NULL;
}
int main() {
int a[10];
for (int i = 0; i < N; i++) scanf_s("%d", &a[i]);
generate(a, N);
printf("the list is :\n");
printList();
int op = 1;
while (true) {
printf("\n");
scanf_s("%d", &op);
if (op == 0) break;
if (op == 1) {
printf("enter a num add to head : \n");
int x;
printf("\n");
scanf_s("%d", &x);
add2Head(x);
printf("now the list is :\n");
printList();
}
if (op == 2) {
printf("enter a num add to k : \n");
int k, x;
printf("\n");
scanf_s("%d%d", &k, &x);
insert_k(k, x);
printf("now the list is :\n");
printList();
}
if (op == 3) {
int k;
printf("\n");
scanf_s("%d", &k);
remove(k);
printf("now the list is :\n");
printList();
}
if (op == 4) {
printf("\n");
int x;
scanf_s("%d", &x);
if (exist(x)) printf("Yes\n");
else printf("No\n");
}
}
printList();
return 0;
}
注:此篇代码只是为了应付考试,很多边界和代码优化没有做,后续有时间补上。