c - 删除和插入一个节点链表 C
问题描述
我正在尝试编写一个程序,我必须在其中删除和插入链接列表中的元素。我在删除时和插入后遇到问题。特别是如果我在删除插入后打印列表,我会打印一个循环。而且,如果我删除第一个元素,我想我会删除整个列表。
这是两个功能,但我不知道问题出在哪里(对不起意大利评论)
void delete_peer(struct node_peer** head, int value){
struct node_peer* temp;
struct node_peer* prev;
temp = head;
if(temp != NULL && temp->port == value){
head = temp->next;
free(temp);
temp = NULL;
return;
}
while(temp != NULL && temp->port != value){
prev = temp;
temp = temp->next;
}
//peer non presente
if(temp == NULL)
return;
prev->next = temp->next;
free(temp);
temp = NULL;
};
void insert_sort(struct node_peer* head, struct node_peer* new_peer){
//se la lista è vuota, o il peer ha il n° di porta piu piccolo tra quelli presenti
//allora inseriamo il nodo in testa
if(*head == NULL || (*head)->port >= new_peer->port) {
new_peer->next = *head;
*head = new_peer;
printf("Inserimento in testa\n");
return;
}
//altrimenti, inserisco all'interno della lista, oridnata per n° di porta dei peers
struct node_peer* current = *head;
while(current->next != NULL && current->next->port < new_peer->port)
current = current->next;
new_peer->next = current->next;
current->next = new_peer;
printf("Inserimento in mezzo\n");
return;
};
EDIT: I pass the *head instead of **head
解决方案
您的代码不应编译,因为至少在函数中delete_peer
void delete_peer(struct node_peer** head, int value){
在这份声明中
temp = head;
使用了不同类型的操作数(struct node_peer*
和struct node_peer**
),并且没有从一种类型到另一种类型的隐式转换。
或者在声明的函数中
void insert_sort(struct node_peer* head, struct node_peer* new_peer){
再次例如 if 语句中的表达式
if(*head == NULL || (*head)->port >= new_peer->port) {
是不正确的,因为至少操作数*head
(根据参数的声明head
)没有指针类型。
该函数delete_peer
可以通过以下方式定义
int delete_peer( struct node_peer **head, int value )
{
while ( *head && ( *head )->port != value )
{
head = &( *head )->next;
}
int success = *head != NULL;
if ( success )
{
struct node_peer *tmp = *head;
*head = ( *head )->next;
free( tmp );
}
return success;
}
并且应该至少像调用该函数一样
delete_peer( &head, value );
该函数insert_sort
可以定义为
void insert_sort( struct node_peer **head, struct node_peer *new_peer )
{
while ( *head && !( new_peer->port < ( *head )->port ) )
{
head = &( *head )->next;
}
new_peer->next = *head;
*head = new_peer;
}
该函数insert_sort
应该被称为
insert_sort( &head, new_peer );
推荐阅读
- java - 有没有办法在不创建新的临时 ArrayList 的情况下更改 ArrayList 的泛型类型?
- javascript - 异步等待 puppeteer.launch 不工作 onClick 与 puppeteer-web
- amazon-web-services - 如何判断我运行的是哪种 ec2 定价模型?
- reactjs - 为什么我的第一次点击没有在我的 React 容器中以状态注册?
- java - 如何从 .csv 列中获取最小值和最大值
- azure-devops - Azure Devops Release Api 的 PropertyFilters 参数中使用的“扩展属性”列表在哪里
- java - 使用 while 循环可被 3 整除的第一个偶数 n 的总和
- java - 无法从java中的字符串数组中获取匹配的字符串值
- android - 由于 ListView 定位,SeekBar 无法正常工作
- mule - Mule(3.3.1) HTTP 入站端点正在创建高 CPU