2017-03-15 3 views
0

試験のために勉強するために二重リンクリストを実装しようとしています。 - リストの先頭に挿入するだけで、正しく印刷されます。しかし、リストの末尾に挿入すると、最後のテールアイテムだけが出力されます。以下は私のフルコードです:二重リンクリストの先頭と末尾に挿入 - 最後のテールアイテムのみを出力します

/* 
    - Q2: Write a function that takes a LinkedList struct pointer and inserts at the head of the linked list. 

    - Q3. Write a function that takes a LinkedList struct pointer and frees all memory associated with it. (
      For a solution, see fancy-linked-lists.c, attached above.) 

    - Q4 Review all the functions from today's code and give their big-oh runtimes. 

    - Q5: Implement functions for doubly linked lists: 
     - tail_insert(), 
     - head_insert(), 
     - tail_delete(), 
     - head_delete(), 
     - delete_Nth(). 
     - Repeat these exercises with doubly linked lists in which you maintain a tail pointer. 
     - How does the tail pointer affect the runtimes of these functions? 
     - Are any of these functions more efficient for doubly linked lists with tail pointers than they are for singly linked lists with tail pointers? 
*/ 

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

typedef struct node 
{ 
    int data; 
    struct node *next; 
    struct node *prev; 
} node; 

node *createNode(int data) 
{ 
    node *ptr = NULL; 
    ptr = malloc(sizeof(node)); 
    if(ptr == NULL) 
    { 
     printf("space could not be allocated\n"); 
     return NULL; 
    } 

    ptr->data = data; 
    ptr->next = NULL; 
    ptr->prev = NULL; 

    return ptr; 
} 

node *tailInsert(node *head, int data) 
{ 
     if(head->next == NULL) 
    { 
     node *temp; 
     temp = createNode(data); 
     temp->next = NULL; 
     temp->prev = head; 
     head->next = temp; 
     return head; 
    } 
    tailInsert(head->next, data); 
} 

node *frontInsert(node *head, int data) 
{ 
    node *newHead; 

    if(head == NULL) 
    { 
     return createNode(data); 
    } 

    newHead = createNode(data); 
    newHead->next = head; 
    newHead->prev = NULL; 

    return newHead; 
} 

node *destroy_linked_list(node *list) 
{ 
    /*if (list == NULL) 
     return NULL; 

    // Free the entire list within this struct. 
    destroy_list(list->head); 

    // Free the struct itself. 
    free(list); 

    return NULL; 
    */ 
} 

void printList(node *head) 
{ 
    if (head == NULL) 
    { 
     printf("Empty List\n"); 
     return; 
    } 

    for(; head != NULL; head = head->next) 
     printf("%d ", head->data); 

    printf("\n"); 
} 

int main(void) 
{ 
    node *head = NULL; 

    head = frontInsert(head, 1); 
    head = frontInsert(head, 2); 
    head = frontInsert(head, 3); 
    head = tailInsert(head, 4); 
    head = tailInsert(head, 5); 
    head = tailInsert(head, 6); 

    printList(head); 

    system("PAUSE"); 
    return 0; 
} 

私は助けてくれてありがとう!

+0

tailInsert関数を呼び出している場合は、一時(最後のノード)を返すと '次tailInsert(頭部>を返すtailInsert機能 – Karthick

+0

に頭に割り当てる頭には何も割り当てませんデータ); ' - >' tailInsert(head-> next、data); return head; 'または' node * tailInsert(node * head、int data) ' - >' tailInsert(node * head、int data) ' – BLUEPIXY

+0

' frontInsert'は 'head-> prev = newHead;'が必要です – BLUEPIXY

答えて

1

tailInsertからtemp(最終ノード)を返し、headに割り当てます。末尾に挿入する場合は、ヘッドポインタを変更しないでください。メインで

void tailInsert(node *head, int data) 
{ 
    if(head->next == NULL) 
    { 
     node *temp; 
     temp = createNode(data); 
     temp->next = NULL; 
     temp->prev = head; 
     head->next = temp; 
     return ; 
    } 
    tailInsert(head->next, data); 
} 

、あなたが

+0

頭を返すようにそれを更新しましたが、最後の2つの値だけを出力します。私は混乱しています。なぜなら、コードは以前のノードへのポインタとは全く別のもので、完全にうまく働いた単独のリンクリストにはありません。 – starlight

+0

再帰を使用しました。最後の再帰呼び出し中のヘッドノードはテールノードになります。 – Karthick

+0

ありがとうございます!今、私は分かる。 – starlight

関連する問題