C语言 链表函数在第一个节点而不是路径中打印 NULL



>我正在编写一个程序来读取可能的 -v 标志、数字键和路径以从命令行放入链表中。我的所有内容都打印正确,除了第一个节点总是打印 NULL 这让我的测试用例失败。我已经尝试了许多不同的语法和方法来编写_add函数和_dump函数,但我不能完全弄清楚。这是主要程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cplist.h"
int main(int argc, char* argv[]){
int i, j;
char *key;
cplist *head = (cplist*) malloc(sizeof(cplist));
if(strcmp(argv[1], "-v") == 0){
key = argv[2];
for(i = 3; i <= argc; i++){
cpl_add(head, argv[i]);
j++;
}
} else {
key = argv[1];
for(i = 2; i <= argc; i++){
cpl_add(head, argv[i]);
j++;
}
}
printf("key: %sn", key);
printf("paths parsed: %dn", j);
cpl_dump(head);
return(0);
}

这是我的列表类:

#include <sys/time.h>
#include "cplist.h"
#include <stdio.h>
#include <stdlib.h>
cplist *cpl_add(cplist *head, char *path){
cplist *current = head;
head->path = path;
while(current->next != NULL){
current = current->next;
}
current->next = (cplist*) malloc(sizeof(cplist));
current->next->path = path;
current->next->next = NULL;
}
void cpl_dump(cplist *head){
cplist *current = head;
head = head->next; 
while(current->next != NULL){
printf("%s n", current->path);
current = current->next;
}
}

这就是我要输出的内容,例如:./a.out -v 1455/tmp//tmp2//tmp3/

key: 1455
paths parsed: 4
(null)
/tmp/
/tmp2/
/tmp3/

解析的路径应该是 3 并且 (null( 不应该打印,但我无法通过试验找到任何解决方案

这里有几个问题。

首先,不要设置头节点的初始值。 首次尝试添加新节点时,head->next的值是不确定的。 您应该初始化其字段:

cplist *head = (cplist*) malloc(sizeof(cplist));
head->path = NULL;
head->next = NULL;

在递增之前,您也不j初始化它。 将其初始化为 0。

当您阅读参数时:

for(i = 3; i <= argc; i++){

你读得太多了。 将<=更改为<

然后在您的打印功能中:

void cpl_dump(cplist *head){
cplist *current = head;
head = head->next; 
while(current->next != NULL){
printf("%s n", current->path);
current = current->next;
}
}

您从head开始current并从那里计数,因此打印的第一个值是虚拟头节点中的值。 大概下一行应该解决这个问题,但你设置了错误的指针。 相反,您希望:

cplist *current = head->next;

最后,该条件会阻止您读取列表中最后一个节点的内容。 相反,您希望:

while(current != NULL){

相关内容

  • 没有找到相关文章

最新更新