实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。c语言代码每句带详细的注释
时间: 2023-06-01 18:02:11 浏览: 114
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { // 定义结点结构体
int data; // 数据域
struct Node *next; // 指针域,指向下一个结点
} Node, *LinkedList; // Node为结点类型,LinkedList为指向结点的指针类型
LinkedList createLinkedList() { // 创建链表
LinkedList head = (LinkedList)malloc(sizeof(Node)); // 创建头结点
head->next = NULL; // 头结点的指针域为空
return head; // 返回头结点
}
int getLength(LinkedList head) { // 求链表长度
int length = 0; // 初始化长度为0
Node *p = head->next; // p指向第一个结点
while (p != NULL) { // 当p不为空时,遍历链表
length++; // 长度加1
p = p->next; // p指向下一个结点
}
return length; // 返回长度
}
int getElement(LinkedList head, int index) { // 取元素
int i = 0; // 初始化计数器为0
Node *p = head->next; // p指向第一个结点
while (p != NULL && i < index) { // 当p不为空且计数器小于索引时,遍历链表
i++; // 计数器加1
p = p->next; // p指向下一个结点
}
if (p == NULL || i > index) { // 如果p为空或计数器大于索引,说明索引无效
printf("Index is invalid.\n");
return -1; // 返回错误码
} else { // 否则返回结点数据
return p->data;
}
}
void modifyElement(LinkedList head, int index, int data) { // 修改元素
int i = 0; // 初始化计数器为0
Node *p = head->next; // p指向第一个结点
while (p != NULL && i < index) { // 当p不为空且计数器小于索引时,遍历链表
i++; // 计数器加1
p = p->next; // p指向下一个结点
}
if (p == NULL || i > index) { // 如果p为空或计数器大于索引,说明索引无效
printf("Index is invalid.\n");
} else { // 否则修改结点数据
p->data = data;
}
}
void insert(LinkedList head, int index, int data) { // 插入结点
int i = 0; // 初始化计数器为0
Node *p = head; // p指向头结点
while (p != NULL && i < index) { // 当p不为空且计数器小于索引时,遍历链表
i++; // 计数器加1
p = p->next; // p指向下一个结点
}
if (p == NULL || i > index) { // 如果p为空或计数器大于索引,说明索引无效
printf("Index is invalid.\n");
} else { // 否则创建新结点,并将其插入到链表中
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = p->next;
p->next = newNode;
}
}
void delete(LinkedList head, int index) { // 删除结点
int i = 0; // 初始化计数器为0
Node *p = head; // p指向头结点
while (p != NULL && i < index) { // 当p不为空且计数器小于索引时,遍历链表
i++; // 计数器加1
p = p->next; // p指向下一个结点
}
if (p == NULL || i > index) { // 如果p为空或计数器大于索引,说明索引无效
printf("Index is invalid.\n");
} else { // 否则删除结点,并释放其内存空间
Node *temp = p->next;
p->next = temp->next;
free(temp);
}
}
int main() {
LinkedList head = createLinkedList(); // 创建链表
printf("Length of the linked list is %d.\n", getLength(head)); // 输出链表长度
insert(head, 0, 1); // 插入结点
insert(head, 1, 2);
insert(head, 2, 3);
printf("Element at index 1 is %d.\n", getElement(head, 1)); // 取元素
modifyElement(head, 1, 4); // 修改元素
printf("Element at index 1 after modification is %d.\n", getElement(head, 1));
delete(head, 1); // 删除结点
printf("Length of the linked list after deletion is %d.\n", getLength(head));
return 0;
}
```
阅读全文