关于网友提出的“ 求助指针链表的问题”问题疑问,本网通过在网上对“ 求助指针链表的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 求助指针链表的问题
描述: 我用c写了链表,调了一晚上也调不出来,郁闷中。。。
代码如下:
struct kv
{
char *key;
char *val;
struct kv *next;
};
void set_cfg(struct kv **cfg)
{
FILE *fp;
struct kv *ps=NULL;
struct kv *pnew=NULL;
char c;
char *pc;
char buff[1024];
int i=-1,j=0;
fp=fopen("1.txt","r");
while((c=fgetc(fp))!=EOF)
{
if(c!=' ' && c!='\r' && c!='\n' && c!='\t')
{
i++;
buff[i]=c;
}
if((c==' ' || c=='\n') && buff[0]!='#' && i>=0)
{
pc=(char *)malloc((i+1)*sizeof(char));
if(c==' ')
{
pnew=(struct kv *)malloc(sizeof(struct kv));
pnew->key=NULL;
pnew->val=NULL;
pnew->next=NULL;/*3*/
}
if(c==' ')
{
pnew->key=pc;
}
else if(c=='\n')
{
pnew->val=pc;
}
for(;i>=0;i--)
{
pc[i]=buff[i];
}
if(*cfg==NULL)
{
*cfg=pnew;
ps=*cfg;
}
else
{
ps->next=pnew;
ps=pnew;
ps->next=NULL;/*1*/
}
}
if(c=='\n' || (c==' ' && buff[0]!='#') || i>1022)
{
i=-1;
memset(&buff,'\0',sizeof(buff));
}
}
fclose(fp);
ps=*cfg;
while(ps!=NULL)/*2*/
{
printf("%s = %s\n",ps->key,ps->val);
ps=ps->next;
}
}
int main(int argc, char *argv[])
{
struct kv *cfg=NULL;
set_cfg(&cfg);
return 0;
}
1.txt的内容是每行一个键和值,而键和值是用空格分开的。
问题1:不加ps->next=NULL;/*1*/输出while(ps!=NULL)/*2*/时最后一条会输出N次,
这个就不明白了,在pnew->next=NULL;/*3*/里已经赋过值了,为什么还要再赋一次??
问题2:输出来的结果不对
1.txt内容是这样的
uid y_oi@163.com
pass 123456
logintype 64
from y_oi@163.com
to y_oi@163.com
但输出来的是
uid y_oi@163.com
passfrom 123456
logintype 64to
from y_oi@163.com
to y_oi@163.com
解决方案1: 已经帮楼主修改过了,这个可以运行的,也给楼主添加了注释,楼主应该可以看懂的。。。。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct kv
{
char *key;
char *val;
struct kv *next;
};
void set_cfg(struct kv **cfg)
{
FILE *fp;
struct kv *ps=NULL;
struct kv *pnew=NULL;
char c;
char *pc;
char buff[1024];
int i=-1,j=0;
memset(&buff,'\0',sizeof(buff));
fp=fopen("1.txt","r");
while((c=fgetc(fp))!=EOF)
{
if(c!=' ' && c!='\r' && c!='\n' && c!='\t')
{
i++;
buff[i]=c;
}
if((c==' ' || c=='\n') && buff[0]!='#' && i>=0)
{
pc=(char *)malloc((i+1)*sizeof(char));
if(c==' ')
{
pnew=(struct kv *)malloc(sizeof(struct kv));
pnew->key=NULL;
pnew->val=NULL;
pnew->next=NULL;/*3*/
}
if(c==' ')
pnew->key=pc;
else if(c=='\n')
{
pnew->val=pc;
}
pc[i+1]='\0'; //这里需要加上字符串的结束符的
for(;i>=0;i--)
{
pc[i]=buff[i];
}
if(*cfg==NULL)
{
*cfg=pnew;
ps=*cfg;
}
else
{
ps->next=pnew; //这里已经把next指针的值改变了,pnew->next=NULL已经被改变了,所以后面要加上ps->next=NULL;这行代码
ps=pnew;
ps->next=NULL;// 这个如果不加上的话,这个链表的最后一个节点的next指针还是指向它自己,是个环,最后一个就会输出N次
}
}
if(c=='\n' || (c==' ' && buff[0]!='#') || i>1022)
{
i=-1;
memset(&buff,'\0',sizeof(buff));
}
}
fclose(fp);
ps=*cfg;
while(ps!=NULL)/*2*/
{
printf("%s %s\n",ps->key,ps->val);
ps=ps->next;
}
}
int main(int argc, char *argv[])
{
struct kv *cfg=NULL;
set_cfg(&cfg);
system("pause");
return 0;
}
解决方案2: 不多说了,下面是我写的一个简单的链表应用,里面有保存和读取,参考吧
http://blog.csdn.net/bdmh/archive/2011/01/02/6112631.aspx
以上介绍了“ 求助指针链表的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2735011.html