实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。 [基本要求] (1)依次从键盘读入数据,建立带头结点的单链表; (2)输出单链表中的数据元素 (3)求单链表的长度; (4)根据指定条件能够取元素和修改元素; (5)实现在指定位置插入和删除元素的功能。 c语言代码带详细的注释
时间: 2023-06-01 22:02:18 浏览: 193
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域,指向下一个节点
} Node;
// 初始化带头结点的链表
void initList(Node **head) {
// 创建头结点
*head = (Node *)malloc(sizeof(Node));
(*head)->next = NULL;
}
// 建立带头结点的链表
void createList(Node *head) {
Node *p = head;
int data;
printf("请输入数据,以-1结束:\n");
while (1) {
scanf("%d", &data);
if (data == -1) {
break;
}
// 创建新节点
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
// 将新节点插入到链表尾部
p->next = newNode;
p = p->next;
}
}
// 输出链表中的元素
void printList(Node *head) {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 求链表长度
int getLength(Node *head) {
int length = 0;
Node *p = head->next;
while (p != NULL) {
length++;
p = p->next;
}
return length;
}
// 获取链表中第i个元素的值
int getElem(Node *head, int i) {
int j = 1;
Node *p = head->next;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL) {
printf("第%d个元素不存在\n", i);
return -1;
}
return p->data;
}
// 修改链表中第i个元素的值
void modifyElem(Node *head, int i, int data) {
int j = 1;
Node *p = head->next;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL) {
printf("第%d个元素不存在\n", i);
return;
}
p->data = data;
}
// 在链表中第i个位置插入元素
void insertElem(Node *head, int i, int data) {
int j = 1;
Node *p = head;
// 找到第i-1个节点
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL) {
printf("插入位置无效\n");
return;
}
// 创建新节点
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
}
// 删除链表中第i个元素
void deleteElem(Node *head, int i) {
int j = 1;
Node *p = head;
// 找到第i-1个节点
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || p->next == NULL) {
printf("删除位置无效\n");
return;
}
// 删除第i个节点
Node *q = p->next;
p->next = q->next;
free(q);
}
int main() {
Node *head;
initList(&head);
createList(head);
printf("链表中的元素为:");
printList(head);
int length = getLength(head);
printf("链表的长度为:%d\n", length);
int elem = getElem(head, 3);
printf("链表中第3个元素为:%d\n", elem);
modifyElem(head, 3, 10);
printf("修改后链表中第3个元素为:%d\n", getElem(head, 3));
insertElem(head, 2, 5);
printf("在链表中第2个位置插入元素5后,链表中的元素为:");
printList(head);
deleteElem(head, 4);
printf("删除链表中第4个元素后,链表中的元素为:");
printList(head);
return 0;
}
```
阅读全文