我的方法:
每个元素的固定长度(假设为20)数组是指向链表的第一个节点的指针。 所以我有20个不同的链表。
这是结构:
struct node{
char data[16];
struct node *next;
};
我对该数组的声明
struct node *nodesArr[20];
现在要将新节点添加到其中一个链接列表中,我这样做:
struct node *temp;
temp = nodesArr[i]; // i is declared and its less than 20
addNode(temp,word); // word is declared (char *word) and has a value ("hello")
addNode函数:
void addNode(struct node *q, char *d){
if(q == NULL)
q = malloc(sizeof(struct node));
else{
while(q->next != NULL)
q = q->next;
q->next = malloc(sizeof(struct node));
q = q->next;
}
q->data = d; // this must done using strncpy
q->next = NULL;
}
并打印链表数组中的数据,我这样做:
void print(){
int i;
struct node *temp;
for(i=0 ; i < 20; i++){
temp = nodesArr[i];
while(temp != NULL){
printf("%s\n",temp->data);
temp = temp->next;
}
}
}
现在编译器没有出错,程序运行并且我将数据传递给它,当我调用print时它不会打印任何东西,??
UPDATE ::
在我编辑代码(thx为你)后,我认为打印功能中的问题,任何想法?
答案 0 :(得分:5)
问题在于addNode()
。当列表为空时,您可以:
q = malloc(sizeof(struct node));
但q
的范围仅限于addNode()
。您应该已将addNode()
声明为
void addNode(struct node **q, char *d)
并相应调整您的代码:
*q = malloc(sizeof(struct node));
依旧......
答案 1 :(得分:3)
当您将struct node *q
传递给addNode
时,您将为其提供阵列中元素的地址。如果您在里面使用malloc
,那么您将覆盖此变量q
,该变量是函数的本地变量,现在指向不同的变量,但您没有更改原始数组。尝试使用指向节点(struct node **q
)的指针。
答案 2 :(得分:2)
void addNode(struct node *q, char *d){
if(q == NULL)
q = malloc(sizeof(struct node));
这是问题所在。
q
的新值永远不会离开函数,因此您的链接列表数组永远不会更新。
通常这里的解决方案是使用双指针:
void addNode(struct node **q, char *d){
if(*q == NULL)
*q = malloc(sizeof(struct node));
并称之为:
addNode(&nodesArr[i],word);
然后,如果您malloc
新节点,则数组中的值将设置为指向新节点。
答案 3 :(得分:-2)
struct node
{
int actual, estimated;
char c;
struct node *next;
} *head[4], *var[4], *trav[4];
void
insert_at_end (char c, int value, int value1)
{
struct node *temp;
temp = head[i];
var[i] = (struct node *) malloc (sizeof (struct node));
var[i]->actual = value;
//var1=(struct node *)malloc(sizeof(struct node));
var[i]->estimated = value1;
var[i]->c = c;
//printf("%d",var->estimated);
if (head[i] == NULL)
{
head[i] = var[i];
head[i]->next = NULL;
}
else
{
while (temp->next != NULL)
{
temp = temp->next;
}
var[i]->next = NULL;
temp->next = var[i];
}
}