用C语言创建一个链表,掌握线性表链式存储的特点。设计和验证链表的 插入、删除算法。要求实现链表的创建、插入、删除、遍历等算法。并写代码验证。 要求在插入和删除之前与之后都输出-下当前链表的内容情况
时间: 2024-10-22 17:26:56 浏览: 28
在C语言中,链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。链表的主要优点是可以高效地添加和删除元素,不需要像数组那样预先分配固定大小的空间。
首先,我们需要定义链表节点的结构体(Node),包括数据域和一个指向下一个节点的指针:
```c
typedef struct Node {
int data; // 数据域
struct Node* next; // 指向下一个节点的指针
} Node;
```
接下来,我们可以创建一个链表(LinkedList)的头结点,并初始化为空:
```c
Node* head = NULL;
```
以下是链表的基本操作:
### 插入节点
- 插入在头部:`insertAtStart(head, data)`
```c
void insertAtStart(Node** head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = *head;
*head = newNode;
}
```
- 插入在指定位置:`insertAtPosition(head, position, data)`
```c
void insertAtPosition(Node** head, int position, int data) {
if (position <= 0) return;
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = *head;
for (int i = 0; i < position - 1 && head != NULL; ++i) {
head = &(*head)->next;
}
if (head != NULL) head->next = newNode;
}
```
### 删除节点
- 删除头部节点:`deleteFromStart(head)`
```c
void deleteFromStart(Node** head) {
if (*head == NULL) return;
Node* temp = *head;
*head = (*head)->next;
free(temp);
}
```
- 删除特定位置的节点:`deleteFromPosition(head, position)`
```c
void deleteFromPosition(Node** head, int position) {
if (position <= 0 || head == NULL) return;
Node* current = *head;
for (int i = 0; i < position - 1 && current != NULL; ++i) {
current = current->next;
}
if (current != NULL) {
Node* toDelete = current->next;
current->next = toDelete->next;
free(toDelete);
}
}
```
### 遍历链表
```c
void printList(Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
```
在操作前后,你可以通过调用`printList(head)`函数来验证链表内容的变化。
```c
// 示例:
int main() {
// 初始化链表
...
// 插入节点前后的打印
printList(head);
insertAtStart(&head, 5); // 添加节点
printList(head);
// 删除节点前后的打印
deleteFromStart(&head); // 删除头部节点
printList(head);
// ...其他操作...
return 0;
}
```
阅读全文