C语言编程实现单链表的创建、插入和删除。然后输出顺序表的内容。元素由用户从键盘输入。
时间: 2023-08-20 17:05:03 浏览: 98
以下是一个简单的 C 语言程序,实现单链表的创建、插入和删除,并输出链表内容:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 创建单链表
struct ListNode* createList(int n) {
struct ListNode *head = NULL, *tail = NULL;
for (int i = 0; i < n; i++) {
int val;
printf("请输入第%d个元素的值:", i+1);
scanf("%d", &val);
// 创建结点
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
// 链表为空,新结点为头结点
if (head == NULL) {
head = node;
tail = node;
}
else {
tail->next = node;
tail = node;
}
}
return head;
}
// 插入结点
void insertNode(struct ListNode **head, int pos, int val) {
// 创建结点
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
// 插入到链表头
if (pos == 0) {
node->next = *head;
*head = node;
return;
}
// 插入到链表中间或尾部
struct ListNode *prev = *head;
for (int i = 0; i < pos-1; i++) {
if (prev == NULL) {
printf("插入位置无效!\n");
return;
}
prev = prev->next;
}
if (prev == NULL) {
printf("插入位置无效!\n");
return;
}
node->next = prev->next;
prev->next = node;
}
// 删除结点
void deleteNode(struct ListNode **head, int pos) {
// 删除链表头结点
if (pos == 0) {
struct ListNode *temp = *head;
*head = (*head)->next;
free(temp);
return;
}
// 删除链表中间或尾部结点
struct ListNode *prev = *head;
for (int i = 0; i < pos-1; i++) {
if (prev == NULL || prev->next == NULL) {
printf("删除位置无效!\n");
return;
}
prev = prev->next;
}
if (prev == NULL || prev->next == NULL) {
printf("删除位置无效!\n");
return;
}
struct ListNode *temp = prev->next;
prev->next = temp->next;
free(temp);
}
// 输出链表
void printList(struct ListNode *head) {
struct ListNode *p = head;
printf("链表内容为:");
while (p != NULL) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
int main() {
int n;
printf("请输入链表长度:");
scanf("%d", &n);
// 创建链表
struct ListNode *head = createList(n);
printList(head);
// 插入结点
int pos1, val1;
printf("请输入要插入的位置和值(用空格隔开):");
scanf("%d %d", &pos1, &val1);
insertNode(&head, pos1, val1);
printList(head);
// 删除结点
int pos2;
printf("请输入要删除的位置:");
scanf("%d", &pos2);
deleteNode(&head, pos2);
printList(head);
return 0;
}
```
这个程序中,我们定义了一个单链表结点的结构体 `ListNode`,包括结点的值和指向下一个结点的指针。然后定义了 `createList` 函数来创建链表,它接受一个整数 `n`,表示链表长度,然后从用户输入中读取每个结点的值,创建结点并将其加入链表中。接着定义了 `insertNode` 函数和 `deleteNode` 函数来分别插入和删除结点,它们都接受链表头结点的指针以及要插入或删除的位置和值。最后定义了 `printList` 函数来输出链表内容。在 `main` 函数中,我们首先读取用户输入的链表长度,然后创建链表并输出其内容。接着读取用户输入的要插入的位置和值,调用 `insertNode` 函数插入新结点,并输出链表内容。最后读取用户输入的要删除的位置,调用 `deleteNode` 函数删除结点,并输出链表内容。
阅读全文