带c的双链表

时间:2018-11-07 03:22:49

标签: c list

好的,现在我必须在c上创建双链表。 在main上起作用的功能有7种。

附加。 insertAt。 deleteAt。 打印。 print_revers。 新节点。 newDLL。

我只能修改5个功能 追加,插入,删除,打印,打印反向

最后我可以进行append,print,print_reverse 但是,由于索引,我无法进行insertAt,deleteAt。

1。。我不明白为什么输入代码

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

使内存冲突。为了使用索引,我需要移动节点以收集位置并连接到newnode。但这不起作用...

2。也是返回的内容;的角色?我还没有看到这种回报。

3。。如何使用index进行deleteAt?我认为deleteAt和insertAt具有安静的类似植物学。所以我尝试使insertAt首先和deleteAt最后。但是我写的东西效果不佳..

我可以在Internet上找到很多doublelinkedlist数据。但是我找不到使用索引的方法。...我只听了两个月的C语言讲座,所以对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 :(得分:1)

您在索引处插入的部分有问题:

Rcpp::NumericVector是错误的,应该以{{1​​}}开头。

插入中:

temp = malloc

temp = head不应为temp->val = newnode->val; temp->next = list->head->next; list->head->next = temp; temp->prev = list->head; ,而应为temp->nexthead->next应该是newnode等。