初始化一个数据元素为整型的链表,通过控制台scanf函数将每个节点赋值,并输出链表表每个结点的值 对链表表插入和删除结点
时间: 2024-04-30 20:20:41 浏览: 94
基于C++实现(控制台)实现链表的插入、删除、打印等操作的函数(线程安全型数据结构)【100012475】
以下是使用C语言实现的初始化、插入、删除和输出链表的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点的结构体
typedef struct ListNode {
int val; // 节点的数据元素
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 初始化一个数据元素为整型的链表
ListNode* initList() {
ListNode* head = (ListNode*)malloc(sizeof(ListNode)); // 创建头节点
head->next = NULL; // 头节点不存储任何数据元素,将指向下一个节点的指针设为 NULL
ListNode* tail = head; // 记录链表的尾节点
int val;
while (scanf("%d", &val) != EOF) { // 通过 scanf 函数从控制台输入每个节点的值,以 EOF 结束
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点
newNode->val = val;
newNode->next = NULL;
tail->next = newNode; // 将新节点插入到链表的尾部
tail = newNode; // 更新链表的尾节点
}
return head;
}
// 输出链表的每个节点的值
void printList(ListNode* head) {
ListNode* p = head->next; // 从头节点的下一个节点开始遍历
while (p != NULL) {
printf("%d ", p->val); // 输出节点的值
p = p->next; // 指向下一个节点
}
printf("\n");
}
// 在链表的指定位置插入一个新节点
void insertListNode(ListNode* head, int index, int val) {
ListNode* p = head; // 从头节点开始遍历
int i = 0;
while (p != NULL && i < index) { // 找到插入位置的前一个节点
p = p->next;
i++;
}
if (p == NULL || i > index) { // 判断插入位置是否合法
printf("插入位置不合法!\n");
return;
}
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点
newNode->val = val;
newNode->next = p->next;
p->next = newNode; // 将新节点插入到链表中
}
// 删除链表的指定位置的节点
void deleteListNode(ListNode* head, int index) {
ListNode* p = head; // 从头节点开始遍历
int i = 0;
while (p != NULL && i < index) { // 找到要删除的节点的前一个节点
p = p->next;
i++;
}
if (p == NULL || p->next == NULL || i > index) { // 判断删除位置是否合法
printf("删除位置不合法!\n");
return;
}
ListNode* q = p->next; // 要删除的节点
p->next = q->next; // 将要删除的节点从链表中删除
free(q); // 释放内存
}
int main() {
ListNode* head = initList(); // 初始化链表
printList(head); // 输出链表的每个节点的值
// 在链表的指定位置插入一个新节点
int index, val;
printf("请输入要插入的位置和节点的值:");
scanf("%d %d", &index, &val);
insertListNode(head, index, val);
printList(head);
// 删除链表的指定位置的节点
printf("请输入要删除的位置:");
scanf("%d", &index);
deleteListNode(head, index);
printList(head);
return 0;
}
```
以上代码中,使用 `initList()` 函数初始化了一个数据元素为整型的链表,通过 `scanf()` 函数从控制台输入每个节点的值,并以 EOF 结束。使用 `printList()` 函数输出链表的每个节点的值,使用 `insertListNode()` 函数在链表的指定位置插入一个新节点,使用 `deleteListNode()` 函数删除链表的指定位置的节点。
阅读全文