| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 334 人关注过本帖
标题:c语言链表的创建出了问题
只看楼主 加入收藏
金帝
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-12-22
结帖率:0
收藏
已结贴  问题点数:10 回复次数:5 
c语言链表的创建出了问题
程序功能是 从已经创建好的一个文本文件里 (全数字 一行一个)  读取创建链表并排序。然后放到另外一个文件中  
这是我的写的程序但是不知道错在哪里了。想请大神们看下 。运行后没有程序结束的提示。应该是卡在创建链表时候的循环里了 所以想请大家看下。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//=======定义结构体====
typedef   struct  Node
{
    int   value;     //存放整数
    struct Node *pnext;  // 指向下一个节点的指针
}TagNode;


//================================
// 函数名: sort_list()
// 功能说明: 排序链表
// 参数:  TagNode*: 链表的头结点指针
// 返回值: void
//================================
void sort_list(TagNode*phead)
{
    TagNode *p2, *p1;
    int num;
    p2 = phead->pnext;
   

    // 检查链表是否为空
    if (p2 == NULL)
    {
        puts("链表为空!");
        return;
    }
    //// 选择排序
    while(p2->pnext != NULL)
    {
        p1 = p2->pnext;
        while(p1 != NULL)
        {
            if(p2->value > p1->value)
            {
                num = p2->value;
                p2->value = p1->value;
                p1->value = num;
            }
            p1 = p1->pnext;
        }
        p2 = p2->pnext;
    }
   
}


//================================
// 函数名: freeall()
// 功能说明: 排序链表
// 参数:  TagNode*: 链表的头结点指针
// 返回值: void
//================================
void freeall(TagNode*phead)
{
    TagNode*p1,*p2;
    p1=phead;
    while(p1!=NULL)
    {
        p2=p1;
        p1=p1->pnext;
        free(p2);
    }
}



//================================
// 函数名: display_list()
// 功能说明: 输出小孩链表
// 参数:  TagNode*: 链表的头结点指针
// 返回值: void
//================================
void display_list(TagNode*phead)
{
    TagNode* p;

    p = phead->pnext;  
   
    while(p != NULL)
    {
        printf("%4d", p->value);
        p = p->pnext;                            // p指向下一个结点
    }
    printf("\n");
}


int main()
{
    char ch,infile[40],outfile[40];
    FILE *in,*out;
    int num,c;
    TagNode* phead, *p1, *p2;
    printf("请输入想要打开的文件(即已编辑的整数文件):");
    scanf("%s",outfile);
    printf("请输入想要复制进的文件名:");
    scanf("%s",infile);
    out=fopen(outfile,"r");
    if(out==NULL)
    {
        printf("无法打开此文件");
        exit(0);
    }
    in=fopen(infile,"w");
    if(in==NULL)
    {
        printf("无法打开此文件");
        exit(0);
    }


    //创建链表

   

    // 分配头结点空间
    phead = (TagNode*)malloc(sizeof(TagNode));
    phead->pnext = NULL;
    p1= phead->pnext;
    p2 = phead;
    ch=fgetc(out);
    while(!feof(out));
    {
        putchar(ch);

        // 分配结点空间
        p1 = (TagNode*)malloc(sizeof(TagNode));
        p1->value = ch;
        p1->pnext = NULL;
        // 将p1结点加入到链表
        p2->pnext = p1;
        p2 = p1;
        // 输入下一个整数



        ch=fgetc(out);
    }
    display_list(phead);
    fclose(out);   //关闭输出文件
    //排序
    sort_list(phead);


    //写入
    p1=phead;
    p2=phead->pnext;
    ch=p2->value;
    while(p2!=NULL)
    {
        fputc(ch,in);
        p2=phead->pnext;
    }
    fclose(in);
    freeall(phead);
    return 0;
}
搜索更多相关主题的帖子: 文本文件 include 结构体 c语言 
2013-12-22 00:57
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:3 
你找“通用链表”,作者直接上代码的,而且讲解很细

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-12-23 08:04
so_love
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:7
帖 子:812
专家分:4151
注 册:2013-11-25
收藏
得分:3 
链表问题,,,。网上好多, 都很详细啊

