链表写的程序中出问题了
程序中的读文件功能,出错了!请帮我看看吧!#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int data;//定义线性链表中的节点的数据成员
struct Node*next;//定义结构类型指针,指向下一个线性列表中的节点
}LNode;
void createList(LNode*head); //创建线性链表
int length(LNode*head); //计算生成的线性链表的数据个数,避免在插入的时候产生越界的现象
void displayList(LNode*head); //显示线性列表
void insertNode(LNode*head,int position,int number);//插入以及删除线性链表中的一个元素
void deleteNode(LNode*head,int position);// 删除线性链表中特定节点的函数
void sortList(LNode*head,int position); //对线性链表进行排序
void Exit(void);
void readFile(LNode*head); //读取指定文件中的数据
void writeFile(LNode*head); //将创建的线性链表中的数据值读入到指定文件中
#define LENGTH 70// 定义一个常量,输入的文件名的字符个数不可以超过该常量
int main(void)
{
int i=0,j,count,position,number;//用于控制整个程序的执行,退出与否
char ch;
int position2;// 删除节点时的节点位置
LNode*head;//创建一个空的线性链表
head=(LNode*)malloc(sizeof(LNode));//动态分配内存空间
head->next=NULL;
printf(" 首先,请创建线性链表。以便完成后面的对线性链表的操作:\n\n");//初始化线性链表并且显示
createList(head);
count=length(head);
printf(" 你刚刚输入的线性链表的数据个数为:%d\n\n",count);
printf("你刚输入的线性链表为:");
displayList(head);
while(i==0)
{
printf(" 请 输 入 数 字 选 择 你 要 进 行 的 操 作: \n\n");
printf(" 1:在线性表中插入一个元素。\n\n");
printf(" 2:在线性链表中删除一个指定的元素。\n\n");
printf(" 3:对这个已有的线性链表进行排序。\n\n");
printf(" 4:将指定的文件中的数据读入到线性链表中替代已经创建好的线性链表。\n\n");
printf(" 5:将线性链表中的数据输入到指定的文件中保存。\n\n");
printf(" 0:退出程序。\n\n");
printf(" 请 输 入 相 对 应 的 数 字 ,否 则 程 序 将 无 法 运 行!\n");
scanf("%d",&j);
if(j>5||j<0)
{
printf("对不起,你输入的数字没有对应的功能,请重新输入\n");
exit(0);
} //出错判断,提高程序的健壮性
switch(j)
{
case 1:
printf(" 请输入你要插入到线性链表中的数据的位置: ");
scanf("%d",&position);//输入要插入的数据的位置
if(position>=count)
{
printf("对不起,你输入的位置不可能将数据插入的线性链表中!\n");
exit(0);
}
else
{
printf(" 请输入你要插入的新节点的数值: ");
scanf("%d",&number);
insertNode(head,position,number);
}
printf(" 你插入新节点后的线性链表为: ");
displayList(head);
printf("\n\n请 问 你 还 要 继 续 对 线 性 链 表 进 行 操 作 吗?\n 是请输入Y或任意键,否请输入N! ");
if((ch=getchar())=='Y'){ printf(" 请输入数字继续对线性链表进行操作! ");}
if((ch=getchar())=='N')
{
exit(0);
}
break;
case 2:
printf(" 请输入你要删除的节点在线性链表中的位置: ");
scanf("%d",&position2);
if(position2>=count)
{
printf("对不起,你输入的位置不可能将数据插入的线性链表中!\n");
exit(0);
}
deleteNode(head,position2);
printf(" 你删除一个节点后的新线性链表为: ");
displayList(head);
printf("\n\n请 问 你 还 要 继 续 对 线 性 链 表 进 行 操 作 吗?\n 是请输入Y或任意键,否请输入N! ");
if((ch=getchar())=='Y'){ printf(" 请输入数字继续对线性链表进行操作! ");}
if((ch=getchar())=='N')
{
exit(0);
}
break;
case 3:
sortList(head,count);
printf(" 线性链表按照由小到大排序后的顺序为: ");
displayList(head);
printf("\n\n请 问 你 还 要 继 续 对 线 性 链 表 进 行 操 作 吗?\n\n 是请输入Y或任意键,否请输入N! \n\n ");
if((ch=getchar())=='Y'){ printf(" 请输入数字继续对线性链表进行操作! ");}
if((ch=getchar())=='N')
{
exit(0);
}
break;
case 4:
readFile(head);
printf(" 将指定文件中的数据创建的线性链表为: ");
displayList(head);
printf("\n\n请 问 你 还 要 继 续 对 线 性 链 表 进 行 操 作 吗?\n\n 是请输入Y或任意键,否请输入N! \n\n ");
if((ch=getchar())=='Y'){ printf(" 请输入数字继续对线性链表进行操作! ");}
if((ch=getchar())=='N')
{
exit(0);
}
break;
case 5:
writeFile(head);
printf("\n\n请 问 你 还 要 继 续 对 线 性 链 表 进 行 操 作 吗?\n\n 是请输入Y或任意键,否请输入N! \n\n ");
if((ch=getchar())=='Y'){ printf(" 请输入数字继续对线性链表进行操作! ");}
if((ch=getchar())=='N')
{
exit(0);
}
break;
case 0:
Exit();
break;
}
}
system("pause");
return 0;
}
void createList(LNode*head)//创建线性链表函数的实现
{
LNode*p,*rear=head; //定义一个新的节点类指针,方便对线性链表进行操作 //线性链表节点中的数据值
char ch; //用于将输入的字符转化为数字
printf(" 输入线性链表中的数据值,当输入Enter键时结束\n");
while((ch=getchar())!='\n')
{
p=(LNode*)malloc(sizeof(LNode));
p->data=ch-'0'; //新节点的数据值
p->next=NULL; //新节点位于表尾
rear->next=p; //新节点位于最后,则其为前表尾的后继
rear=p; //新节点为新的表尾,rear指向新的表尾
}
}
int length(LNode*head) //求线性链表的数据个数的函数的实现
{
int count=0;
LNode*p1=head;
while(p1->next!=NULL)
{
count++;
p1=p1->next;
}
return count;
}
void displayList(LNode*head)//显示线性链表函数的实现
{
LNode*p=head->next;
while(p!=NULL)
{
printf("%7d",p->data);
p=p->next;
}
printf("\n\n\n");
}
void insertNode(LNode*head,int position,int number)//在指定位置插入新数据的函数的实现
{
LNode*p1;//定义LNode类型指针,实现在线性链表指定位置上插入数据元素
LNode*p2=NULL;//定义一个LNode类型指针,实现插入节点
LNode*q=(LNode*)malloc(sizeof(LNode));
int position1=0;//记录位置,以便与需要数据插入的位置进行比较,便于在线性链表中插入新数据
p1=head;//将头指针赋给p1,对线性链表进行遍历
p2=p1->next;
while(position1<position)
{
p1=p1->next;
p2=p1->next;
position1++;
}
p1->next=q;
q->next=p2;
q->data=number;
}
void deleteNode(LNode*head,int position) //删除线性链表中一个节点的实现
{
LNode*p1,*p2;
int position1=0;// 用作下标,记录要删除的节点的位置
p1=head; //首先将指针p1指向头指针
p2=p1->next; //将指针p2指向下一个节点
while(position1<position)
{
p1=p2;
p2=p2->next;
position1++;
}
p1->next=p2->next;
}
void sortList(LNode*head,int position)
{
int i; //定义控制循环并且用于交换数据的变量
int temp=0; //用于排序时作为中间变量
LNode*p1,*p2;
p1=head->next; //开始时,让p1指向头指针中的next元素。因为表头中并没有数据
p2=p1->next; //p2指向线性链表中的下一个节点
for(i=1;i<position;i++)//
{
while((p2->next)!=NULL)
{
if((p1->data)>=(p2->data))
{
temp=p1->data;
p1->data=p2->data;
p2->data=temp;
}
p1=p2;
p2=p2->next;
}
if((p1->data)>=(p2->data))// 对当p2->next==NULL时,进行判断大小。否则线性链表中的最后一位无法进行排序
{
temp=p1->data;
p1->data=p2->data;
p2->data=temp;
}
p1=head;
p2=p1->next;
}
}
void Exit(void) //实现退出的函数
{
exit(0);
}
void readFile(LNode*head)
{
LNode*p1,*rear; //定义一个结构指针,方便对线性链表进行操作
FILE*fp1; //定义一个文件指针
char fileName[LENGTH];
int count3=0; //用于记录输入的文件名的字符长度
int data1; //用于记录从文件中输入的数据
rear=head; //线性链表的表头与表尾都指向头结点
printf(" 请输入你要读取的文本文件名: \n");
gets(fileName); //从键盘中获取文件名
while(fileName[count3]!='\0')
{
count3++;
}
if(count3>LENGTH) //判断长度,如果长度大于所允许的范围则退出
{
printf(" 对不起,输入的文件路径太长,无法访问!");
exit(0);
}
if((fp1=fopen(fileName,"rt"))==NULL)//打开文件失败,则退出操作
{
printf(" 打开文件%s失败!\n",fileName);
exit(0);
}
while(!feof(fp1))
{
p1=(LNode*)malloc(sizeof(LNode));
p1->data=fscanf(fp1,"%d",&data1);
p1->next=NULL;
rear->next=p1;
rear=p1;
}
fclose(fp1);
}
void writeFile(LNode*head)
{
FILE*fp2;
LNode*p2;
if((fp2=fopen("忆雪.txt","wt"))==NULL)
{
printf(" 对不起,文件打开失败!\n");
exit(0);
}
p2=head->next;
while(p2->next!=NULL)
{
fprintf(fp2,"%7d",p2->data);
p2=p2->next;
}
fprintf(fp2,"%7d",p2->data);//当循环结束时,线性链表中的最后一位并没有输入到指定文件中,所以加上此句。
fclose(fp2);
}