我需要制作一个具有(最多)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;
}
我的结构列表(列表元素的类型)包含一个 char 指针(称为文本)和一个指向列表下一个元素的指针。
模拟我的程序,假设我收到一条消息,需要将其放入链表中,链表的开始位置由指针 p[0] 指向。因此,我创建一个新元素(忘记列表为空的情况,我已经创建了这个元素)并使用我显示的函数添加到列表顶部。 现在,假设我收到另一条消息,需要将其放入下一个指针 p[1] 中。如果我打印 p[0] -> Text,我会得到 p[1]->Text 的文本。
我的意思是,如果我在 p[i] 指向的列表中添加一个新元素,则所有先前的 文本 p[i] -> Texts
都会获取该新元素的新文本。我不知道我做错了什么。
我不知道这是否足以帮助我,如果需要更多信息,请告诉我。
最佳答案
您的代码的问题是您没有维护节点列表。您一次又一次地覆盖同一个节点。
算法:
如果没有节点,则创建一个。
如果节点存在,则导航到结束节点。(您可以使用 tail 用于更快访问的指针)。
在末尾附加节点。
创建节点:
声明一个节点类型指针。
为其分配内存。
更新节点的内容。
将节点的next指针设置为null。
将此节点添加到列表末尾。
例如。将节点 3 插入节点 1 和节点 2 的列表中。
这是您可以使用的一般方法
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
关于c - 超过 1 个链表 - 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19338862/