C语言实现链表的定义链表、初始化链表、链表的建立、链表的打印、链表的查找、链表的插入、链表的删除操作
时间: 2023-07-10 20:13:57 浏览: 47
好的,我可以回答你的问题。下面是 C 语言实现链表的定义、初始化、建立、打印、查找、插入和删除操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表结构体
typedef struct node {
int data; // 数据域
struct node *next; // 指针域,指向下一个节点
} Node, *LinkedList;
// 初始化链表
void initList(LinkedList *L) {
*L = (LinkedList) malloc(sizeof(Node)); // 创建头节点
(*L)->next = NULL; // 头节点的指针域为空
}
// 建立链表
void createList(LinkedList L) {
Node *p, *q;
p = L;
int n, i, x;
printf("请输入节点数:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("请输入第%d个节点的值:", i + 1);
scanf("%d", &x);
q = (Node *) malloc(sizeof(Node)); // 创建新节点
q->data = x; // 赋值
p->next = q; // 将新节点接在尾部
p = q; // p 指向新的尾节点
}
p->next = NULL; // 尾节点的指针域为空
}
// 打印链表
void printList(LinkedList L) {
Node *p = L->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 查找节点
int findNode(LinkedList L, int x) {
Node *p = L->next;
int i = 1;
while (p != NULL && p->data != x) {
p = p->next;
i++;
}
if (p == NULL) {
return -1; // 没有找到
} else {
return i; // 返回节点位置
}
}
// 插入节点
int insertNode(LinkedList L, int i, int x) {
Node *p = L, *q;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL || j > i - 1) {
return -1; // 插入位置不合法
}
q = (Node *) malloc(sizeof(Node)); // 创建新节点
q->data = x; // 赋值
q->next = p->next; // 将新节点插入链表
p->next = q;
return 1;
}
// 删除节点
int deleteNode(LinkedList L, int i) {
Node *p = L, *q;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL || j > i - 1 || p->next == NULL) {
return -1; // 删除位置不合法
}
q = p->next; // q 指向待删除节点
p->next = q->next; // 将待删除节点从链表中删除
free(q); // 释放空间
return 1;
}
int main() {
LinkedList L;
initList(&L); // 初始化链表
createList(L); // 建立链表
printList(L); // 打印链表
int x, i;
printf("请输入要查找的值:");
scanf("%d", &x);
i = findNode(L, x); // 查找节点
if (i == -1) {
printf("没有找到节点\n");
} else {
printf("节点在第%d个位置\n", i);
}
printf("请输入要插入的位置和值:");
scanf("%d %d", &i, &x);
if (insertNode(L, i, x) == -1) { // 插入节点
printf("插入失败\n");
} else {
printf("插入成功\n");
printList(L);
}
printf("请输入要删除的位置:");
scanf("%d", &i);
if (deleteNode(L, i) == -1) { // 删除节点
printf("删除失败\n");
} else {
printf("删除成功\n");
printList(L);
}
return 0;
}
```
上面的代码实现了链表的定义、初始化、建立、打印、查找、插入和删除操作。你可以根据需要进行修改和扩展。