您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 求助指针链表的问题

求助指针链表的问题

来源:网络整理     时间:2016/7/17 2:12:09     关键词:

关于网友提出的“ 求助指针链表的问题”问题疑问,本网通过在网上对“ 求助指针链表的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 求助指针链表的问题
描述:

我用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

上一篇int&a+1-2 下一篇如何修改内置坐标啊~~

相关图片

相关文章