gpt4 book ai didi

c - 删除前未知删除节点的双向链表

转载 作者:行者123 更新时间:2023-11-30 16:47:11 25 4
gpt4 key购买 nike

在 addTrash 的第一次迭代之后,然后到modifyMainList 的第一次迭代之后,由于索引位置中的空值(我将通过modifyMainList 从主列表中取出),它出现了段错误。 addTrash 根本不应该删除任何内容,所以我认为这一定是一个指针问题,但我不确定。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct node {
int value;
struct node *next, *previous;
};

struct node * modifyMainList(struct node *mainHead, int link2Delete){

printf("inside modify list\n\n");
struct node *curr, *temp;
temp = NULL;
curr = mainHead;
int i;

for (i = 0; i < link2Delete; i++){

printf("%d\n", i);
curr = curr -> next;
}

if(curr -> previous == NULL){

temp = curr;
curr = curr -> next;

curr -> previous = NULL;

temp -> next = NULL;
free(temp);

return mainHead;
}else{

if((curr -> next == NULL) && (curr -> previous != NULL)){

temp = curr;
curr = curr -> previous;
curr -> next = NULL;

temp -> previous = NULL;
free(temp);

return mainHead;
}else{

temp = curr;
curr = curr -> previous;
curr -> next = curr -> next -> next;
curr = temp -> next;
curr -> previous = curr -> previous -> previous;

temp -> previous = NULL;
temp -> next = NULL;
free(temp);

return mainHead;
}
}
}

struct node * addTrash(struct node *trashHead, struct node *mainHead, int link2Delete){

struct node *curr = mainHead, *trashCurr = NULL, *temp = NULL;
int i = 0;

for(i = 0; i < link2Delete; i++){

curr = curr -> next;
}

printf("inside addTrash\n\n");
if(trashHead == NULL){

trashHead = curr;
trashHead -> previous = NULL;
trashHead -> next = NULL;


return trashHead;

}else{

trashCurr = trashHead;
while(trashCurr -> next != NULL){

trashCurr = trashCurr -> next;
}

trashCurr -> next = curr;
temp = curr;
temp -> previous = trashCurr;
temp -> next = NULL;

temp = NULL;
free(temp);

trashCurr = NULL;
free(trashCurr);

return trashHead;

}
}

//Traverses and prints out data from left to right
void TraverseLeftRight(struct node *head){

struct node *current;
current = head;

while(1){
if(current != NULL){

printf("Left to right output: %d\n", current -> value);
current = current -> next;
}else{
break;
}
}
}


//Traverses and prints out data from right to left
void TraverseRightLeft(struct node *tail){

struct node *current;


current = tail;

while(1){
if(current != NULL){

printf("Right to left output: %d\n", current -> value);
current = current -> previous;
}else{
break;
}
}
}


//inserts a node into the doubly linked linked-list
struct node * insertIntoList(struct node *head, int value){

int i;
struct node *current, *temp;

for(i = 0; i < value; i++){

//Case 1: List empty
if (i == 0){

//create node and assign all pointers and values
temp = (struct node *) malloc(sizeof(struct node));
temp -> value = i;
temp -> next = NULL;
temp -> previous = NULL;
head = temp;
current = head;
printf("Input data: %d\n", current -> value);


}else{

//create node and assign pointers and values
temp = (struct node *) malloc(sizeof(struct node));
temp -> value = i;
temp -> next = NULL;

//assign pointer of previous for temp to the current node
temp -> previous = current;



//change current node to the node that was just created
current -> next = temp;
current = current -> next;
printf("Input data: %d\n", current -> value);

}
}
printf("\n");
return head;

}

//frees the data on the doubly linked linked-list

void Free(struct node *head){

struct node *current, *temp;

current = head;
temp = head;

while(1){
if(current != NULL){

current = current -> next;
temp -> next = NULL;
temp -> previous = NULL;
temp -> value = 0;
free(temp);
temp = current;

}else{
break;
}
}


}

int main(int argv, char **argc){

struct node *head, *current, *tail, *temp, *trashHead;
int input, link2Delete = 0, size = 0, y = 0, number2Delete = 0, i;
head = NULL;
trashHead = NULL;
temp = NULL;
current = NULL;
tail = NULL;

//Check to see if there is the correct amount of arguments
if(argv < 2){
printf("************************************************\n");
printf("* You must include a number for size of list. *\n");
printf("************************************************\n");

//exit program
return 0;

}else{
if(argv > 2){
printf("*****************************************************************\n");
printf("* You have entered too many arguments, arguments need to be 2. *\n");
printf("*****************************************************************\n");

//exit program
return 0;

}else{

if(argv == 2){

//convert string to int
input = atoi(argc[1]);

//create the doubly linked linked-list
head = insertIntoList(head, input);



//traverse and print values from left to right order
TraverseLeftRight(head);

//traverses the list to create the tail
current = head;

while(1){
if(current != NULL){
temp = current;
current = current -> next;

}else{
break;
}
}

tail = temp;

printf("\n");

//traverse and print values from right to left order
TraverseRightLeft(tail);

//Generate the random numbers for the corresponding names to be deleted and the numbers of
//deletions made
srand( time(NULL) );
size = input;
number2Delete = rand() % size + 1;

printf("\n\nThis is the random number: %d\n", rand());
printf("This is the nuber of nodes to be deleted: %d\n", number2Delete);

for(i = 0; i < number2Delete; i++){

y = 0;
//Pick a random node for deletion
link2Delete = (rand() % size);
current = head;
while(current != NULL){

current = current -> next;
if(current != NULL){
printf("this is node: %d\n", y);
y++;
}
}

printf("this is the node to be deleted: %d\n\n", link2Delete);
size--;

trashHead = addTrash(trashHead, head, link2Delete);
printf("this is the head of trash: %d\n\n", trashHead -> value);
head = modifyMainList(head, link2Delete);
}

Free(head);
return 0;
}
}
}
}

最佳答案

在addTrash中,这看起来可能会很麻烦。您将其设置为 NULL 然后释放?不确定这会实现什么。

    temp = NULL;
free(temp);

trashCurr = NULL;
free(trashCurr);

另外,由于它是一个地址,并且您设置了

    trashCurr = trashHead;

如果你释放了trashCurr,你也就释放了trashHead,然后返回了你刚刚释放的trashHead

也许我误解了,但这是快速浏览的结果

关于c - 删除前未知删除节点的双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com