0

我需要制作一个(最多)有 50 个链表的程序。基本上,我的程序会生成一些消息,并且基于字符串前面的指示符,我需要将消息放在正确的链表中。

我不知道它是否足够清楚,但我会尝试展示我的部分代码(重要部分)。我为链表添加​​一个新元素(在顶部)的函数如下:

void InsertLL (News p, char M[]) {
    char * text = malloc(strlen(M)+1);
    strcpy(text, M);
    News s,t;
    t = malloc(sizeof(struct List));
    t-> Text = text;
    s = p;
    p = t;
    p-> next = s;
 }

我的结构列表(我的列表元素的类型)包含一个字符指针(称为文本)和一个指向列表下一个元素的指针。

模拟我的程序,假设我收到一条消息,需要将其放入指针 p[0] 指向的链表中。所以我创建了一个新元素(忘记列表为空的情况,我已经做了这个)并使用我展示的函数添加到我的列表顶部。现在,假设我收到了另一个需要放入下一个指针 p[1] 的消息。如果我打印 p[0] -> Text,我会得到 p[1]->Text 的文本。

我的意思是,如果我在 p[i] 指向的列表中添加一个新元素,那么之前的所有texts p[i] -> Texts元素都会获得这个新元素的新文本​​。我不知道我做错了什么。

我不知道这是否足以帮助我,如果需要更多信息,请告诉我。

4

1 回答 1

1

您的代码的问题是您没有维护节点列表。您一次又一次地覆盖同一个节点。

算法:

  1. 如果没有节点,则创建一个。

  2. 如果存在节点,则导航到结束节点。(您可以使用尾指针更快地访问)。

  3. 在末尾追加节点。

创建节点:

  • 声明一个节点类型指针。

  • 给它分配内存。

  • 更新节点的内容。

  • 将节点的下一个指针设置为空。

  • 将此节点添加到列表的末尾。

前任。在节点 1 和节点 2 的列表中插入节点 3。

链接列表演示

这是您可以使用的一般方法

typedef struct node{
    int val;   //you can use your text here
    struct node* next;
    }NODE;

struct node* head=0;

int addNode(int v){
    if(head==0){                              //checking for empty node.
        struct node* n=malloc(sizeof(NODE));
        n->val=v;
        head=n;
    }
    else{
        struct node* temp=head;
        while(temp->next != 0)    //Navigating till end
        {
            temp=temp->next;
        }
        struct node* n=malloc(sizeof(NODE)); //allocating memory
        n->val=v;            //you need to use strcpy for string here.                         
        temp->next=n;       //adjusting pointers
        n->next=0;
    }
}

您可以查看我为双链表创建的这个演示http://ideone.com/s6TtUX

于 2013-10-12T20:34:08.493 回答