为什么将节点添加到双向链表中会删除除第一个节点以外的所有节点?

时间:2016-08-05 19:13:30

标签: c linked-list doubly-linked-list

我使用双链表来保存c中的4个不同记录。

我在为双向链表创建空间时遇到了麻烦。当我尝试添加超过2个节点时,我丢失了除第一个节点以外的所有节点,并且我看到了第一个和最后一个节点的数据。我无法从第二个到最后一个看到节点。我尝试更改节点之间的链接,但它没有工作。这是我的代码;

struct node {
    char name[100];
    char surname[100];
    char roll[100];
    char department[100];
    struct node *next;
    struct node *prev;
};

struct node *first_oto = NULL, *last_oto = NULL, *l;

 void insert() {
     int i, counter = 1;

     first_oto = (struct node*)malloc(sizeof(struct node));
     first_oto->prev = NULL;
     first_oto->next = NULL;

     printf(" %d- Name:", counter);
     scanf("%s", first_oto->name);
     printf(" %d-Surname", counter);
     scanf("%s", first_oto->surname);
     printf(" %d-Number", counter);
     scanf("%s", first_oto->roll);
     printf(" %d-Department", counter);
     scanf("%s", first_oto->department);
     first_oto->next = NULL;

     for (i = 1; i < n; i++) {
         counter++;

         l = (struct node*)malloc(sizeof(struct node));

         printf(" %d-Name:", counter);
         scanf("%s", l->name);
         printf(" %d-Surname:", counter);
         scanf("%s", l->surname);
         printf(" %d-Number:", counter);
         scanf("%s", l->roll);
         printf(" %d-Department:", counter);
         scanf("%s", l->department);
         printf("\n");

         l->next = NULL;
         l->prev = first_oto;
         first_oto->next = l;
    }

在插入函数的第一部分中,我的代码记录了第一个节点。当我的程序运行for循环时,它需要其他节点,但只添加最终节点。我该怎么做才能解决它?

3 个答案:

答案 0 :(得分:0)

向列表添加元素的代码不完整。

    l->next=NULL;
    l->prev=first_oto;
    first_oto->next=l;
    /* There's another thing you need to do right here. */
}

答案 1 :(得分:0)

应该有一个临时变量来添加情况。

     struct node *temp;

在分配l->next=NULL之后的for循环中我们必须为temp添加一些代码粒子。我们将第一个元素保留为temp,并使用temp变量来不丢失数据。

在下面的代码中我们这样做。

    temp = (struct node*)malloc(sizeof(struct node));
    temp = first_oto;
    while(temp->next!=NULL){
        temp = temp->next;
    }
    temp->next = l;
    l->prev = temp;
    last_oto = l;

写完这一行后问题就解决了。

答案 2 :(得分:-1)

试试这个

void insert(void)
{
    struct node *new_node, *temp;
    char ans = 'y';
    int pos;
    do {
        traverse();
        printf("Enter the element :\n");
        new_node = (struct node*)malloc(sizeof(struct node));
        scanf("%d", &new_node->info);
        new_node->next = NULL;
        new_node->prev = NULL;
        if (start == NULL) {
            start = new_node;
            current = new_node; 
        } else {
            printf("Enter the position at which u wanna enter : (1-%d)\n", count + 1);
            scanf("%d", &pos);
            if (pos == 1) {
                start->prev = new_node;
                new_node->next = start;
                start = new_node;
            } else
            if (pos == count + 1) {
                current->next = new_node;
                new_node->prev = current;
                current = new_node;
            } else {
                int i = 0;  
                temp = start;
                while (i < pos - 2) {
                    temp = temp->next;
                    i++;
                }
                new_node->prev = temp;
                new_node->next = temp->next;
                temp->next = new_node;
            }
        }
        printf("Wanna enter more ??\n");
        scanf(" %c", &ans);
    } while (ans == 'y' || ans == 'Y');
}