#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Telephone{
char number[20];
char name[20];
char sex[20];
char age[20];
char speciaity[20];
char Class[20];
struct Telephone *next;
};
typedef struct Telephone TEL;
TEL *head=NULL;
void showmenu(); //選單
void Appenditem(); //添加學生資訊
void print(); //瀏覽所有學生資訊
void Finditem1(); //查找學生資訊 (按學號)
void Finditem2(); //查找學生資訊 (按姓名)
void Removeitem(); //洗掉學生資訊
void Saveandfree(); //保存到檔案
void Open(); //打開檔案
void main()
{
char ch;
Open(); //打開檔案
while(1) {
showmenu(); //顯示選單
scanf(" %c",&ch);
switch(ch) {
case '1':
Appenditem(); //添加學生資訊
break;
case '2':
print(); //瀏覽所有學生資訊
break;
case '3':
Finditem1(); //查找學生資訊1.按學號
break;
case '4':
Finditem2(); //查找學生資訊2.按姓名
break;
case '5':
Removeitem(); //洗掉學生資訊資訊
print(); //輸出洗掉后的結果
break;
case '0':
Saveandfree(); //保存并釋放記憶體
exit(0); //退出系統
break;
default:
printf("選擇錯誤!");
break;
}
}
}
//選單
void showmenu()
{
printf("\n*****************歡迎使用學生資訊管理系統*****************\n");
printf("\n*****************根據主選單提示選擇所想要的操作*****************\n");
printf("\t1.添加學生資訊\n");
printf("\t2.瀏覽所有學生資訊\n");
printf("\t3.按學號查詢學生資訊\n");
printf("\t4.按姓名查詢學生資訊\n");
printf("\t5.洗掉學生資訊\n");
printf("\t0.保存并退出系統!\n"); printf("*************************************************\n");
printf("\t請選擇:\n");
}
//添加學生資訊
void Appenditem()
{
TEL *p1=NULL,*p2=NULL;
p1=(TEL *)malloc(sizeof(TEL)); //申請結點
printf("輸入學號:\n"); //添加資訊
scanf("%s",p1->number);
printf("輸入姓名:\n");
scanf("%s",p1->name);
printf("輸入性別:\n");
canf("%s",p1->sex);
printf("輸入年齡:\n");
scanf("%s",p1->age);
printf("輸入專業:\n");
scanf("%s",p1->speciaity);
printf("輸入班級:\n");
scanf("%s",p1->Class);
p1->next=NULL; //保存到鏈表
if(head==NULL) {
head=(TEL *)malloc(sizeof(TEL)); //申請空間
head->next=p1;
} else {
for(p2=head;p2->next!=NULL;p2=p2->next); //找到結點尾
p2->next=p1;
}
printf("此資訊已添加!");
}
//瀏覽所有學生資訊
void print()
{
TEL *p=NULL;
if(head==NULL) {
printf("此學生資訊管理系統中無記錄,請輸入記錄后在使用本功能!\n");
return;
}
printf("**************學生資訊管理系統*********************\n"); //輸出資訊
printf("學號\t姓名\t性別\t年齡\t專業\t班級\n");
for(p=head->next;p!=NULL;p=p->next)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);
}
//查找學生資訊1.按學號
void Finditem1()
{
TEL *p;
char findname[20];
printf("請輸入要查找的學號:\n");
scanf("%s",findname);
printf("**************學生資訊管理系統*********************\n");
printf("學號\t姓名\t性別\t年齡\t專業\t班級\n");
for(p=head->next;p!=NULL;p=p->next) {
if(strcmp(p->number,findname)==0)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);
}
}
//查找學生資訊2.按姓名
void Finditem2()
{
TEL *p;
char name[20];
printf("請輸入要查找的姓名:\n");
scanf("%s",name);
printf("**************學生資訊管理系統*********************\n");
printf("學號\t姓名\t性別\t年齡\t專業\t班級\n");
for(p=head->next;p!=NULL;p=p->next) {
if(strcmp(p->name,name)==0)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);
}
}
//洗掉學生的資訊
void Removeitem()
{
char findname[20]; //先查找 后洗掉
TEL *p = head->next, *pr = head->next;
printf("請輸入要洗掉的學號:\n");
scanf(" %s",&findname);
if (head->next == NULL) {
printf("無此節點!\n");
return;
}
while ((strcmp(p->name,findname)!=0 )&& p->next != NULL) {
pr =p;
p =p->next;
}
if (strcmp(findname, p->name)==0) //輸出洗掉資訊
{
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->next->number,p->next->name,\
p->next->sex,p->next->age,p->speciaity,p->Class);
if (p == head->next)
head->next = p->next;
else
pr->next = p->next;
free(p);
}
printf("此資訊已洗掉!");
}
//保存鏈表資訊到檔案并釋放記憶體空間
void Saveandfree()
{
TEL *p=NULL;
FILE *fp;
char *Book="books.txt";
if(head==NULL) {
printf("\n記錄為空!\n");
return;
}
else
p=head->next;
if((fp=fopen(Book,"wb+"))==NULL) {
printf("\n打不開檔案!\n");
return;
}
while(p!=NULL) //保存資訊
{
fwrite(p,sizeof(TEL),1,fp);
p=p->next;
}
printf("保存完畢!");
fclose(fp);
//*****釋放鏈表空間*****
for(;head->next!=NULL;) {
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
//檔案資訊輸出到鏈表
void Open()
{
FILE *fp;
TEL *p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("books.txt","rb+"))==NULL) {
printf("\n****************這是一個新的學生資訊管理系統******************\n");
return;
}
head=(TEL *)malloc(sizeof(TEL));
head->next=NULL;
temp=p2=head;
while(! feof(fp)) //回圈讀取
{
p1=(TEL *)malloc(sizeof(TEL));
temp=p2;
p2->next=p1;
p2=p1;
fread(p1,sizeof(TEL),1,fp);
}
temp->next=NULL;
fclose(fp); //關閉檔案
}
uj5u.com熱心網友回復:
因為保存檔案選的是wb也就是二進制檔案,所以看上去是亂碼uj5u.com熱心網友回復:
樓主說的亂碼,主要是最后的保存鏈表資訊到檔案并釋放記憶體空間void Saveandfree()函式和檔案信打開void Open()函式寫入和讀出的格式不同,對這兩函式修改如下,問題見注釋,供參考://保存鏈表資訊到檔案并釋放記憶體空間
void Saveandfree()
{
TEL *p=NULL;
FILE *fp;
char *Book="books.txt";
if (head==NULL){
printf("\n記錄為空!\n");
return;
}
else p=head->next;
if ((fp=fopen(Book,"wb+"))==NULL){
printf("\n打不開檔案!\n");
return;
}
while (p!=NULL){ //保存資訊
//fwrite(p,1,sizeof(TEL),fp); //這個寫法是把結構體第7項 p->Telephone *next;也寫入檔案了
//所謂的亂碼就是這部分的內容。
fprintf(fp,"%s %s %s %s %s %s ",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);
p=p->next;
}
printf("保存完畢!");
fclose(fp);
//*****釋放鏈表空間*****
for(;head->next!=NULL;){
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
//檔案資訊輸出到鏈表
void Open()
{
FILE *fp;
TEL *p1=NULL,*p2=NULL,*temp=NULL;
if ((fp=fopen("books.txt","rb+"))==NULL){
printf("\n****************這是一個新的學生資訊管理系統******************\n");
return;
}
head=(TEL *)malloc(sizeof(TEL));
head->next=NULL;
temp=p2=head;
while (! feof(fp)){ //回圈讀取
p1=(TEL *)malloc(sizeof(TEL));
temp=p2;
p2->next=p1;
p2=p1;
//fread(p1,sizeof(TEL),1,fp); //對應的讀出檔案資訊的方法也不一樣
fscanf(fp,"%s %s %s %s %s %s",&p1->number,&p1->name,&p1->sex,&p1->age,&p1->speciaity,&p1->Class);
}
temp->next=NULL;
fclose(fp); //關閉檔案
}
uj5u.com熱心網友回復:
修正樓上第51行
fscanf(fp,"%s %s %s %s %s %s",p1->number,p1->name,p1->sex,p1->age,p1->speciaity,p1->Class);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267187.html
標籤:C語言
上一篇:初中學歷 學后端開發能找到作業嗎
