我有一些問題了解我的問題在我的程序中依賴的位置。我正在嘗試發送每個相應的雙向鏈接鏈表(垃圾列表和主列表)的頭節點,然後返回垃圾桶的新頭節點。C中的指針,導致段錯誤
我遇到的主要問題是,當我通過此函數將相應的節點添加到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;
}
}
}
}
'trashCurr = trashHead; (trashCurr!= NULL) trashCurr = trashCurr - > next; } trashCurr - > next = curr;':當while循環結束時,'trashCurr'爲'NULL'。 – BLUEPIXY
除了添加到垃圾清單之外,還需要重新配置主清單的鏈接。 – BLUEPIXY
在跳過那個剛剛添加到垃圾桶中的節點時正確嗎?如果是這樣,我只是沒有得到解決。只是試圖確保垃圾清單的執行是正確的 –