一花一世界、一叶一追寻、片片花叶落、情系何人身。
2013-12-23 10:01
baiqtd123456
Rank: 2
等 级:论坛游民
帖 子:8
专家分:78
注 册:2013-11-22
收藏
得分:3 
while(!feof(out));后面多了个;
2013-12-23 16:10
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:3 
手贱了,改了不该改的,加了不该加的。。。 还是一只小菜鸟啊我。。。

先上程序了:

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//=======定义结构体====
typedef   struct  Node
{
    char value;         // 存放整数
    struct Node *pnext;  // 指向下一个节点的指针
}TagNode;


//================================
// 函数名: sort_list()
// 功能说明: 排序链表
// 参数:  TagNode*: 链表的头结点指针
// 返回值: void
//================================
void sort_list(TagNode*phead)
{
    TagNode *p2;
    TagNode *p1;
    char num;

    p2 = phead;    

    // 检查链表是否为空
    if (p2 == NULL)
    {
        puts("链表为空!\n");
        return ;
    }

    // 选择排序(由小到大排序)
    while (p2->pnext != NULL)
    {
        p1 = p2->pnext;
        while (p1 != NULL)
        {
            if (p2->value > p1->value)
            {
                num = p2->value;
                p2->value = p1->value;
                p1->value = num;
            }
            p1 = p1->pnext;
        }
        p2 = p2->pnext;
    }
    
    printf("\n链表已排序。\n");
}


//================================
// 函数名: freeall()
// 功能说明: 排序链表
// 参数:  TagNode*: 链表的头结点指针
// 返回值: void
//================================
void freeall(TagNode *phead)
{
    TagNode *p1;
    TagNode *p2;

    p1 = phead;

    while (p1 != NULL)
    {
        p2 = p1;
        p1 = p1->pnext;
        free(p2);
    }
}



//================================
// 函数名: display_list()
// 功能说明: 输出小孩链表
// 参数:  TagNode*: 链表的头结点指针
// 返回值: void
//================================
void display_list(TagNode*phead)
{
    TagNode *p;

    p = phead;  
    
    printf("\n现在链表情况是:\n");
    while (p != NULL)
    {
        printf("%-5c", p->value);
        p = p->pnext;                            // p指向下一个结点
    }
    printf("\n");
}


int main()
{
    char ch;
    char infile[20]="File1.txt";
    char outfile[20]="Flie2.txt";
    FILE *in;
    FILE *out;
    TagNode *phead;
    TagNode *p1;
    TagNode *p2;
    char i = '5';

    printf("请输入想要打开的文件(即已编辑的整数文件):\n");
    //scanf("%s", outfile);
    printf("请输入想要复制进的文件名:\n");
    //scanf("%s", infile);

    // 构造需要使用的文件。
    in = fopen(outfile,"w");                              
    if (in == NULL)
    {
        printf("无法打开此文件");
        exit(0);
    }
    for ( ; i != '0'; i--)
    {
        putc(i, in);
        putc(10 ,in);
        printf("%c已经存入。\n", i);
    }
    fclose(in);

    // 打开需要读取数据的文件。
    out = fopen(outfile, "r");
    if (out == NULL)
    {
        printf("无法打开此文件");
        exit(0);
    }
    printf("%s已经打开。\n", outfile);

    // 打开需要存入数据的文件。
    in = fopen(infile, "w");
    if (in == NULL)
    {
        printf("无法打开此文件");
        exit(0);
    }
    printf("%s已经打开。\n", infile);


    // 创建链表
    // 分配头结点空间
    phead = (TagNode*)malloc(sizeof (TagNode));
    phead->pnext = NULL;
    p1 = phead;
    p2 = phead;                                      //链表初始化需要用到p2(构建头结点时)
    while (!feof(out))
    {    
        // 只要能进行这一步,就说么有数据,需要加入新结点(开头已经构建了一个所以不并不一定开辟新空间)。
        ch = getc(out);                              
        printf("%-5c", ch);
        // 文件读入出问题,最后莫名多一个东西,只好判定一下。
        if ((ch < '0') || (ch > '9'))
        {
            break;
        }
        
        // 因为有确定数据,所以先加入新结点(这个结点得保证开辟空间了)。
        p1->pnext = p2; 
        // 在新开辟结点里存入数据。
        p2->value = ch;
        // 指定表尾。
        p2->pnext = NULL;
        p1 = p2;
        // 再次开辟新空间,这一次循环不加入链表,因为可能不存数据,那么这个结点就废了,哎,也是浪费了。
        p2 = (TagNode*)malloc(sizeof(TagNode));        

        getc(out);
    }
    putchar(10);
    printf("新链表已经建立。\n");

    // 输出小孩链表
    display_list(phead);
    // 关闭输出文件
    fclose(out);   
    // 排序
    sort_list(phead);
    // 输出小孩链表
    display_list(phead);
    
    // 写入
    printf("开始存储链表:\n");
    p1 = phead;   
    while (p1 != NULL)
    {
        ch = p1->value;
        putc(ch, in);
        putc(10, in);
        printf("%c已经写入。\n", ch);
        p1 = p1->pnext;
    }
    
    fclose(in);
    freeall(phead);
    return 0;
}

