# include & ltstring.h & gt
# include & ltctype.h & gt
# include & ltstdlib.h & gt
#define MONTH_NUM 5 /*大多數月份*/
結構工人
{
int數;/*每個工人的工號*/
char name[15];/*每個工人的姓名*/
int salary[MONTH _ NUM];/*每個工人的月工資*/
int sum/*每個工人的總工資*/
浮動平均值;/*每個工人的平均工資*/
struct worker * next
};
typedef結構工作程序STU
char菜單(void);
int Ascending(int a,int b);
int Descending(int a,int b);
void IntSwap(int *pt1,int * pt2);
void CharSwap(char *pt1,char * pt2);
void FloatSwap(float *pt1,float * pt2);
STU *AppendNode(STU *head,const int m);
STU *DeleteNode(STU *head,int nodeNum);
STU *ModifyNode(STU *head,int nodeNum,const int m);
STU *SearchNode(STU *head,int nodeNum);
STU *Appendsalary(STU *head,const int m);
void Totalsalary(STU *head,const int m);
void Printsalary(STU *head,const int m);
STU *Deletesalary(STU *head,const int m);
void Modifysalary(STU *head,const int m);
void Sortsalary(STU *head,const int m,int (*compare)(int a,int b));
void Searchsalary(STU *head,const int m);
void delete memory(STU * head);
主()
{
char ch
int m;
STU * head = NULL
Printf("輸入要記錄的月份(m
scanf("%d ",& ampm);
while (1)
{
ch = Menu();
開關(通道)
{
case ' 1 ':head = append salary(head,m);
總工資(人頭,m);
打破;
case'2':Printsalary(頭,m);
打破;
case'3':head = Deletesalary(head,m);
printf(" \ n刪除後\ n ");
Printsalary(人頭,m);
打破;
情況“4”:modify salary(head,m);
總工資(人頭,m);
printf(" \ n修改後\ n ");
Printsalary(人頭,m);
打破;
案例' 5':Searchsalary(頭,m);
打破;
case'6':Sortsalary(head,m,降序);
printf(" \ n按總和降序排列\ n ");
Printsalary(人頭,m);
打破;
case'7':Sortsalary(head,m,升序);
printf(" \ n按sum升序排序\ n ");
Printsalary(人頭,m);
打破;
案例“0”:退出(0);
delete memory(head);
printf("程序結束!");
打破;
默認值:printf("輸入錯誤!");
打破;
}
}
}
字符菜單(無效)
{
char ch
printf(" \ n管理工人的工資\ n ");
Printf(" 1。添加記錄\ n ");
Printf(" 2。列出記錄\ n ");
Printf(" 3。刪除記錄\ n ");
Printf(" 4。修改記錄\ n ");
Printf(" 5。查找記錄\ n ");
Printf(" 6。降序\ n ");
Printf(" 7。升序\ n ");
Printf(" 0。退出\ n ");
Printf("請輸入您的選擇:");
scanf(" %c ",& ampch);/*在%c之前添加壹個空格以讀取緩沖區中的回車*/
返回ch;
}
STU *Appendsalary(STU *head,const int m)
{
int I = 0;
char c;
做{
head = AppendNode(head,m);/*在鏈表的末尾添加壹個節點*/
Printf("是否要添加新記錄(Y/N)?");
scanf(" %c ",& ampc);/*%c前面有壹個空格*/
i++;
} while(c = = ' Y ' | | c = = ' Y ');
printf("%d個新節點已打開!\n”,I);
回程頭;
}
STU *Deletesalary(STU *head,常量m)
{
int i = 0,nodeNum
char c;
做{
Printf("請輸入您要刪除的記錄號:");
scanf("%d ",& ampnodeNum);
head = DeleteNode(head,nodeNum);/*刪除工號為nodeNum的工人信息*/
Printsalary(人頭,m);/*顯示當前鏈表中每個節點的信息*/
printf("是否要刪除節點(Y/N)?");
scanf(" %c ",& ampc);/*%c前面有壹個空格*/
i++;
} while(c = = ' Y ' | | c = = ' Y ');
printf("%d個節點已被刪除!\n”,I);
回程頭;
}
void Modifysalary(STU *head,const int m)
{
int i = 0,nodeNum
char c;
做{
Printf("請輸入您要修改的記錄號:");
scanf("%d ",& ampnodeNum);
head = ModifyNode(head,nodeNum,m);/*修改節點號為的節點*/
printf("是否要修改節點(Y/N)?");
scanf(" %c ",& ampc);/*%c前面有壹個空格*/
i++;
} while(c = = ' Y ' | | c = = ' Y ');
printf("%d個節點已被修改!\n”,I);
}
無效總薪金(STU *head,const int m)
{
STU * p = head
int I;
而(p!= NULL) /*如果不是頁腳,則循環*/
{
p->;sum = 0;
for(I = 0;我& ltm;i++)
{
p->;sum+= p-& gt;工資[I];
}
p->;average = (float)p->sum/m;
p = p-& gt;接下來;/*讓p指向下壹個節點*/
}
}
void Sortsalary(STU *head,const int m,int (*compare)(int a,int b))
{
STU * pt
int flag = 0,I;
做{
flag = 0;
pt =頭;
/*如果後壹個節點的工資總額高於前壹個節點,則兩個節點中的數據會進行交換。
註意,只交換節點數據,節點順序保持不變,即不交換節點next指針的內容*/
while(pt-& gt;下壹個!=空)
{
if((*比較)(pt-& gt;下壹個-& gt;sum,pt-& gt;總和))
{
int swap(& amp;pt-& gt;數量& amppt-& gt;下壹個-& gt;號);
char swap(pt-& gt;姓名,pt-& gt;下壹個-& gt;姓名);
for(I = 0;我& ltm;i++)
{
int swap(& amp;pt-& gt;工資[i],& amppt-& gt;下壹個-& gt;工資[I]);
}
int swap(& amp;pt-& gt;總和& amppt-& gt;下壹個-& gt;sum);
FloatSwap(& amp;pt-& gt;平均& amppt-& gt;下壹個-& gt;平均);
flag = 1;
}
pt = pt-& gt;接下來;
}
} while(flag);
}
/*交換兩個整數*/
void IntSwap(int *pt1,int *pt2)
{
內部溫度;
temp = * pt 1;
* pt 1 = * pt2;
* pt2 = temp
}
/*交換兩個實數*/
void FloatSwap(float *pt1,float *pt2)
{
浮動溫度;
temp = * pt 1;
* pt 1 = * pt2;
* pt2 = temp
}
/*交換兩個字符串*/
void CharSwap(char *pt1,char *pt2)
{
充電溫度[15];
strcpy(temp,pt 1);
strcpy(pt1,pt2);
strcpy(pt2,temp);
}
/*確定數據是否按升序排序
int Ascending(int a,int b)
{
返回壹個& ltb;
}
/*確定數據是否按降序排序,a & gt如果b為真,則按降序排序*/
int Descending(int a,int b)
{
return a & gtb;
}
void Searchsalary(STU *head,const int m)
{
int數,I;
STU * findNode
Printf("請輸入要查找的記錄號:");
scanf("%d ",& amp號);
findNode = SearchNode(head,number);
if (findNode == NULL)
{
printf("未找到!\ n ");
}
其他
{
printf(" \ n沒有。%3d%8s ",findNode-& gt;number,find node-& gt;姓名);
for(I = 0;我& ltm;i++)
{
printf("%7d ",findNode-& gt;工資[I]);
}
printf("%9d%9.2f\n ",findNode-& gt;sum,findNode-& gt;平均);
}
}
void Printsalary(STU *head,const int m)
{
STU * p = head
char str[100] = {'\0'},temp[3];
int i,j = 1;
strcat(str,“數字名”);
for(I = 1;我& lt= m;i++)
{
strcat(str,“薪水”);
itoa(i,temp,10);
strcat(str,temp);
strcat(str," ");
}
strcat(str,“求和平均值”);
printf("%s ",str);/*打印頁眉*/
而(p!= NULL) /*如果不是頁腳,循環打印*/
{
printf(" \ n沒有。%3d%15s ",p-& gt;編號,p-& gt;姓名);
for(I = 0;我& ltm;i++)
{
printf("%7d ",p-& gt;工資[I]);
}
printf("%9d%9.2f ",p-& gt;sum,p->平均);
p = p-& gt;接下來;/*讓p指向下壹個節點*/
j++;
}
printf(" \ n ");
}
STU *AppendNode(STU *head,const int m)
{
STU * p = NULL
STU * pr = head
int j;
p = (STU *)malloc(sizeof(STU))。/*為新增節點申請內存*/
If (p == NULL) /*如果內存應用程序失敗,則打印壹條錯誤消息並退出程序*/
{
printf("沒有足夠的內存來分配");
退出(0);
}
If (head == NULL) /*如果原鏈表為空,則設置新節點為頭節點*/
{
head = p;
}
Else /*如果原來的鏈表不為空,將新節點添加到頁腳*/
{
/*如果沒有到達頁腳,繼續移動指針pr,直到pr指向頁腳*/
while(pr->;下壹個!=空)
{
pr = pr-& gt;接下來;
}
pr-& gt;next = p;/*將新節點添加到鏈表的末尾*/
}
pr = p;/*讓pr指向新節點*/
printf("輸入節點數據……");
printf(" \ n輸入編號:");
scanf("%d ",& ampp->;號);
printf("輸入名稱:");
scanf("%s ",p-& gt;姓名);
for(j = 0;j & ltm;j++)
{
printf("輸入薪資%d:",j+1);
scanf("%d ",p-& gt;工資+j);
}
pr-& gt;next = NULL/*將新創建的節點設置為頁腳*/
回程頭;/*添加節點後返回鏈表的頭節點指針*/
}
STU *ModifyNode(STU *head,int nodeNum,const int m)
{
int j;
STU * newNode
newNode = SearchNode(head,nodeNum);
if (newNode == NULL)
{
printf("未找到!\ n ");
}
其他
{
printf("輸入新節點數據:\ n ");
printf("輸入名稱:");
scanf("%s ",new node-& gt;姓名);
for(j = 0;j & ltm;j++)
{
printf("輸入薪資%d:",j+1);
scanf("%d ",new node-& gt;工資+j);
}
}
回程頭;
}
STU *DeleteNode(STU *head,int nodeNum)
{
STU *p =頭,*pr =頭;
If (head == NULL) /*鏈表為空,並且沒有節點。無法刪除節點*/
{
printf("沒有鏈接表!\ n ");
返回(頭);
}
/*如果沒有找到節點nodeNum,並且沒有到達表的末尾,則繼續查找*/
while (nodeNum!= p->;數量和數量。& ampp->;下壹個!=空)
{
pr = p;
p = p-& gt;接下來;
}
if(nodeNum = = p-& gt;Number) /*如果找到節點nodeNum,則刪除它*/
{
If (p == head) /*如果要截斷的點是第壹個節點,讓head指向第二個節點*/
{
head = p-& gt;接下來;
}
Else /*如果要修剪的點不是第壹個節點,則將前壹個節點的指針指向當前節點的下壹個節點*/
{
pr-& gt;next = p-& gt;接下來;
}
免費(p);/*釋放為已刪除節點分配的內存*/
}
Else /*未找到要刪除的節點*/
{
printf("此節點未找到!\ n ");
}
回程頭;/*刪除節點後返回鏈表的頭節點指針*/
}
STU *SearchNode(STU *head,int nodeNum)
{
STU * p = head
int j = 1;
而(p!= NULL) /*如果不是頁腳,則循環*/
{
如果(p->;number == nodeNum)返回p;
p = p-& gt;接下來;/*讓p指向下壹個節點*/
j++;
}
返回NULL
}
void DeleteMemory(STU *head)
{
STU *p = head,* pr = NULL
而(p!= NULL) /*如果不是頁腳,釋放節點占用的內存*/
{
pr = p;/*將當前節點的指針保存在pr */
p = p-& gt;接下來;/*讓p指向下壹個節點*/
免費(pr);/*釋放pr指向的當前節點所占用的內存*/
}
}
湊合著用吧,自己加壹些缺失的功能就行了。。。