我有一个链表,我需要通过多个功能使用它。如果一个函数将插入数据,则一个函数将打印数据,另一个函数将搜索数据。以下是strcut
定义和链表的全局定义。
typedef struct node {
char *ipVal;
int ipVersion;
struct node * next;
} node_t;
node_t * head;
在int main ()
我为链接列表分配内存,然后将函数调用insert
和search
,如下所示,
int main()
{
head = malloc(sizeof(node_t));
insert_to_list(); //this will generate data and will pass it to a push function
print();
fetch_to_search(); //this will capture data from another source and parse those data to search linked list function
return 0;
}
insert_to_list()
如下,
void execScanNetowrk(){
//code to generate values
push(pIpVal, pIpVarsion);
}
fowling是push()
函数,
void push(char *pIpVal, int pIpVersion) {
node_t * current = head;
while (current->next != NULL) {
current = current->next;
}
/* now we can add a new variable */
current->next = malloc(sizeof(node_t));
current->next->ipVal = pIpVal;
current->next->ipVersion = pIpVersion;
current->next->next = NULL;
}
并执行包含以下代码的print()
函数,
void print_list() {
node_t * current = head;
printf("PRINT LIST\n");
while (current != NULL) {
printf("%s - %d\n", current->ipVal, current->ipVersion);
current = current->next;
}
}
问题1 - 推/打印
从这里问题是,如果我打印我得到的数据将产生类似于以下的输出,我无法弄清楚我们为什么。这里的问题是在开头获取null
值,如下所示,
(null) - 0
192.169.1.2 - 4
192.168.1.1 - 4
...
-------------------------------------------- ----------------------------------
以下fetch_to_search()
是搜索功能,它将搜索值解析为实际的链接列表搜索功能linked_list_search()
void fetch_to_search() {
//fetch data to search
linked_list_search(data);
}
void linked_list_search(char *searchIpVal) {
node_t * current = head;
printf("SEARCH LIST - %s\n", searchIpVal); // Program prints this line and terminates
while (current != NULL) {
if(strcmp(current->ipVal, searchIpVal)){
printf("FOUND %s - %d\n", current->ipVal, current->ipVersion);
}
else{
printf("NOT\n");
}
current = current->next;
}
}
问题2 - 搜索
问题在于,当我从上面的函数linked_list_search
再次搜索链接时,程序输出SEARCH LIST - %s
,其中%s是我的搜索值,程序终止。
这些非常令人困惑的问题让我待到深夜仍无法得到答案,我按照Google搜索中的大部分链接(https://www.google.com/search?client=ubuntu&channel=fs&q=search+linked+list+C&ie=utf-8&oe=utf-8#channel=fs&q=search+linked+list+c),但根本没有任何帮助。
我非常感谢您的专家帮助解决这个问题。非常感谢你:))
答案 0 :(得分:2)
您使用的技术不会在头节点上存储任何内容。它有好处和缺点。我喜欢使用链接列表和这个“虚拟”标题,因为编写一个函数来删除节点更容易,而不会丢失整个列表的引用。
令人遗憾的是,您使用的任何算法都必须以head-> next开头,而不是头部本身,而head本身不包含数据(只是列表的占位符)。
所以无论你把
放在哪里node_t * current = head;
替换为
node_t * current = head->next;