在我第一次迭代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;
}
}
}
}
答案 0 :(得分:0)
在addTrash中,这看起来很麻烦。您将其设置为NULL然后释放?不确定是什么成就。
temp = NULL;
free(temp);
trashCurr = NULL;
free(trashCurr);
此外,因为它是一个地址,你设置
trashCurr = trashHead;
如果你释放trashCurr,你也可以释放垃圾头然后返回垃圾头,你刚刚免费
也许我误解了它,但这很快就看出来了