用c语言建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按头插入法来建立相应单链表。在第i个位置插入(个人学号)和删除元素。
时间: 2024-05-05 13:15:09 浏览: 129
```c
#include <stdio.h>
#include <stdlib.h>
// 链表结点定义
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域
} Node;
// 初始化带头结点的单链表
Node* initList() {
Node* head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->next = NULL; // 头结点的指针域初始化为NULL
return head;
}
// 头插法插入结点
void insertHead(Node* head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新结点
newNode->data = data;
newNode->next = head->next; // 将新结点插入头结点后面
head->next = newNode;
}
// 在第i个位置插入元素
void insertNode(Node* head, int i, int data) {
Node* p = head;
int j = 0;
while (p != NULL && j < i - 1) { // 查找第i-1个结点
p = p->next;
j++;
}
if (p == NULL || j > i - 1) { // 如果i大于链表长度或小于等于0,则插入失败
printf("Insert failed: Invalid position.\n");
return;
}
Node* newNode = (Node*)malloc(sizeof(Node)); // 创建新结点
newNode->data = data;
newNode->next = p->next; // 将新结点插入到p结点后面
p->next = newNode;
}
// 删除结点
void deleteNode(Node* head, int data) {
Node* p = head->next;
Node* pre = head;
while (p != NULL && p->data != data) { // 查找要删除的结点
pre = p;
p = p->next;
}
if (p == NULL) { // 如果没有找到要删除的结点,则删除失败
printf("Delete failed: Element not found.\n");
return;
}
pre->next = p->next; // 将要删除的结点从链表中删除
free(p);
}
// 打印链表元素
void printList(Node* head) {
Node* p = head->next; // 从第一个结点开始输出
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 释放链表内存
void freeList(Node* head) {
Node* p = head;
while (p != NULL) {
Node* temp = p;
p = p->next;
free(temp);
}
}
int main() {
Node* head = initList(); // 初始化带头结点的单链表
int data;
printf("Please enter integers to create a linked list (enter -1 to finish):\n");
scanf("%d", &data);
while (data != -1) { // 读入数据并插入链表
insertHead(head, data);
scanf("%d", &data);
}
printf("The linked list is:\n");
printList(head); // 输出链表
printf("Please enter the position and integer to insert:\n");
int i, x;
scanf("%d%d", &i, &x);
insertNode(head, i, x); // 在第i个位置插入x
printf("After inserting, the linked list is:\n");
printList(head); // 输出链表
printf("Please enter the integer to delete:\n");
scanf("%d", &x);
deleteNode(head, x); // 删除值为x的结点
printf("After deleting, the linked list is:\n");
printList(head); // 输出链表
freeList(head); // 释放链表内存
return 0;
}
```
阅读全文