feature.cpp
#include"head.h"
/********************獲取文件名;讀取內容;給num,fp,head,flieopenname賦值;創建鏈表***********************/
//打開文件,並讀取文件
int read_file()
{
int i;
int fno,fsize;
if((fp=fopen("student_system.txt","rt"))==NULL)//判斷文件是否存在,若存在打開
{ //否則詢問是否繼續打開
printf("\n庫文件不存在!\n");
return 0;
}
rewind(fp); //使文件內部指針移動到文件的開始位置
fno=fileno(fp); //獲取文件描述字
fsize=filelength(fno); //計算文件大小,以字節爲單位
num=fsize/sizeof(Node); //計算文件包含的學生信息數目
iend=inew=(STUDENT *)malloc(sizeof(STUDENT));//申請動態空間
fread(inew,sizeof(Node),1,fp); //以Node(結構體)的空間大小讀數據
for(i=1;i<=num;i++) //利用for循環創建鏈表,並把數據儲存到其中
{
if(i==1) //第一個節點的創建
{
inew->next=head;
inew->last=NULL; //雙向鏈表
iend=inew;
head=inew;
}
else
{
inew->next=NULL;
inew->last=iend;
iend->next=inew;
iend =inew;
}
inew=(STUDENT *)malloc(sizeof(STUDENT));
fread(inew,sizeof(Node),1,fp);
}
free(inew);//釋放最後一個沒有儲存數據的節點
fclose(fp);//關閉文件
return num;
}
點擊鏈接加入羣聊【C/C++學習入門】:
/****************************輸入函數*******************/
STUDENT *pinput()
{
char ch;
if(num==0)//判斷是否是第一次錄入
{
iend=inew=(STUDENT *)malloc(sizeof(STUDENT));//申請空間
inputone(inew); //錄入信息
while(1)
{
num++;
if(num==1) //錄入第一個學生信息時,第一個節點的指針指向
{
inew->next=NULL;
inew->last=NULL;
iend =inew;
head =inew;
}
else //在第一個節點的存在下,進行其他節點的錄入
{
inew->next=NULL; //新建立節點next指向NULL
inew->last=iend; //新建立節點last指向上一個節點
iend->next=inew; //第一個next->下一個節點
iend =inew; //讓iend指向最後一個節點
}
inew=(STUDENT *)malloc(sizeof(STUDENT));
printf("信息輸入完畢,是否繼續?(是-Y 否-N):");
scanf("\n%c",&ch);
if(ch=='N'||ch=='n') break;//判斷是否跳出循環
inputone(inew);
}
free(inew); //釋放未存儲數據的節點
return head;
}
else//非第一次錄入時
{
while(1)//進行循環輸入,並進行判斷,是否跳出循環
{
inew=(STUDENT *)malloc(sizeof(STUDENT));
getch();
inputone(inew);
num++;
inew->next=NULL; //新建立節點next指向NULL
inew->last=iend; //新建立節點last指向上一個節點
iend->next=inew; //第一個next->下一個節點
iend =inew; //讓iend指向最後一個節點
printf("信息輸入完畢,是否繼續?(是-Y 否-N):");
scanf("\n%c",&ch);
if(ch=='N'||ch=='n')
break;
}
return head;
}
}
void inputone(STUDENT *temp)
{
printf("************************\n");
printf("請輸入學生的姓名:");
scanf("%s",inew->information.mname);
printf("請輸入學生的學號:");
scanf("%s",inew->information.schoolnum);
printf("請輸入學生的性別(男-M 女-F):");
scanf("%s",inew->information.sex);
printf("請輸入學生的年齡:");
scanf("%d",&inew->information.age);
printf("請輸入學生的家庭住址:");
scanf("%s",inew->information.address);
printf("請輸入學生的電話號碼:");
scanf("%s",inew->information.phone);
}
無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多幹貨和技術資料分享!學習裙【 玖四捌,玖伍四,四捌四 】
/****************************輸出函數*******************/
void displayone(STUDENT *temp) //爲簡化程序- 單個輸出函數,用於調用!
{
printf("**********************************\n");
printf("姓名:%s\n",temp->information.mname);
printf("學號:%s\n",temp->information.schoolnum);
printf("性別:%s\n",temp->information.sex);
printf("年齡:%d\n",temp->information.age);
printf("家庭住址:%s\n",temp->information.address);
printf("電話號碼:%s\n",temp->information.phone);
printf("===========================\n");
}
/**************************以head爲起始輸出鏈表******************************/
void pdisplay()//核心思想:對鏈表進行操作,然後利用while循環輸出
{
STUDENT *temp,*temp1;
int page=1,lastnum=num%PAGE,stu=0,i,page1;
char ch;
int choice;
if(head==NULL)//判斷文件中是否有數據
{
printf("文件中沒有數據!!\n");
getch();
return;
}
temp=head;
page1=num/PAGE+1;//進行頁數的初始化
if(lastnum==0)//判斷最後一頁的數據數
{
lastnum=PAGE;
page1=page1-1;
}
while(1)//保留最後節點的指針
{
if(temp->next==NULL)
{
temp1=temp;
break;
}
temp=temp->next;
}
temp=head;
rewind(fp);
loop: printf("----------------------------第%d頁-----------------------------\n",page);
while(temp!=NULL)//利用while 結構進行輸出 知道到最後節點
{
displayone(temp);
temp=temp->next;
stu++;
if(stu==PAGE)//一頁輸出完後進行選擇,對其鏈表進行操作
{
printf("4---首頁 <--上一頁--1 3--下一頁--> 尾頁---6 \n");
scanf("%d",&choice);
switch(choice)
{
case 1://上一頁,清屏 ,對其鏈表進行操作
for(i=1;i<=PAGE+stu;i++)
{
temp=temp->last;
if(temp==head)
{
temp=head;
page=1;
break;
}
}
if(temp!=head)
page--;
stu=0;
system("cls");
goto loop;
break;
case 4://第一頁,清屏 ,把head值賦給temp
system("cls");
temp=head;
stu=0;
page=1;
goto loop;
break;
case 6://最後一頁,清屏 ,對鏈表進行操作,找到相應鏈表值賦給temp
system("cls");
temp=temp1;
for(i=1;i<=lastnum-1;i++)
{
temp=temp->last;
if(temp==head)
{
temp=head;
page=1;
break;
}
}
if(temp!=head)
page=page1;
goto loop;
break;
case 3://下一頁,清屏 繼續輸出,
system("cls");
stu=0;
page++;
goto loop;
break;
}
stu=0;
}
}
if(temp==NULL)
{
printf("\n-------------已到尾頁,是否返回首頁?(是-Y 否-N):---------------");
scanf("\n%c",&ch);
if(toupper(ch)=='Y')
{
temp= head;
page=1;
stu=0;
system("cls");
goto loop;
}
}
getch();
}
/***************************加上提示語句*以head爲起始輸出鏈表**********************************/
void pdisplay_sort()
{ //提示語句,表示已經進行排序,然後調用輸出函數
printf("\n信息已經進行了排序,排序後信息如下:\n");
pdisplay();
}
關於怎麼快速學C/C++編程,有什麼方法,這個問題,想必大家都已經心中有數了,打算深入瞭解這個行業的朋友,可以加下小編的C/C++編程學習羣:948954484不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,包括小編自己整理的一份2018最新的C/C++資料和0基礎入門教程,歡迎初學和進階中的小夥伴。