двойной связанный список с c - PullRequest
0 голосов
/ 07 ноября 2018

хорошо, теперь я должен сделать двойной связанный список на c. Есть 7 функций, которые действуют на главную.

Append. InsertAt. deleteAt. Распечатать. print_revers. newnode. newDLL.

я могу изменить только 5 функций добавление, вставка, удаление, печать, печать, обратная печать

наконец я могу добавить, распечатать, распечатать Тем не менее, я не могу сделать insertAt, deleteAt, из-за индекса.

1. Я не могу понять, почему код

else {
    while (index-- >= 0) {
      temp = temp->next;
    }

заставляет память сталкиваться. для использования индекса мне нужно переместить узел, чтобы собрать позицию и подключиться к newnode. но это не работает ...

2. и что возвращается; роль? я не видел такой тип возврата.

3. как я могу сделать deleteAt используя index? я думаю deleteAt и insertAt имеют тихий подобный алгоритм. поэтому я пытаюсь сделать insertAt первым и deleteAt последним. но то, что я пишу, не работает хорошо.

Я могу найти много данных о doublelinkedlist в интернете. но я не могу найти с помощью индекса .... я слушал лекцию на языке только два месяца, так что извините за код spagettii ...

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

typedef struct Node {
    int val;
    struct Node *prev;
    struct Node *next;
} Node;

typedef struct {
    Node *head;
    int size;
} DLL;

Node *newnode(int n)
{
    Node *temp = (Node *)malloc(sizeof(Node));
    temp->val = n;
    temp->prev = NULL;
    temp->next = NULL;
    return temp;
}

DLL *newDLL() {
    DLL *temp = (DLL *)malloc(sizeof(DLL));
    temp->head = NULL;
    temp->size = 0;
    return temp;
}

void append(DLL *list, Node *newnode) {
    struct Node* temp = list->head;
    struct Node* newNode = newnode;
    if (list->head == NULL) {
        list->head = newNode;
        list->size++;
        return;
    }
    while (temp->next != NULL) {
        temp = temp->next;
    }
    list->size++;
    temp->next = newNode;
    newNode->prev = temp;
}

void insertAt(DLL *list, int index, Node *newnode) {

    struct Node* temp = (Node *)malloc(sizeof(Node));

    if (index < 0 || index >= list->size + 1) {
        printf("out of range\n");
    }
    else if (index == 0) {
        newnode->next = list->head;
        list->head->prev = newnode;
        list->head = newnode;
    }
    else {
        while (index-- >= 0) {
          temp = temp->next;
        }

    temp->val = newnode->val;
    temp->next = list->head->next;
    list->head->next = temp;
    temp->prev = list->head;

    if (temp->next != NULL)
        temp->next->prev = temp;
    }
}

void deleteAt(DLL *list, int index) {
    //save reference to first link

    struct Node* temp = (Node *)malloc(sizeof(Node));

    //if only one link
    if (list->head->next == NULL) {
        list->head->prev = NULL;
    }
    else {
        list->head->next->prev = NULL;
    }

    list->head = list->head->next;
    //return the deleted link
    return;
}

void print(DLL *list) {
    struct Node* temp = list->head;
    printf("Forward: ");
    while (temp != NULL) {
        printf("[%d] ", temp->val);
        temp = temp->next;
    }
    printf("\n");
}

void print_reverse(DLL *list) {
    struct Node* temp = list->head;
    if (temp == NULL) return; // empty list, exit
    // Going to last Node
    while (temp->next != NULL) {
        temp = temp->next;
    }
    // Traversing backward using prev pointer
    printf("Reverse: ");
    while (temp != NULL) {
        printf("[%d] ", temp->val);
        temp = temp->prev;
    }
    printf("\n");
}

int main() {
    DLL *list = newDLL();
    int i;
    for (i = 1; i < 6; i++) {
        append(list, newnode(i));
    }

    print(list);
    deleteAt(list, -1);
    deleteAt(list, 5);
    deleteAt(list, 0);
    print(list);
    deleteAt(list, 2);
    print(list);
    deleteAt(list, 2);
    print(list);
    insertAt(list, -1, newnode(6));
    insertAt(list, 3, newnode(6));
    insertAt(list, 0, newnode(7));
    print(list);
    insertAt(list, 1, newnode(8));
    print(list);
    insertAt(list, 4, newnode(9));
    print(list);
    print_reverse(list);

    return 0;
}

1 Ответ

0 голосов
/ 07 ноября 2018

Часть, в которую вы вставляете индекс, имеет проблемы:

temp = malloc неверно, должно начинаться с temp = head.

во вставке:

temp->val = newnode->val;
temp->next = list->head->next;
list->head->next = temp;
temp->prev = list->head;

temp->next не должно быть head->next, оно должно быть newnode. newnode->next должно быть temp->next и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...