第一篇:C語言鏈表的概念
C語言鏈表的概念
在*中采用了動態(tài)分配的辦法為一個結(jié)構(gòu)分配內(nèi)存空間。每一次分配一塊空間可用來存放一個學(xué)生的數(shù)據(jù),我們可稱之為一個結(jié)點。有多少個學(xué)生就應(yīng)該申請分配多少塊內(nèi)存空間,也就是說要建立多少個結(jié)點。當(dāng)然用結(jié)構(gòu)數(shù)組也可以完成上述工作,但如果預(yù)先不能準(zhǔn)確把握學(xué)生人數(shù),也現(xiàn)金網(wǎng)96y.org就無法確定數(shù)組大小。而且當(dāng)學(xué)生留級、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來。
用動態(tài)存儲的方法可以很好地解決這些問題。有一個學(xué)生就分配一個結(jié)點,無須預(yù)先確定學(xué)生的準(zhǔn)確人數(shù),某學(xué)生退學(xué),可刪去該結(jié)點,并釋放該結(jié)點占用的存儲空間。從而節(jié)約了寶貴的內(nèi)存資源。另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。而使用動態(tài)分配時,每個結(jié)點之間可以是不連續(xù)的(結(jié)點內(nèi)是連續(xù)的)。結(jié)點之間的聯(lián)系可以用指針實現(xiàn)。即在結(jié)點結(jié)構(gòu)中定義一個成員項用來存放下一結(jié)點的首地址,這個用于存放地址的成員,常把它稱為指針域。
可在第一個結(jié)點的指針域內(nèi)存入第二個結(jié)點的首地址,在第二個結(jié)點的指針域內(nèi)又存放第三個結(jié)點的首地址,如此串連下去直到最后一個結(jié)點。最后一個結(jié)點因無后續(xù)結(jié)點連接,其指針域可賦為0。這樣一種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為鏈表。
下圖為最一簡單鏈表的示意圖。
圖中,第0個結(jié)點稱為頭結(jié)點,它存放有第一個結(jié)點的首地址,它沒有數(shù)據(jù),只是一個指針變量。以下的每個結(jié)點都分為兩個域,一個是數(shù)據(jù)域,存放各種實際的數(shù)據(jù),如學(xué)號num,姓名name,性別sex和成績score等。另一個域為指針域,存放下一結(jié)點的首地址。鏈表中的每一個結(jié)點都是同一種結(jié)構(gòu)類型。
例如,一個存放學(xué)生學(xué)號和成績的結(jié)點應(yīng)為以下結(jié)構(gòu):
struct stu{
int num;
int score;
struct stu *next;
} 前兩個成員項博彩娛樂棋牌q07i5.org組成數(shù)據(jù)域,后一個成員項next構(gòu)成指針域,它是一個指向stu類型結(jié)構(gòu)的指針變量。
鏈表的基本操作對鏈表的主要操作有以下幾種:
建立鏈表;
結(jié)構(gòu)的查找與輸出;
插入一個結(jié)點;
刪除一個結(jié)點。
第二篇:C語言用指針和鏈表讀寫文件
#include
#include
#include
#include
#define MAXLEN_OF_KEYWORD 50
#define MAXLEN_OF_KEYWORDTYPE 30
char i,ch[5];
struct KeyWordBox
{
char Name[MAXLEN_OF_KEYWORD];
intId;
char Type[MAXLEN_OF_KEYWORDTYPE];//該單詞的類型struct KeyWordBox *next;//指針
};
void write();
void read();
void main()
{
write();
read();
}
void write()
{
char *FileName=“FileName.txt”;
KeyWordBox transport;
memset(&transport,0,sizeof(struct KeyWordBox));
FILE *out=NULL;
FILE *test=NULL;
test=fopen(FileName,“a”);
if(test==NULL)
{
out=fopen(FileName,“w”);
printf(“ 1 continue,0 exitn”);
i=getchar();
while(i=='1')
{
printf(“請輸入關(guān)鍵字n”);
scanf(“%s”,transport.Name);
printf(“請輸入IDn”);
scanf(“%d”,&transport.Id);
printf(“請輸入Typen”);
scanf(“%s”,transport.Type);
fwrite(&transport,sizeof(struct KeyWordBox),1,out);
printf(“ 1 continue,0 exitn”);
scanf(“%c”,&i);
}
fclose(out);
}
else
{
out=fopen(FileName,“a”);
printf(“ 1 continue,0 exitn”);
scanf(“%c”,&ch);
//i=getchar();
//while(i=='1')
while(strcmp(ch,“1”)==0)
{
printf(“請輸入關(guān)鍵字n”);
scanf(“%s”,transport.Name);
printf(“請輸入IDn”);
scanf(“%d”,&transport.Id);
printf(“請輸入Typen”);
scanf(“%s”,transport.Type);
fwrite(&transport,sizeof(KeyWordBox),1,out);
printf(“ 1 continue,0 exit.n”);
scanf(“%s”,ch);
}
fclose(out);
}
}
void read()
{
char *FileName=“FileName.txt”;
KeyWordBox *Head=NULL,*q=NULL;
KeyWordBox *Body=NULL;
KeyWordBox *p=NULL;
FILE *in=NULL;
in=fopen(FileName,“r”);
if(in==NULL)
{
printf(“can't open the file!n”);
exit(0);
}
else
{
Head=(struct KeyWordBox*)malloc(sizeof(struct KeyWordBox));Head->next =NULL;
}}q=Head;while(!feof(in)){Body=(struct KeyWordBox*)malloc(sizeof(struct KeyWordBox));Body->next=NULL;fread(Body,sizeof(struct KeyWordBox),1,in);if(feof(in)){q->next=NULL;break;}q->next=Body;q=Body;printf(“%st%dt%sn”,Body->Name,Body->Id,Body->Type);} fclose(in);p=Head->next;while(p!=NULL){printf(“%st%dt%sn”,p->Name,p->Id,p->Type);p=p->next;}
第三篇:C語言概念題
2、下列敘述中錯誤的是_______。(標(biāo)準(zhǔn)答案:A)(A)一個C語言程序只能實現(xiàn)一種算法
(B)一個C函數(shù)可以單獨作為一個C程序文件存在(C)C程序可以由一個或多個函數(shù)組成(D)C程序可以由多個程序文件組成
4、以下敘述中錯誤的是_____________。(標(biāo)準(zhǔn)答案:A)
(A)C語言中的每條可執(zhí)行語句和非執(zhí)行語句最終都將被轉(zhuǎn)換成二進(jìn)制的機器指令(B)C語言源程序經(jīng)編譯后生成后綴為.obj的目標(biāo)程序
(C)用C語言編寫的程序稱為源程序,它以ASCII代碼形式存放在一個文本文件中(D)C程序經(jīng)過編譯、連接步驟之后才能形成一個真正可執(zhí)行的二進(jìn)制機器指令文件
13、以下敘述中錯誤的是A(A)使用三種基本結(jié)構(gòu)構(gòu)成的程序只能解決簡單問題(B)C語言是一種結(jié)構(gòu)化程序設(shè)計語言(C)結(jié)構(gòu)化程序由順序、分支、循環(huán)三種基本結(jié)構(gòu)組成(D)結(jié)構(gòu)化程序設(shè)計提倡模塊化的設(shè)計方法
18、以下關(guān)于結(jié)構(gòu)化程序設(shè)計的敘述中正確的是
(A)一個結(jié)構(gòu)化程序必須同時由順序、分支、循環(huán)三種結(jié)構(gòu)組成(B)有三種基本結(jié)構(gòu)構(gòu)成的程序只能解決小規(guī)模的問題(C)在C語言中,程序的模塊化是利用函數(shù)實現(xiàn)的(D)結(jié)構(gòu)化程序使用goto語句會很便捷 標(biāo)準(zhǔn)答案:C
19、對于一個正常運行的C程序,以下敘述中正確的是C(A)程序的執(zhí)行總是從main函數(shù)開始,在程序的最后一個函數(shù)中結(jié)束(B)程序的執(zhí)行總是從程序的第一個函數(shù)開始,在main函數(shù)結(jié)束(C)程序的執(zhí)行總是從main函數(shù)開始
(D)程序的執(zhí)行總是從程序的第一個函數(shù)開始,在程序的最后一個函數(shù)中結(jié)束
33、以下選項中關(guān)于程序模塊化的敘述錯誤的是
(A)把程序分成若干相對獨立的模塊,可便于編碼和測試
(B)可采用自頂向下、逐步細(xì)化的設(shè)計方法把若干獨立模塊組裝成所要求的程序(C)把采用分成若干相對獨立、功能單一的模塊,可便于重復(fù)使用這些模塊
(D)可采用自頂向上、逐步細(xì)化的設(shè)計方法把若干獨立模塊組裝成所要求的程序 標(biāo)準(zhǔn)答案:D
34、以下敘述中正確的是
(A)C程序中的注釋只能出現(xiàn)在程序的開始位置和語句的后面(B)C程序書寫格式嚴(yán)格,要求一行內(nèi)只能寫一個語句(C)用C語言編寫的程序只能放在一個程序文件中(D)C程序書寫格式自由,一個語句可以寫在多行上 標(biāo)準(zhǔn)答案:D
36、以下關(guān)于C語言數(shù)據(jù)類型使用的敘述中錯誤的是(A)若只處理“真”和“假”兩種邏輯值,應(yīng)使用邏輯類型(B)若要保存帶有多位小數(shù)的數(shù)據(jù),可使用雙精度類型(C)整數(shù)類型表示的自然數(shù)是準(zhǔn)確無誤差的
(D)若要處理“人員信息”等含有不同類型的相關(guān)數(shù)據(jù),應(yīng)自定義結(jié)構(gòu)體類型
38、以下敘述中錯誤的是
(A)C程序在運行過程中所有計算都以二進(jìn)制方式進(jìn)行(B)C程序在運行過程中所有計算都以十進(jìn)制方式進(jìn)行
(C)C程序中字符變量存放的是字符的ASCII值(D)所有C程序都需要編譯鏈接無誤后才能運行
第四篇:單鏈表實驗報告
《數(shù)據(jù)結(jié)構(gòu)》實驗報告二
分校:
學(xué)號:
日期:
班級:
姓名:
程序名: L2311.CPP
一、上機實驗的問題和要求:
單鏈表的查找、插入與刪除。設(shè)計算法,實現(xiàn)線性結(jié)構(gòu)上的單鏈表的產(chǎn)生以及元素的查找、插入與刪除。具體實現(xiàn)要求:
1.從鍵盤輸入20個整數(shù),產(chǎn)生帶表頭的單鏈表,并輸入結(jié)點值。
2.從鍵盤輸入1個整數(shù),在單鏈表中查找該結(jié)點。若找到,則顯示“找到了”;否則,則顯示“找不到”。
3.從鍵盤輸入2個整數(shù),一個表示欲插入的位置i,另一個表示欲插入的數(shù)值x,將x插入在對應(yīng)位置上,輸出單鏈表所有結(jié)點值,觀察輸出結(jié)果。4.從鍵盤輸入1個整數(shù),表示欲刪除結(jié)點的位置,輸出單鏈表所有結(jié)點值,觀察輸出結(jié)果。5.將單鏈表中值重復(fù)的結(jié)點刪除,使所得的結(jié)果表中個結(jié)點值均不相同,輸出單鏈表所有結(jié)點值,觀察輸出結(jié)果。
6.刪除其中所有數(shù)據(jù)值為偶數(shù)的結(jié)點,輸出單鏈表所有結(jié)點值,觀察輸出結(jié)果。
7.把單鏈表變成帶表頭結(jié)點的循環(huán)鏈表,輸出循環(huán)單鏈表所有結(jié)點值,觀察輸出結(jié)果。8.(★)將單鏈表分解成兩個單鏈表A和B,使A鏈表中含有原鏈表中序號為奇數(shù)的元素,而B鏈表中含有原鏈表中序號為偶數(shù)的元素,且保持原來的相對順序,分別輸出單鏈表A和單鏈表B的所有結(jié)點值,觀察輸出結(jié)果。
二、程序設(shè)計的基本思想,原理和算法描述:
(包括程序的結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),輸入/輸出設(shè)計,符號名說明等)
三、源程序及注釋:
四、運行輸出結(jié)果:
五、調(diào)試和運行程序過程中產(chǎn)生的問題及采取的措施:
六、對算法的程序的討論、分析,改進(jìn)設(shè)想,其它經(jīng)驗教訓(xùn):
七、對實驗方式、組織、設(shè)備、題目的意見和建議:
第五篇:職工信息管理系統(tǒng) 單鏈表實現(xiàn) C語言源程序(范文)
#include
/* 單鏈表內(nèi)容有無發(fā)生改變,是否需要存盤的標(biāo)志變量 */ struct employee {
};
typedef struct Node {
void InitList(LinkList *head)
/*將單鏈表初始化為空。動態(tài)生成一個頭結(jié)點,并將頭結(jié)點的指針域置為空*/ {
}
ListNode *Locatenum(LinkList head,char find[])
//通過職工工號查找,返回定位指針。{ LinkList p;if((*head=(LinkList)malloc(sizeof(ListNode)))==NULL)
/*為頭結(jié)點分配一 printf(“系統(tǒng)分配存儲空間失敗!n”);個存儲空間*/ exit(-1);(*head)->next=NULL;
/*將頭結(jié)點的指針域置為空*/ struct employee data;struct Node *next;char num[10];
/* 工號 */ char name[15];
/* 姓名 */ char sex[7];
/* 性別 */ int age;
/* 年齡 */ char education[15];
/* 學(xué)歷 */ int salary;
/* 工資 */ char phone[20];
/* 電話號碼 */ char address[30];
/* 住址 */ }ListNode,*LinkList;
} p=head->next;if(!p)
//如果職工信息記錄為空,返回NULL。
{
} return NULL;if(strcmp(p->data.num,find)==0)return p;p=p->next;return NULL;while(p)ListNode *Locatename(LinkList head,char find[])
//通過職工姓名查找,返回定位指針。{
}
ListNode *Locatesalary(LinkList head,int salary)
//通過職工工資查找,返回定位指針。{
LinkList p;p=head->next;if(!p)
//如果職工信息記錄為空,返回NULL。
return NULL;while(p){ LinkList p;p=head->next;if(!p)
//如果職工信息記錄為空,返回NULL。
{
} return NULL;if(strcmp(p->data.name,find)==0)return p;p=p->next;return NULL;while(p)
}
} if(p->data.salary==salary)return p;p=p->next;return NULL;void Nofind(){ }
void Modify(LinkList L)
//修改功能。{
ListNode *p;
char find[20];
if(!L->next)
{
printf(“請你輸入要修改的職工工號:”);
scanf(“%s”,find);
p=Locatenum(L,find);
if(p)
{
printf(“請你輸入新的工號(原來是%s):”,p->data.num);
scanf(“%s”,p->data.num);
getchar();
printf(“n”);
printf(“請你輸入新的姓名(原來是%s):”,p->data.name);
scanf(“%s”,p->data.name);
getchar();
printf(“n”);
printf(“n***提示***:沒有資料可以修改!n”);
return;printf(“n***提示***:沒有找到該職工!n”);
}
printf(“請你輸入新的性別(原來是%s):”,p->data.sex);
scanf(“%s”,p->data.sex);
getchar();
printf(“n”);
printf(“請你輸入新的年齡(原來是%d):”,p->data.age);
scanf(“%d”,&p->data.age);
printf(“n”);
printf(“請你輸入新的學(xué)歷(原來是%s):”,p->data.education);
scanf(“%s”,p->data.education);
getchar();
printf(“n”);
printf(“請你輸入新的工資(原來是%d):”,p->data.salary);
scanf(“%d”,&p->data.salary);
printf(“n”);
printf(“請你輸入新的電話(原來是%s):”,p->data.phone);
scanf(“%s”,p->data.phone);
getchar();
printf(“n”);
printf(“請你輸入新的住址(原來是%s):”,p->data.address);
scanf(“%s”,p->data.address);
getchar();
printf(“n”);
printf(“n***提示***:資料修改成功!n”);
saveflag=1;
}
else
Nofind();//if(p)結(jié)束
} //void Modify(LinkList L)
//修改功能結(jié)束 void Add(LinkList head)
/* 錄入職工信息 */ {
system(“cls”);ListNode *p,*r,*s;
/* 實現(xiàn)添加操作的臨時的結(jié)構(gòu)體指針變量 */ int sign;
/* 標(biāo)記重復(fù)工號的變量 */ char num[10];r=head;s=head->next;
/* 鏈表沒有節(jié)點時,s=NULL;鏈表有節(jié)點時,指向while(r->next!=NULL)/* 如果存在后繼結(jié)點時,r指針后移一個 */ r=r->next;
/* 將指針移至于鏈表最末尾,準(zhǔn)備添加記錄 */ printf(“輸入‘#’將退出職工信息錄入,退回至主菜單!nn”);while(1){
printf(“(PS:職工號為‘#’即退出錄入功能)nn”);printf(“請輸入職工號:”);fflush(stdin);
//清除緩沖區(qū)。gets(num);if(strcmp(num,“#”)==0)/* 輸入‘0’,跳出while(1),即跳出Add()函數(shù) */ break;s=head->next;
/* 每次從第一個節(jié)點開始找,看num是否重
while(s){
if(strcmp(s->data.num,num)==0){
} s=s->next;printf(“***提示***n工號為:‘%s’的職工信息已經(jīng)存在!printf(”若要修改請按‘4’,放棄請按‘0’!n“);scanf(”%d“,&sign);if(sign==4)
Modify(head);return;else 第一個職工節(jié)點 */ 復(fù)。*/ n”,num);}//while(s)if((p=(LinkList)malloc(sizeof(ListNode)))==NULL)//生成沒賦值的新節(jié)點 p。
{
} strcpy(p->data.num,num);printf(“n”);printf(“請輸入該職工姓名:”);scanf(“%s”,p->data.name);getchar();printf(“n”);printf(“請輸入該職工的性別:(注:男性:male;女性:female)”);scanf(“%s”,p->data.sex);getchar();printf(“n”);printf(“請輸入該職工的年齡:”);scanf(“%d”,&p->data.age);printf(“n”);printf(“請輸入該職工的學(xué)歷:”);scanf(“%s”,p->data.education);getchar();printf(“n”);printf(“請輸入該職工的工資:”);scanf(“%d”,&p->data.salary);printf(“n”);printf(“請輸入該職工的電話號碼:”);scanf(“%s”,p->data.phone);getchar();printf(“n”);printf(“請輸入該職工的住址:”);gets(p->data.address);printf(“n”);p->next=NULL;
/* 表明這是鏈表的尾部結(jié)點 */ r->next=p;
/* 將新建的結(jié)點加入鏈表尾部中 */ r=p;saveflag=1;printf(“n”);printf(“系統(tǒng)分配存儲空間失敗!n”);printf(“退出程序!n”);exit(-1);}//while(1)}//void Add函數(shù)結(jié)束。
void printline()
//打印橫線。{ }
void printsubject()
//打印各分類標(biāo)題。{ }
void printLinkList(LinkList p)
//打印p結(jié)點各個數(shù)據(jù)成員的值。{ printf(“ %s
%s %s
%d %s %d
%s
%sn”,p->data.num,p->data.name,p->data.sex,p->data.age,p->data.education,p->data.salary,p->data.phone,p->data.address);}
void Allemployeeinfo(LinkList head)//顯示所有職工信息。{
int count=0;ListNode *p;p=head->next;if(!p){
} printf(“tttt顯示結(jié)果n”);printline();printsubject();printf(“n”);while(p)printf(“***提示***:目前沒有存儲任何職工記錄!n”);printf(“返回主菜單,請重新選擇功能!n”);return;printf(“ 工 號t 姓 名
性 別
年 齡
學(xué) 歷
工 資
電 話tt 住 址n”);printf(“------------------n”);
} {
} printline();printf(“n”);printf(“已經(jīng)存儲了%d條職工信息!n”,count);printLinkList(p);p=p->next;count++;void Wrong(){ }
void menu()
//主菜單。{
printf(“n”);printf(“t**********************************************************printf(”t*
printf(“t*
printf(”t*
< 職工信息管理系統(tǒng)_單鏈表實現(xiàn) >
printf(“t*
printf(”t*
[1]
錄入職工信息
[2]
刪除職工信息
printf(“t*
[3]
查詢職工信息
[4]
修改職工信息
printf(”t*
[5]
插入職工記錄
[6]
統(tǒng)計職工信息
printf(“t*
[7]
排序
[8]
保存職工信息
printf(”t*
[9]
顯示所有職工記錄
[0]
退出系統(tǒng)
printf(“n***提示***:輸入錯誤!n”);*********n“);*n”);*n“);*n”);*n“);*n”);*n“);*n”);*n“);*n”);
printf(“t*
printf(”t*
printf(“t*
版權(quán)所有人:printf(”t*
電子132班
printf(“t*
printf(”t***********************************************************n“);*n”);彭林
*n“);*n”);1319200063
*n“);*********n”);} //void menu菜單結(jié)束。
void Del(LinkList L)//刪除職工信息。{
int select;
//刪除方式選擇記錄變量。ListNode *p,*r;char find[20];if(!L->next)
//當(dāng)list無后繼結(jié)點時,提示和結(jié)束Del()函數(shù)。{
}
printf(“n按工號刪除,請按‘1’n按姓名刪除,請按‘2’n”);printf(“n=====>功能選擇:”);scanf(“%d”,&select);if(select==1){
printf(“請輸入要刪除的職工工號:”);scanf(“%s”,find);getchar();p=Locatenum(L,find);if(p){ r=L;printf(“n***提示***:沒有記錄可以刪除!n”);return;
} while(r->next!=p)r=r->next;//從第一個結(jié)點找起,直到發(fā)現(xiàn)r->next=p, 是待刪除結(jié)點,跳出循環(huán)。
r->next=p->next;free(p);printf(“n***提示***:該職工信息已成功刪除!n”);saveflag=1;else Nofind();}//if(select==1).else if(select==2){
printf(“請輸入要刪除的職工姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);if(p){
} else Nofind();r=L;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf(“n***提示***:該職工信息已成功刪除!n”);saveflag=1;}//if(select==2).else Wrong();
//顯示輸入錯誤的話
}//void Del()刪除函數(shù)結(jié)束。
void Search(LinkList L)
//查詢職工信息。{ int select;
int salary;int sign=0;char find[20];ListNode *p;
//實現(xiàn)查詢操作的臨時結(jié)構(gòu)體指針變量。if(!L->next){
} printf(“n按工號查找,請按‘1’n按工資查找,請按‘2’n按姓名查找,printf(”n=====>功能選擇:“);scanf(”%d“,&select);printf(”n“);if(select==1)
//工號。{
} else if(select==2)
//工資。{
printf(”請輸入要查找的工資:“);scanf(”%d“,&salary);p=Locatesalary(L,salary);printf(”請輸入要查找的工號:“);scanf(”%s“,find);getchar();p=Locatenum(L,find);if(p){
} else Nofind();printf(”tttt
查找結(jié)果n“);printline();
//打印橫線。printsubject();
//打印各分類標(biāo)題。
printLinkList(p);
//打印p結(jié)點各個數(shù)據(jù)成員的值。printline();
//打印橫線。printf(”n***提示***:沒有職工信息資料可以查詢!n“);printf(”返回主菜單,請重新選擇功能!n“);return;請按‘3’n”);
} if(p){
} while(p){
{
} } if(sign==0)Nofind();printf(“tttt查找結(jié)果n”);printline();printsubject();printLinkList(p);printline();sign++;p=Locatesalary(p,salary);if(p)printf(“tttt查找結(jié)果n”);printline();printsubject();printLinkList(p);printline();sign++;else if(select==3)
//姓名。{
printf(“請輸入要查找的姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);if(p){
printf(“tttt查找結(jié)果n”);printline();printsubject();printLinkList(p);
} } printline();else Nofind();else Wrong();}//void Search()查詢函數(shù)結(jié)束。
void Save(LinkList L)
//信息保存到文件中。{
FILE *fp;ListNode *p;int count=0;int flag=1;fp=fopen(“Employeeinfo.txt”,“wb”);if(fp==NULL){
} p=L->next;while(p){
if(fwrite(p,sizeof(ListNode),1,fp)==1)
//將第一個記錄結(jié)點值寫入文
{
p=p->next;
//依次寫入下一個結(jié)點的 count++;
//文件的記錄數(shù)+1。printf(“n***提示***:打開文件時發(fā)生錯誤!n”);return;件。
值。
}
else
{
flag=0;
printf(“寫入文件過程發(fā)生錯誤!n”);
break;
}
}//while(p).if(count>0){
} else {
} fclose(fp);system(“cls”);//清屏。
printf(“文件保存失敗!‘0’條記錄被保存。n”);printf(“n***提示***:文件保存成功。(有%d條記錄已經(jīng)保存。)n”,count);saveflag=0;
}//void Save()函數(shù)結(jié)束。
void Sort(LinkList L)
//排序功能函數(shù)。{
ListNode *p,*m,*n;int i,j,count=0;p=L->next;if(!p){
} system(“cls”);
//清屏。printf(“按工資從低到高排序:n”);printf(“***以下為排序前的所有職工記錄***n”);Allemployeeinfo(L);while(p){
} for(i=0;i //不包含頭結(jié)點的職工信息結(jié)點的總個數(shù)。p=p->next;system(“cls”); //清屏。printf(“無任何職工信息!n”);printf(“返回主菜單!n”);return; } { } printf(“***以下為排序后的所有職工記錄***n”);Allemployeeinfo(L);saveflag=1;printf(“排序成功!n”);n=L;p=L->next;m=p->next;while(m){ } if(p->data.salary>m->data.salary){ } else { } n=p;p=m;m=m->next;n->next=p->next;p->next=m->next;m->next=p;n=m;m=p->next;void Statistics(LinkList L)//統(tǒng)計職工中的最高工資和最低工資。{ ListNode *Max,*Min;int i;ListNode *t=L->next;if(!t){ system(“cls”); //清屏。printf(“沒有儲存任何職工記錄!n”); } } printf(“返回主菜單,請先錄入職工信息!n”);return;system(“cls”);Max=Min=t;t=t->next;while(t){ } printf(“最高工資為:%dn”,Max->data.salary);printf(“最低工資為:%dn”,Min->data.salary);printf(“若要查看最低,最高工資的相關(guān)職工信息,n”);printf(“請按‘1’,然后按照提示進(jìn)行相關(guān)操作,n”);printf(“否則,請按‘1’除外的任何數(shù)字鍵以退出統(tǒng)計功能,返回主菜單。n”);printf(“n=====>功能選擇:”);scanf(“%d”,&i);if(i==1)Search(L); //顯示符合要求的職工信息。return;else if(Max->data.salary //Max指針指向最高工資的職工結(jié)點。Min=t; //Min指針指向最低工資的職工結(jié)點。if(Min->data.salary>t->data.salary)t=t->next;void Insert(LinkList L) //插入新的職工信息。{ printf(“本功能可以通過姓名和工號查找到符合要求的n”);//功能介紹。printf(“相關(guān)職工信息,然后將您希望添加進(jìn)去的新的n”);printf(“職工信息插入到該職工信息記錄的后面。n”);ListNode *p,*s;char find[20]; //存放工號和姓名的變量。int i;printf(“通過姓名查找,請按‘1’。n”);printf(“通過工號查找,請按‘2’。n”); printf(“返回主菜單,請按‘3’。n”);printf(“n=====>功能選擇:”);scanf(“%d”,&i);printf(“n”);if(i==3){ } else if(i==1){ printf(“請輸入已在存儲記錄中的職工姓名:”);scanf(“%s”,find);getchar();p=Locatename(L,find);//定位。if(!p){ } s=(LinkList)malloc(sizeof(ListNode));if(!s){ } printf(“請輸入新職工工號:”);gets(s->data.num);printf(“n”);printf(“請輸入新職工姓名:”);scanf(“%s”,s->data.name);getchar();printf(“n”);printf(“請輸入新職工的性別:(注:男性:male;女性:female)”);scanf(“%s”,s->data.sex);printf(“系統(tǒng)分配存儲空間失?。”);system(“cls”);return;printf(“您輸入的該職工姓名不在信息記錄中,請重新核審!n”);printf(“返回主菜單。n”);return;system(“cls”); //退出插入功能,返回主菜單。return; } getchar();printf(“n”);printf(“請輸入新職工的年齡:”);scanf(“%d”,&s->data.age);printf(“n”);printf(“請輸入新職工的學(xué)歷:”);scanf(“%s”,s->data.education);getchar();printf(“n”);printf(“請輸入新職工的工資:”);scanf(“%d”,&s->data.salary);printf(“n”);printf(“請輸入新職工的電話號碼:”);scanf(“%s”,s->data.phone);getchar();printf(“n”);printf(“請輸入新職工的住址:”);scanf(“%s”,s->data.address);getchar();printf(“n”);s->next=p->next;p->next=s;printf(“姓名為:%s的新職工信息已成功插到姓名為:%s的職工信息記saveflag=1; //資料已改動的存儲變量。錄后面。n”,s->data.name,p->data.name);else if(i==2){ printf(“請輸入已在存儲記錄中的職工工號:”);scanf(“%s”,find);getchar();p=Locatenum(L,find);//定位。if(!p){ printf(“您輸入的該職工工號不在信息記錄中,請重新核審!n”);printf(“返回主菜單。n”);return; } s=(LinkList)malloc(sizeof(ListNode));if(!s){ } printf(“請輸入新職工工號:”);gets(s->data.num);printf(“n”);printf(“請輸入新職工姓名:”);scanf(“%s”,s->data.name);getchar();printf(“n”);printf(“請輸入新職工的性別:(注:男性:male;女性:female)”);scanf(“%s”,s->data.sex);getchar();printf(“n”);printf(“請輸入新職工的年齡:”);scanf(“%d”,&s->data.age);printf(“n”);printf(“請輸入新職工的學(xué)歷:”);scanf(“%s”,s->data.education);getchar();printf(“n”);printf(“請輸入新職工的工資:”);scanf(“%d”,&s->data.salary);printf(“n”);printf(“請輸入新職工的電話號碼:”);scanf(“%s”,s->data.phone);getchar();printf(“n”);printf(“請輸入新職工的住址:”);scanf(“%s”,s->data.address);getchar();printf(“n”);printf(“系統(tǒng)分配存儲空間失?。”);system(“cls”);return; } } s->next=p->next;p->next=s;printf(“姓名為:%s的新職工信息已成功插到姓名為:%s的職工信息記saveflag=1;錄后面。n”,s->data.name,p->data.name);else { } printf(“功能選擇有誤!返回主菜單。n”);return;void main(){ LinkList L;/*定義鏈表*/ // struct Node *list; FILE *fp;/* 文件指針 */ int choose;/*保存選擇結(jié)果變量*/ char ch; /*保存(y,Y,n,N)*/ int count=0;/*保存文件中的記錄條數(shù)(或結(jié)點個數(shù))*/ struct Node *p,*r; /*定義記錄指針變量*/ printf(“tttt職工信息管理系統(tǒng)nttttn”); L=(struct Node*)malloc(sizeof(struct Node)); if(!L) { printf(“n系統(tǒng)分配存儲空間失??!n”);/*如沒有申請到,打印提示信 return; /*返回菜單*/ 息*/ } L->next=NULL; r=L; fp=fopen(“Employeeinfo.txt”,“rb”); if(fp==NULL) { printf(“n***提示***:存儲職工信息的文件還不存在,是否創(chuàng)建? scanf(”%c“,&ch);(y/n)n”); */ if(ch=='y'||ch=='Y') { fp=fopen(“Employeeinfo.txt”,“ab+”); printf(“文件創(chuàng)建成功!n”); } else { printf(“文件沒有創(chuàng)建,無法寫入職工信息!nn”); printf(“<-----退 出 職 工 信 息 管 理 系 統(tǒng)----->n”); exit(0); } } // if(fp==NULL) printf(“n=====>提示:文件已經(jīng)打開,正在導(dǎo)入記錄......n”); while(!feof(fp))//沒有到文件尾時,循環(huán) { fclose(fp);/* 關(guān)閉文件 */ printf(“n=====>提示:記錄導(dǎo)入完畢,共導(dǎo)入%d條記錄。n”,count); while(1) p=(struct Node*)malloc(sizeof(struct Node)); if(!p) { if(fread(p,sizeof(struct Node),1,fp))/* 讀文件的已有內(nèi)容放入結(jié)點中 { p->next=NULL; r->next=p; r=p;/* 將該結(jié)點掛入鏈表中, r指向最后的節(jié)點 */ count++; printf(“ memory malloc failure!n”); /*沒有申請成功*/ exit(0); /*退出*/ } } } //while(!feof(fp)) { menu(); printf(“tt====>請選擇:”); scanf(“%d”,&choose); if(choose==0) { if(saveflag==1) { getchar(); printf(“n=====>提示:資料已經(jīng)改動,是否將改動保存到文件 scanf(”%c“,&ch); if(ch=='y'||ch=='Y') Save(L);中(y/n)?n”); } //if printf(“n***提示***:您已經(jīng)退出系統(tǒng),歡迎再次使用!~n”); break; }//if switch(choose){ case 1:Add(L); break;break;break;break;break;break;Sort(L);break;Save(L);case 2:Del(L);case 3:Search(L);case 4:Modify(L);case 5:Insert(L);case 6:Statistics(L);case 7: case 8: break;system(“cls”);Allemployeeinfo(L);break;case 9: default: } } } Wrong();break;