从双向链表中的点创建多个元素

时间:2014-05-29 14:59:39

标签: list insert linked-list element

我已经在这方面工作了大约一天,并且无法在链表中间放置一系列节点。总而言之,我正在尝试编写的程序接受一个字符串,另一个字符串和一个整数,并将第二个字符串放在由第一个字符串组成的链表中的整数位置。我已经尝试了很多策略,但他们都遇到了无响应的程序和分段错误。我的代码如下:

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

typedef struct node
{
    int number;
    char j;
    struct node* next;
    struct node* prev;
}node_t;

void print(node_t *head)
{
    node_t *curr = head;
    while(curr)
    {
        printf("\n%d%c\n", curr->number, curr->j);
        curr = curr->next;
    }
}

void insert(int index, node_t *head, node_t *tail, char* string)
{
    node_t *curr = head;
    node_t *newNode = (node_t*)malloc(sizeof(node_t));;
    node_t *newPrev = (node_t*)malloc(sizeof(node_t));;
    node_t *newNext = (node_t*)malloc(sizeof(node_t));;
    int i;

    while(curr->number!=index)
    {
        curr = curr->next;
    }
    //printf("\n%d%c\n", curr->number, curr->j);

    newNode->prev = curr;
    newNode->next = curr->next;
    newNext = curr->next;
    curr->next = newNode;
    curr = curr->next;

    for(i=0; i<strlen(string); i++)
    {
        curr=(node_t*)malloc(sizeof(node_t));
        curr->number = i;
        curr->j = string[i];

        curr->prev = tail;
        tail->next = curr;
        tail = curr;
    }

    newNext->prev = curr;
}

int main()
{
    node_t *curr,*head,*tail;

    head=NULL;
    tail=NULL;
    int i;
    int index = 0;
    char* inputString = (char*)malloc(sizeof(char)+1);
    char* inputString2 = (char*)malloc(sizeof(char)+1);

    printf("Please input a string: ");

    gets(inputString);
    printf("%s\n", inputString);

    for(i=0; i<strlen(inputString); i++)
    {
        curr=(node_t*)malloc(sizeof(node_t));
        curr->number = i;
        curr->j = inputString[i];
        curr->next = NULL;
        if(tail)
        {
            curr->prev = tail;
            tail->next = curr;
        }
        tail=curr;
        if(!head)
        {   
            head=curr;
        }
    }

    printf("Please input a string: ");

    gets(inputString2);
    printf("%s\n", inputString2);

    printf("Please input a valid index: ");

    scanf("%d", &index);
    while(index>strlen(inputString)||index<0)
    {
        printf("A valid index. ");
        scanf("%d", &index);
    }
    printf("%d\n", index);

    insert(index, head, tail, inputString2);

    print(head);

    return 0;
}

如果有人能提供将第二个字符串作为元素插入链接列表的方法,我将永远感激不尽。我已经确定它可以识别整数指定的节点,但除此之外我不确定。提前谢谢。

编辑:现在我的问题是该程序将垃圾节点放在正确的位置,但随后在列表的末尾创建节点。

1 个答案:

答案 0 :(得分:0)

您的代码仍有很多问题,如果不给您“答案”,可能无法在此论坛中为您提供帮助。您可以尝试使用其他网站。

一些提示:

由于可以在插入函数中修改头部和/或尾部,因此需要传入它们的地址,而不仅仅是它们的值。即,

void func(node_t **head) {
    // dereference head (with *) to use it
    *head = malloc(sizeof(node_t));
}

void another_func() {
    node_t *head = NULL;
    func(&head);    // pass the address of head
}

newPrev未使用(您是否使用正确的警告级别编译?使用gcc,添加-Wall标志)。

newNext不需要任何malloced空间,因为它用于指向先前分配的空间。

还有其他错误(逻辑错误)更难以描述。

我的建议是重写它。声明另一个名为list的结构来保存head和tail指针。编写一个名为make_node的函数来创建和初始化给定字符的新节点(如果您认为有必要,则创建一个数字)。编写一个名为make_list的函数,它接受一个字符串并返回其字符列表。在insert函数中,使用make_list从要插入的字符串中创建一个列表,然后修改指针以将其插入到第一个列表中。

在节点中存储索引号是不必要的,并且实际上使事情变得复杂,因为为了保持它们的顺序,您需要在插入后更新原始列表中的索引。您可以简单地计算您已经循环的节点数,以了解节点的索引。

在您的问题中添加C语言标记可能会让其他人帮助您。