c语言定义线性表的插入和删除算法实现采用相关的数据类型
时间: 2024-11-09 11:21:59 浏览: 25
在C语言中,定义线性表(数组、链表等)的插入和删除操作通常涉及到动态内存管理。这里以单链表为例来说明:
### 插入操作
**1. 链表头插法(Insert at beginning)**:
```c
void insert_at_beginning(struct Node **head, int data) {
// 创建新节点
struct Node *new_node = (struct Node*)malloc(sizeof(struct Node));
if (!new_node) { // 检查内存分配是否成功
printf("Memory allocation failed.\n");
return;
}
// 设置新节点信息
new_node->data = data;
new_node->next = *head; // 将新节点指向原头节点
// 更新头节点指针
*head = new_node;
}
```
**2. 链表尾插法(Insert at end)**:
```c
void insert_at_end(struct Node **head, int data) {
struct Node *new_node = (struct Node*)malloc(sizeof(struct Node));
if (!new_node) {
printf("Memory allocation failed.\n");
return;
}
new_node->data = data;
// 如果链表为空,则直接将新节点设为头结点
if (*head == NULL) {
*head = new_node;
return;
}
// 否则找到最后一个元素并添加新节点
struct Node *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = new_node;
}
```
### 删除操作
**1. 删除指定值的节点**:
```c
void delete_node(struct Node **head, int key) {
// 查找要删除的节点
struct Node* temp = *head, *prev = NULL;
if (temp != NULL && temp->data == key) {
*head = temp->next;
free(temp);
return;
}
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// 如果未找到节点,则不做任何操作
if (temp == NULL) return;
prev->next = temp->next;
free(temp);
}
```
**2. 删除特定位置的节点**:
```c
void delete_at_position(struct Node **head, int position) {
if (*head == NULL || position < 0 || position >= node_count(*head)) {
printf("Invalid position.\n");
return;
}
struct Node *temp = *head, *prev = NULL;
for (int i = 0; i < position; i++) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) {
printf("No node found at the given position.\n");
return;
}
prev->next = temp->next;
free(temp);
}
```
以上代码假设`struct Node`是一个包含`data`和`next`成员的结构体,`node_count`函数用于计算链表长度。
阅读全文