用C语言实现建立单向链表,表长任意;可交互输出单链表中的内容;编写算法计算出自己所建立的单链表的长度并输出;删除自己所建单链表中的第K个节点,并将剩余节点输出;将单链表倒排,输出结果。
时间: 2024-05-02 21:20:22 浏览: 132
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 创建链表
Node *createLinkedList() {
Node *head = (Node *) malloc(sizeof(Node)); // 创建头结点
Node *p = head; // p指向当前节点
int value;
printf("请输入链表中的元素,以-1结束:");
while (1) {
scanf("%d", &value);
if (value == -1) {
break;
}
Node *newNode = (Node *) malloc(sizeof(Node));
newNode->data = value;
p->next = newNode;
p = p->next;
}
p->next = NULL; // 尾节点指向NULL
return head;
}
// 输出链表中的元素
void printLinkedList(Node *head) {
Node *p = head->next; // p指向第一个元素节点
printf("链表中的元素为:");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 计算链表长度
int getLinkedListLength(Node *head) {
int count = 0;
Node *p = head->next; // p指向第一个元素节点
while (p != NULL) {
count++;
p = p->next;
}
return count;
}
// 删除链表中的第k个元素
void deleteNodeFromLinkedList(Node *head, int k) {
int count = 0;
Node *p = head;
while (p != NULL && count < k - 1) { // 找到待删除节点的前一个节点
count++;
p = p->next;
}
if (p == NULL || p->next == NULL) { // 未找到待删除节点或待删除节点为尾节点
printf("删除失败!\n");
return;
}
Node *q = p->next; // q指向待删除节点
p->next = q->next; // 将待删除节点的前一个节点指向待删除节点的后一个节点
free(q); // 释放待删除节点的空间
printf("删除成功!\n");
}
// 将链表倒排
void reverseLinkedList(Node *head) {
Node *p = head->next; // p指向第一个元素节点
Node *q = p->next; // q指向第二个元素节点
p->next = NULL; // 将第一个元素节点作为新链表的尾节点
while (q != NULL) {
Node *r = q->next; // r指向q节点的后一个节点
q->next = p; // 将q节点指向p节点
p = q; // p指向q节点
q = r; // q指向r节点
}
head->next = p; // 将头结点指向新链表的第一个元素节点
}
int main() {
Node *head = createLinkedList(); // 创建链表
printLinkedList(head); // 输出链表中的元素
int length = getLinkedListLength(head); // 计算链表长度
printf("链表长度为:%d\n", length);
int k;
printf("请输入要删除的节点的位置:");
scanf("%d", &k);
deleteNodeFromLinkedList(head, k); // 删除链表中的第k个元素
printLinkedList(head); // 输出链表中的元素
reverseLinkedList(head); // 将链表倒排
printLinkedList(head); // 输出链表中的元素
return 0;
}
```
阅读全文