未知令人期待!
2013-12-23 16:10
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
这是发现的一些问题,还有我自己的问题。
如果谁能解答一下,感激不尽!!!

一、main函数里面
1.ch = fgetc(out)   放到了下面的while循环语句里面了

2.p1 = phead->pnext;
    p2 = phead;

这里,其实第一句没什么用,只用第二句了,呃,强迫症我改成了p1=head

3.      // 分配结点空间
        p1 = (TagNode*)malloc(sizeof(TagNode));
        p1->value = ch;
        p1->pnext = NULL;
        // 将p1结点加入到链表
        p2->pnext = p1;
        p2 = p1;
        // 输入下一个整数
        ch=fgetc(out);

这里,因为while循环语句之前有了一个空间的开辟,则本着资源不浪费的原则,
重新修改了一下。

        // 分配结点空间
        p1->value = ch;
        p2 = (TagNode*)malloc(sizeof(TagNode));        
        p2->pnext = NULL;
        // 将p1结点加入到链表
        p1->pnext = p2;
        p1 = p2;

和楼主的基本相似,不过最后一句删除了。

4.display_list函数
可能是主函数,楼主没有用第一个构造体存储空间p = phead->pnext;
因为上面已经作了修改,所以改为p = phead;

5.sort_list函数
p2 = phead->pnext改了,理由同上。

6.写入这部分,修改了。ch=p2->value;放入了循环体。
还有这一句p2 = phead->pnext; 应该是你程序出错的主要原因,
p2一直没有变化,无限循环,改为p2 = p2->pnext;

7.最后的freeall函数,我不是很清楚,好像没有任何作用的。
freeall是值传递,当然了传递的是一个地址,可以访问数据。
但是phead这个头指针的内容在主函数里面并没有变化。
当然了,经过freeall函数后,结构体里面的pnext指针内容被free了,
呃,还是我自己手贱的原因,因为phead指向的结构体被引用,那么
按照楼主的思路,在freeall函数后面加上一句free(phead)。

8.为了好调试,文件名在函数体内直接限定了。

9.嗯一个坑爹的地方,最后才发现。。。

 // 创建链表
    // 分配头结点空间
后面的while循环语句。。。   while (!feof(out));
不能有分号。。不然无限循环。。

10.while循环体里面最后加入一句getc(out); 用来取出数字后面的回车换行符。

11.根据你链表建立的情况,结构体里面value应该是char类型。
display_list也应该是char。

12.调试发现问题,呃,手贱的原因,上面的创建链表过程尾结点没有处理好,
重新构建while内部函数,在while前加上p2=phead;解释在程序里面。
奶奶的,,画蛇添足了。新手啊我。。

13.我的错误,最后的free(phead)不能有,不然程序错误。。
我不懂哎。。。知识匮乏。。谁知道为什么。


最后,很多格式我偷偷修改了一下。。

未知令人期待!
2013-12-23 16:12
快速回复:c语言链表的创建出了问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040046 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved