单链表进行求长度,查找,插入和删除运算,不带头结点,c语言,完整代码
时间: 2024-03-26 10:38:58 浏览: 15
好的,这里是完整的单链表代码,包括求长度、查找、插入和删除操作。
```
#include <stdio.h>
#include <stdlib.h>
// 定义节点类型
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkedList;
// 创建链表
LinkedList createList() {
LinkedList L = NULL; // 定义头指针
Node *p = NULL; // 定义节点指针
int x = 0; // 定义数据
scanf("%d", &x); // 输入数据
while(x != -1) { // 输入-1表示输入结束
Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点
newNode->data = x; // 设置新节点数据
newNode->next = NULL; // 新节点的下一个节点指向NULL
if(L == NULL) { // 链表为空
L = newNode; // 头指针指向新节点
p = L; // 节点指针也指向新节点
} else { // 链表不为空
p->next = newNode; // 当前节点的下一个节点指向新节点
p = p->next; // 节点指针指向新节点
}
scanf("%d", &x); // 继续输入数据
}
return L; // 返回头指针
}
// 求链表长度
int getLength(LinkedList L) {
int len = 0; // 链表长度
Node *p = L; // 定义指针p指向链表头节点
while(p != NULL) { // 遍历链表
len++; // 长度加1
p = p->next; // 指针指向下一个节点
}
return len;
}
// 查找指定节点
Node *findNode(LinkedList L, int x) {
Node *p = L; // 定义指针p指向链表头节点
while(p != NULL) { // 遍历链表
if(p->data == x) { // 找到指定节点
return p;
}
p = p->next; // 指针指向下一个节点
}
return NULL; // 没有找到,返回NULL
}
// 插入节点
void insertNode(LinkedList L, int x, int pos) {
Node *p = L; // 定义指针p指向链表头节点
Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点
newNode->data = x; // 设置新节点数据
newNode->next = NULL; // 新节点的下一个节点指向NULL
for(int i = 1; i < pos; i++) { // 找到插入位置的前一个节点
p = p->next;
}
newNode->next = p->next; // 新节点的下一个节点指向插入位置的节点
p->next = newNode; // 插入位置的前一个节点的下一个节点指向新节点
}
// 删除节点
void deleteNode(LinkedList L, int x) {
Node *p = L; // 定义指针p指向链表头节点
Node *q = NULL; // 定义指针q指向要删除的节点的前一个节点
while(p != NULL && p->data != x) { // 找到要删除的节点
q = p;
p = p->next;
}
if(p == NULL) { // 没有找到要删除的节点
printf("没有找到要删除的节点\n");
return;
}
q->next = p->next; // 要删除的节点的前一个节点的下一个节点指向要删除的节点的下一个节点
free(p); // 释放要删除的节点的内存
}
// 遍历链表
void traverseList(LinkedList L) {
Node *p = L; // 定义指针p指向链表头节点
while(p != NULL) { // 遍历链表
printf("%d ", p->data); // 输出节点数据
p = p->next; // 指针指向下一个节点
}
printf("\n");
}
int main() {
LinkedList L = createList(); // 创建链表
printf("链表长度:%d\n", getLength(L)); // 求链表长度
int x = 0;
printf("请输入要查找的节点:");
scanf("%d", &x);
Node *p = findNode(L, x); // 查找节点
if(p != NULL) {
printf("找到了节点:%d\n", p->data);
} else {
printf("没有找到节点:%d\n", x);
}
printf("请输入要插入的节点和插入位置:");
scanf("%d %d", &x, &pos);
insertNode(L, x, pos); // 插入节点
traverseList(L); // 遍历链表
printf("请输入要删除的节点:");
scanf("%d", &x);
deleteNode(L, x); // 删除节点
traverseList(L); // 遍历链表
return 0;
}
```
以上就是单链表的完整代码。希望能够对你有所帮助。