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



我已经做了大约一天了,还没能把一系列节点放在链表的中间。总而言之,我要编写的程序接受一个字符串,另一个字符串和一个整数,并将第二个字符串放在由第一个字符串组成的链表中的整数位置。我尝试过很多策略,但它们都遇到了响应迟钝的程序和分割错误。我的代码如下:

#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%cn", 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%cn", 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("%sn", 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("%sn", inputString2);
    printf("Please input a valid index: ");
    scanf("%d", &index);
    while(index>strlen(inputString)||index<0)
    {
        printf("A valid index. ");
        scanf("%d", &index);
    }
    printf("%dn", index);
    insert(index, head, tail, inputString2);
    print(head);
    return 0;
}
如果有人能提供一种方法将第二个字符串作为元素插入到链表中,我将不胜感激。我已经确定它可以识别由整数指定的节点,但除此之外我不确定。提前谢谢。

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

你的代码仍然有很多问题,如果不简单地给你"答案",在这个论坛上可能是不可能帮助你的。你可以试试别的网站。

一些提示:

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

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不需要任何错位的空间,因为它被用来指向以前分配的空间。

还有一些错误(逻辑错误)更难以描述。

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

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

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

相关内容

  • 没有找到相关文章

最新更新