为什么我的指针一开始就跑了??!!!
#include<stdio.h>#include<string.h>
#include<malloc.h>
#include <stdlib.h>
#include<conio.h>
#define LEN sizeof(STUDENT1) //链表节点长度字节数为LEN
#define NUM 30
//用以建立学生成绩链表节点时使用的结构体类型声明
typedef struct student1
{
char name[20]; //用于存储学生姓名
float cprogram ; //用于存储C语言课程成绩
struct student1 *next; //链表指针
}STUDENT1;
//用以排序时使用的结构体类型声明
typedef struct student2
{
char name[20]; //用于存储学生姓名
float cprogram ;//用于存储C语言课程成绩
}STUDENT2;
/*链表操作所用结构体指针,为全局变量指针*/
STUDENT1 *head=NULL,*p1=NULL,*p2=NULL,*p3=NULL,*p4=NULL; //定义结构体指针head 为头指针;p1、p2、P3为建立、查找、增加、删除、修改节点数据时使用的指针
STUDENT2 stu[NUM];
STUDENT2 stud;//数组个数最大30,用于排序使用
int len=0; //记录链表中节点的实际个数,也是最大的顺序号
int flag=0,sxh;
char name1[20]; //标志变量,表示是否已建立过成绩链表,flag=0,为未建立过成绩链表;
//若已建立,则不能再次建立成绩链表,但可以增加、删除节点数据
/**被调用函数集中声明;***/
//如:int create();
int menu_select();
void create();
//程序主入口
/***********************************主函数************************/
int main(void)
{
int menuchoice;
do{
menuchoice=menu_select();
switch(menuchoice) //根据菜单项的选择进行相应的操作
{
case 1:
//调用create函数
if(flag==1)
printf("数据已经建立!");
else
{
printf("请输入该班学生个数:\n");
scanf("%d",&len);
if(len>=1 && len<=30)
create();
else
printf("输入的个数过大!!\n");
}
system("pause");
break;
default:
printf("\n对不起,您输入的功能编号有错!请重新输入!!!\n");
system("pause");
break;
}
}while(1);
}
//以下为各功能函数
/**************************主菜单*********************************
*函 数 名:menu_select
*描 述:显示操作主菜单
*入口参数:无
*出口参数:int型选项值
******************************************************************/
int menu_select()
{
int menuchoice=-1;
system("cls");/*清屏*/
printf("\n\n\n\n");
printf("\t\t\t 学生成绩管理基本功能菜单 \n");
printf("\t\t\t 作者:*** \n");
printf("\t\t\t ======================= \n");
printf("\t\t\t 1.新建学生记录 \n");
printf("\t\t\t 2.显示学生记录 \n");
printf("\t\t\t 3.按给定姓名查找 \n");
printf("\t\t\t 4.按顺序号查找 \n");
printf("\t\t\t 5.从高到低排序输出 \n");
printf("\t\t\t 6.从低到高排序输出 \n");
printf("\t\t\t 7.给定顺序号插入成绩 \n");
printf("\t\t\t 8.给定顺序号删除成绩 \n");
printf("\t\t\t 9.给定顺序号修改成绩 \n");
printf("\t\t\t 10.显示高于平均分的学生 \n");
printf("\t\t\t 11.结束程序 \n");
printf("\t\t\t ======================= \n");
printf("\t\t\t请输入您的选择: \n");
scanf("%d",&menuchoice);
return menuchoice;
}
//以下为各功能函数
/*******************************************************************
*函 数 名:create
*描 述:从键盘输入学生的个数,然后逐个输入学生的姓名和成绩,将其保存在链表中
*入口参数:全局链表指针 head,p1L,p2,p3
*出口参数:如果创建成功返回在链表中实际输入的学生的个数len,创建失败返回0;
******************************************************************/
void create()
{
//可以设计成从文件读入指定节点个数的学生信息至链表中,也可以设计成从键盘输入学生信息
FILE*fp;
int n=0;
if((fp=fopen("d:\\test1.txt","r"))==NULL) /*打开文件*/
{
printf("文件不存在或无法打开!\n");
exit(0);
}
head=p1=(struct student1 *)malloc(LEN);
p1->next =NULL;
while(!feof(fp))
{
n++;
fscanf(fp,"%s%f", p1->name,&p1->cprogram);
p2=(struct student1 *)malloc(LEN); /*开辟一个新单元*/
p1->next =p2;
p3=p1;
p1=p2;
p1->next =NULL;
if(n>len)
break;
}
free(p2);
p3->next=NULL;
printf("\n %d项信息输入完毕,按任意键返回......\n",n-1);
flag=1; /*设置保存记录标志*/
if( fclose(fp) ) /* 关闭文件 */
{
printf( "Can not close the file!\n" );
exit(0);
}
}