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;
}