typedef struct head/ { int num; struct Node*first; struct Node*last; }head; typedef int ElemType; typedef struct Node//数据节点类型声明 { ElemType data; struct Node*next; }Node;增删改查以及销毁
时间: 2024-01-14 16:13:08 浏览: 131
数据结构之队列,队列增删改查
好的,我来给你讲一下链表的增删改查以及销毁操作的实现。
假设你已经定义好了链表的头节点类型 head 和数据节点类型 Node,我们就可以开始实现链表的各种操作了。
一、插入节点操作
链表插入节点操作有两种情况:在链表头部插入节点和在链表任意位置插入节点。
在链表头部插入节点:
```
void insert_node_head(head *h, ElemType data) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = data;
new_node->next = h->first;
h->first = new_node;
h->num++;
if (h->num == 1) {
h->last = new_node;
}
}
```
在链表任意位置插入节点:
```
void insert_node_anywhere(head *h, ElemType data, int pos) {
if (pos < 1 || pos > h->num + 1) {
printf("Invalid position.\n");
return;
}
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = data;
Node *pre = h->first;
Node *cur = pre->next;
for (int i = 1; i < pos - 1; i++) {
pre = cur;
cur = cur->next;
}
new_node->next = cur;
pre->next = new_node;
h->num++;
if (pos == h->num) {
h->last = new_node;
}
}
```
二、删除节点操作
链表删除节点操作也有两种情况:删除链表头部节点和删除链表任意位置节点。
删除链表头部节点:
```
void delete_node_head(head *h) {
if (h->num == 0) {
printf("The list is empty.\n");
return;
}
Node *del_node = h->first;
h->first = del_node->next;
free(del_node);
h->num--;
if (h->num == 0) {
h->last = NULL;
}
}
```
删除链表任意位置节点:
```
void delete_node_anywhere(head *h, int pos) {
if (pos < 1 || pos > h->num) {
printf("Invalid position.\n");
return;
}
Node *pre = h->first;
Node *cur = pre->next;
for (int i = 1; i < pos - 1; i++) {
pre = cur;
cur = cur->next;
}
Node *del_node = cur;
pre->next = del_node->next;
free(del_node);
h->num--;
if (pos == h->num) {
h->last = pre;
}
}
```
三、修改节点操作
链表修改节点只需要找到要修改的节点,然后将其数据部分进行修改即可。
```
void modify_node(head *h, int pos, ElemType new_data) {
if (pos < 1 || pos > h->num) {
printf("Invalid position.\n");
return;
}
Node *cur = h->first;
for (int i = 1; i < pos; i++) {
cur = cur->next;
}
cur->data = new_data;
}
```
四、查找节点操作
链表的查找操作可以根据需求进行不同的实现。下面是查找某个数据的节点的实现。
```
Node *search_node(head *h, ElemType data) {
Node *cur = h->first;
while (cur != NULL && cur->data != data) {
cur = cur->next;
}
return cur;
}
```
五、销毁链表
链表销毁操作需要依次释放链表中的每个节点,最后释放头节点的内存。
```
void destroy_list(head *h) {
Node *cur = h->first;
while (cur != NULL) {
Node *del_node = cur;
cur = cur->next;
free(del_node);
}
h->num = 0;
h->first = NULL;
h->last = NULL;
}
```
以上就是链表的增删改查以及销毁操作的实现。
阅读全文