删除和插入一个节点链表C
Delete and insert a node linked list 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 );
我正在尝试编写一个程序,我必须在其中删除和插入链表中的元素。 我在删除和插入之后遇到问题。 特别是如果我在删除-插入之后打印列表,我会打印一个循环。而且,如果我删除第一个元素,我想我会删除整个列表。
这是两个函数,但我不知道问题在哪里(抱歉意大利语评论)
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 );