用C语言链表写一个删的函数
时间: 2023-12-29 20:52:16 浏览: 29
下面是一个简单的链表删除函数的示例:
```c
struct node *deleteNode(struct node *head, int key) {
struct node *prev = NULL;
struct node *curr = head;
// 查找节点
while (curr != NULL && curr->data != key) {
prev = curr;
curr = curr->next;
}
// 如果节点不存在,直接返回 head
if (curr == NULL) {
return head;
}
// 如果要删除的节点是头节点
if (prev == NULL) {
head = curr->next;
} else {
prev->next = curr->next;
}
// 释放节点
free(curr);
return head;
}
```
该函数接受一个链表头指针和要删除的节点值作为参数。它使用一个循环来查找该节点,如果找到了,就将其从链表中删除,释放它的内存,并返回新的链表头指针。如果该节点不存在,就直接返回原始的链表头指针。
相关问题
用C语言写一个函数计算链表有多少节点
假设链表的每个节点定义如下:
```
typedef struct Node {
int data; // 节点的数据
struct Node *next; // 指向下一个节点的指针
} Node;
```
则可以写一个计算链表节点个数的函数如下:
```
int countNodes(Node *head) {
int count = 0; // 计数器初始化为0
Node *p = head; // 从链表头节点开始遍历
while (p != NULL) {
count++; // 遍历每个节点时计数器加1
p = p->next; // 指针移动到下一个节点
}
return count; // 返回计数器的值,即链表节点个数
}
```
该函数接受一个指向链表头节点的指针作为参数,返回链表的节点个数。它使用一个计数器变量count,从头节点开始遍历链表,每遇到一个节点就将计数器加1,直到遍历到链表末尾为止。最后返回计数器的值即可。
c语言写一个链表的顺序存储函数
当我们谈到链表时,通常是指使用指针来表示的动态数据结构。链表的顺序存储并不是常见的做法,因为链表的主要优势在于支持动态插入和删除操作。但是,如果你确实需要使用顺序存储来表示链表,可以考虑以下的C语言代码:
```c
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int next[MAX_SIZE];
int size;
} SequentialLinkedList;
void initialize(SequentialLinkedList* list) {
list->size = 0;
for (int i = 0; i < MAX_SIZE; i++) {
list->next[i] = -1;
}
}
void insert(SequentialLinkedList* list, int value) {
if (list->size >= MAX_SIZE) {
printf("Error: List is full\n");
return;
}
int index = list->size;
list->data[index] = value;
if (index == 0) {
list->next[index] = -1;
} else {
list->next[index - 1] = index;
list->next[index] = -1;
}
list->size++;
}
void display(SequentialLinkedList* list) {
for (int i = 0; i < list->size; i++) {
printf("%d ", list->data[i]);
}
printf("\n");
}
```
使用上述代码,你可以创建一个具有顺序存储的链表,并且能够插入新元素和显示链表的内容。请注意,这种实现方式有一些限制,例如链表的最大大小受到`MAX_SIZE`的限制。此外,由于顺序存储方式,插入操作的时间复杂度较高。
希望以上代码能够满足你的需求!如果有任何问题,请随时提问。