2015-12-21 71 views
1

我正在編寫一個程序,它創建一個雙向鏈接列表並從中刪除某個元素。除了列表僅由1個元素組成的部分以及當我嘗試刪除它時程序崩潰之外,一切都非常有效。有什麼建議麼?C:從雙向鏈表中只刪除一個節點

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

struct Node{ 
    int data; 
    struct Node* next; 
    struct Node* prev; 
}; 
struct Node* head; 
struct Node* tail; 

struct Node* CreateNewNode(int x){ 
    struct Node* newNode=(struct Node*)malloc(sizeof(struct Node)); 
    newNode->data=x; 
    newNode->next=NULL; 
    newNode->prev=NULL; 
    return newNode; 
} 

void InsertAtBegin(int x){ 
    struct Node* newNode=CreateNewNode(x); 
    if(head == NULL) { 
     head = newNode; 
     tail = newNode; 
     return; 
    } 
    head->prev = newNode; 
    newNode->next = head; 
    head = newNode; 
} 

void InsertAtEnd(int x){ 
    struct Node* newNode=CreateNewNode(x); 
    if(tail==NULL){ 
     head=newNode; 
     tail=newNode; 
     return; 
    } 
    tail->next=newNode; 
    newNode->prev=tail; 
    tail=newNode; 
} 

struct Node* PointTo(int k){ 
    struct Node* curr=head; 
    int i=1; 
    while(curr!=NULL && i<k){ 
     curr=curr->next; 
     i++; 
    } 
    return curr; 
} 

void DelFromList(int k){ 
    struct Node* temp; 
    temp=PointTo(k); 

    if(k==1){ 
     head=temp->next; 
     temp->next->prev=NULL; 
     free(temp); 
     return; 
    } 
    if(temp->next==NULL){ 
     temp->prev->next=NULL; 
     tail=temp->prev; 
     free(temp); 
     return; 
    } 
    if(temp->next==NULL && temp->prev==NULL){ 
     head=NULL; 
     tail=NULL; 
     printf("atpazista\n"); 
     free(temp); 
     return; 
    } 
    temp->next->prev=temp->prev; 
    temp->prev->next=temp->next; 
    free(temp); 
} 

void Print(){ 
    struct Node* temp = head; 
    if(head==NULL){ 
     printf("List empty\n"); 
     return; 
    } 
    printf("List: "); 
    while(temp != NULL) { 
     printf("%d ",temp->data); 
     temp = temp->next; 
    } 
    printf("\n"); 
} 

void Read(int *x){ 
    while(scanf("%d", x)==0){ 
     printf("NUMBERS ONLY\n"); 
     scanf("%s"); 
    } 
} 

void Free(){ 
    struct Node* temp=head; 
    while(temp->next!=NULL){ 
     temp=temp->next; 
     free(temp->prev); 
    } 
} 

int main() 
{ 
    int n=0, x; 
    printf("Number of elements?\n"); 
    while(n<=0){ 
     Read(&n); 
    } 
    int i; 
    for(i=0; i<n; i++){ 
     printf("Type a number\n"); 
     Read(&x); 
     InsertAtEnd(x); 
    } 
    Print(); 
    printf("Head: %d\n", head->data); 
    printf("Tail: %d\n", tail->data); 


    printf("Number of element to be deleted?\n"); 
    n=0; 
    while(n<=0){ 
     Read(&n); 
    } 
    DelFromList(n); 


    Print(); 
    printf("Head: %d\n", head->data); 
    printf("Tail: %d\n", tail->data); 

    Free(); 


    return 0; 
} 

回答

2

也許交換的順序:

if(temp->next==NULL){ 
    temp->prev->next=NULL; 
    tail=temp->prev; 
    free(temp); 
    return; 
} 
if(temp->next==NULL && temp->prev==NULL){ 
    head=NULL; 
    tail=NULL; 
    printf("atpazista\n"); 
    free(temp); 
    return; 
} 

後者的代碼永遠不會執行,因爲第一種情況已經做了,並返回

+0

哇..這很簡單。謝謝!!! – Aivaras