操作界面:
![](https://img-blog.csdnimg.cn/20200212195131552.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1dXBlbmdzdW4=,size_16,color_FFFFFF,t_70)
结构定义:
typedef struct Pserson
{
char Name[20];
int Age;
int Height;
}Per;
typedef struct List
{
Per *per;
int Count;
int Len;
}PList;
头文件定义:
#ifndef _STRUCTMAIN_H
#define _STRUCTMAIN_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include"myExtern.h"
#define InitSize 5
#define IncreaseSize 2
typedef int Status;//方法执行结果状态OK:1\FAIL:-1
enum Opt
{
EXIT=0,
AppendOneInfo=1,
AddFiveInfo,
OutPutInfo,
OutInfoByName,
SortByHeight,
SwapTwoInfo,
DelByName,
DelAllInfo,
GetInfoTallest,
GetInfoShortest,
AppendSize,
CheckStoreSize,
InsertOneInfo
};
typedef struct Pserson
{
char Name[20];
int Age;
int Height;
}Per;
typedef struct List
{
Per *per;
int Count;
int Len;
}PList;
Status InitPersonList(PList *pHead);
void AppendInfo_One(PList *pHead);
void AddInfo_FIVE(PList *pHead);
Per *GetInfo_Tallest(PList pHead);
Per *GetInfo_Shortest(PList pHead);
Per *OutInfoBy_Name(PList pHead,char *N);
void OutPutInfo_ALL(PList pHead);
void SortBy_Height(PList pHead);//1212313
void SwapTwo_Info(Per *p1,Per *p2);
void AppendSize_Two(PList *pHead);
int CheckStore_Size();
void InsertInfo_One(PList *pHead);
void DelBy_Name(PList *pHead,char *N);
void DelAll_Info(PList *pHead);
void Destory(PList pHead);
void showMenu();
#endif
操作函数:
#include"ListMain.h"
/*
功能:初始化一个长度为5的Person结构体储存空间
参数1:指向新创建的结构体空间首地址
返回值:初始化状态结果OK:1 FAIL:-1
*/
Status InitPersonList(PList *pHead)
{
pHead->per = (Per*)malloc(InitSize*sizeof(Per));
if(pHead->per==NULL)
{
perror("malloc error!\n");
return -1;
}
pHead->Len = 5;
pHead->Count = 0;
//printf("%d %d\n",pHead->Len,pHead->Count);
return 1;
}
/*
功能:追加一个人的信息到储存空间中
参数:储存空间的首地址
返回值:void
*/
void AppendInfo_One(PList *pHead)
{
if(pHead->Count >= 0 && pHead->Count < pHead->Len)
{
printf("请输入个人信息:\n");
printf("姓名:");
scanf("%s",(pHead->per+pHead->Count)->Name);
printf("年龄:");
scanf("%d",&(pHead->per+pHead->Count)->Age);
printf("身高:");
scanf("%d",&(pHead->per+pHead->Count)->Height);
pHead->Count += 1;
}else if(pHead->Count == pHead->Len)
{
printf("人数已满,无法添加\n");
return;
}else
{
printf("出现未知错误,请重启程序!! %d\n",pHead->Count);
return;
}
printf("请确认:\nNo.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",pHead->Count,(pHead->per+pHead->Count-1)->Name,(pHead->per+pHead->Count-1)->Age,(pHead->per+pHead->Count-1)->Height);
}
/*
功能:添加五个人的信息
参数1:5个储存空间的首地址
返回值:void
*/
void AddInfo_FIVE(PList *pHead)
{
int index=0;
if(pHead->Count == 0)
{
for(index=0;index<5;index++)
{
pHead->Count += 1;
printf("请输入第 %d 个人信息:\n",pHead->Count);
printf("姓名:");
scanf("%s",(pHead->per+index)->Name);
printf("年龄:");
scanf("%d",&(pHead->per+index)->Age);
printf("身高:");
scanf("%d",&(pHead->per+index)->Height);
}
}else
{
printf("当前已经储存 %d 个人物信息\n",pHead->Count);
printf("储存空间已经不足以连续储存五个人信息!\n请选择其它操作\n");
return ;
}
}
/*
功能:添加两个连续的储存空间
参数1:原有储存空间的首地址
返回值:void
*/
void AppendSize_Two(PList *pHead)
{
Per *NewpHead=NULL;
if(0<CheckStore_Size(*pHead))
{
printf("暂时不用再添加储存空间\n");
}else
{
NewpHead = (Per *)realloc(pHead->per,(InitSize+IncreaseSize)*sizeof(Per));
if(NewpHead == NULL)
{
return;
}else
{
pHead->per = NewpHead;
pHead->Len = pHead->Len+IncreaseSize;
printf("当前总空间大小 %d\n",pHead->Len);
printf("当前剩余空间 %d\n",CheckStore_Size(*pHead));
}
}
}
/*
功能:查看储存空间
返回值:剩余储存大小
*/
int CheckStore_Size(PList p)
{
//printf("当前已经储存 %d 个人信息\n",p.Count);
//printf("当前储存剩余 %d 个空间。\n",p.Len);
return p.Len - p.Count;
}
/*
功能:删除所有的人物信息
返回值:void
*/
void DelAll_Info(PList *pHead)
{
pHead->Count =0;
}
/*
功能:根据姓名删除信息
参数1:存储空间首地址
参数2:指定的姓名
返回值:void
*/
void DelBy_Name(PList *pHead,char *N)
{
Per *tmpPer=pHead->per;
int index=0,delNum=0;
for(index=0;index<pHead->Count;index++)
{
if(0 != strcmp(N,(pHead->per+index)->Name))
{
*tmpPer=*(pHead->per+index);
tmpPer++;
}else
{
delNum++;
printf("正在删除---->No.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",index+1,(pHead->per+index)->Name,(pHead->per+index)->Age,(pHead->per+index)->Height);
}
}
if(index == pHead->Count && delNum==0)
{
printf("未找到 %s 的个人信息\n",N);
}
printf("完成!\n");
pHead->Count = pHead->Count-delNum;
N="";
}
/*
功能:销毁储存空间
参数1: 储存空间的首地址
返回值:void
*/
void Destory(PList pHead)
{
if(pHead.per==NULL)
{
printf("储存空间已经销毁。\n");
return;
}else
{
free(pHead.per);
pHead.per=NULL;
}
}
/*
功能:获取最矮的那个人的信息
参数1:储存空间的首地址
返回值:最矮那个人信息的储存地址
*/
Per *GetInfo_Shortest(PList pHead)
{
Per *pShortest=NULL;
int index=0,num=0;
if(pHead.Count == 1 && pHead.per != NULL)
{
pShortest=pHead.per;
printf("身高最矮:\nNo.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",pHead.Count,pShortest->Name,pShortest->Age,pShortest->Height);
return pShortest;
}else if(pHead.Count > 1 && pHead.per != NULL)
{
pShortest = pHead.per;
for(index = 1;index<pHead.Count;index++)
{
if(pShortest->Height > (pHead.per+index)->Height)
{
pShortest=(pHead.per+index);
num = index+1;
}
}
printf("身高最矮:\nNo.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",num,pShortest->Name,pShortest->Age,pShortest->Height);
}else
{
printf("当前储存的人物信息为 %d\n",pHead.Count);
return NULL;
}
return pShortest;
}
/*
功能:获取最高的一个人的详细信息
参数1:储存空间的首地址
返回值:最高的一个人信息储存地址
*/
Per *GetInfo_Tallest(PList pHead)
{
Per *pTallest=NULL;
int index=0,num=0;
if(pHead.Count == 1 && pHead.per != NULL)
{
printf("当前只有 %d 个人物信息\n",pHead.Count);
pTallest=pHead.per;
printf("身高最高:\nNo.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",pHead.Count,pTallest->Name,pTallest->Age,pTallest->Height);
return pTallest;
}else if(pHead.Count > 1 && pHead.per != NULL)
{
pTallest = pHead.per;
for(index = 1;index<pHead.Count;index++)
{
if(pTallest->Height < (pHead.per+index)->Height)
{
pTallest=(pHead.per+index);
num = index+1;
}
}
printf("身高最高:\nNo.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",num,pTallest->Name,pTallest->Age,pTallest->Height);
}else
{
printf("当前储存的人物信息为 %d\n",pHead.Count);
return NULL;
}
return pTallest;
}
/*
功能:向指定的位置插入一个人物的信心
参数1:储存空间的首地址
返回值:void
*/
void InsertInfo_One(PList *pHead)
{
Per perTmp;
int index=0,insert=0;
printf("请输入你要插入的位置:");
scanf("%d",&insert);
if(insert<=0)
{
printf("请输入正确的插入位置\n");
return;
}else if(insert == (pHead->Count+1))
{
printf("APPEND\n");
AppendInfo_One(pHead);
return;
}else if(insert > (pHead->Count+1))
{
printf("当前的储存人数为%d,请按照顺序插入人物信息。\n",pHead->Count);
return;
}
if(pHead->Len >= (pHead->Count+1))
{
for(index=pHead->Count;index>=0;index--)
{
if(index==(insert-1))
{
printf("请输入个人信息:\n");
printf("姓名:");
scanf("%s",perTmp.Name);
printf("年龄:");
scanf("%d",&perTmp.Age);
printf("身高:");
scanf("%d",&perTmp.Height);
*(pHead->per+index)=perTmp;
break;
}
*(pHead->per+index) = *(pHead->per+index-1);
}
pHead->Count += 1;
}else
{
printf("当前储存空间已经满员\n");
}
}
/*
功能:输出指定姓名的人物信息
参数1:储存空间首地址
参数2:指定的人物姓名
返回值:这个人信息储存单元地址
*/
Per *OutInfoBy_Name(PList pHead,char *N)
{
Per *ThisGuy=NULL;
int index=0,index_of_ThisGuy=0;
for(index=0;index<pHead.Count;index++)
{
if(0==strcmp(N,(pHead.per+index)->Name))
{
ThisGuy = (pHead.per+index);
index_of_ThisGuy=index;
printf("No.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",index_of_ThisGuy+1,ThisGuy->Name,ThisGuy->Age,ThisGuy->Height);
}
}
if(index == pHead.Count && ThisGuy == NULL)
{
printf("未找到 %s 的个人信息\n",N);
}
N="";
return ThisGuy;
}
/*
功能:输出所有的人物信息清单
参数1:储存空间首地址
返回值:void
*/
void OutPutInfo_ALL(PList pHead)
{
int index=0;
if(pHead.Count > 0)
{
for(index=0;index<pHead.Count;index++)
{
printf("No.%-3d姓名:%-10s年龄:%-5d身高:%-5d\n",index+1,(pHead.per+index)->Name,(pHead.per+index)->Age,(pHead.per+index)->Height);
}
}else
{
printf("暂时没有任何人信息储存,请选择其它操作\n");
return;
}
}
/*
功能:显示操作菜单
*/
void showMenu()
{
printf("================Menu========================\n");
printf(" 1------添加 1 个人物信息\n");
printf(" 2------添加 5 个人物信息\n");
printf(" 3------输出全部人物信息\n");
printf(" 4------输出指定姓名的那个人物信息\n");
printf(" 5------按照身高增序重新排列人物信息列表\n");
printf(" 6------交换指定的人物信息储存位置\n");
printf(" 7------删除指定姓名的那个人储存信息\n");
printf(" 8------删除所有的人物信息\n");
printf(" 9------获取身高最高的 1 个人的信息\n");
printf(" 10-----获取身高最矮的 1 个人的信息\n");
printf(" 11-----添加额外的两个储存空间\n");
printf(" 12-----查看当前储存信息:\n");
printf(" 13-----插入一个人物信息\n");
printf(" 0------退出系统,并释放储存空间\n");
printf("============================================\n");
}
/*
功能:按照身高增序重新排列人物信息列表
参数1:储存单元空间首地址
返回值:void
*/
void SortBy_Height(PList pHead)
{
//Per tmpPer;
int i=0,j=0;
if(pHead.Count == 1 || pHead.Count == 0)
{
printf("类表中有人数:%d\n",pHead.Count);
return;
}
for(i=0;i<pHead.Count-1;i++)
{
for(j=0;j<pHead.Count-i-1;j++)
{
if((pHead.per+j)->Height > (pHead.per+j+1)->Height)
{
SwapTwo_Info((pHead.per+j),(pHead.per+j+1));
//tmpPer = *(pHead+j);
//*(pHead+j) = *(pHead+j+1);
//*(pHead+j+1) = tmpPer;
}
}
}
}
/*
功能:交换指定的人物信息储存位置
参数1:第一个人物的存储空间的首地址
参数2:第二个人物的存储空间地址
返回值:void
*/
void SwapTwo_Info(Per *p1,Per *p2)
{
Per tmpPer;
tmpPer = *p1;
*p1=*p2;
*p2 = tmpPer;
}
测试代码:
#include"ListMain.h"
int PersonNum=0;
int TotalSize=0;
int main(int argc, const char *argv[])
{
//Per *pHead=NULL,
//Per *pTallest,*pShortest;
int OptNum=0;
char SetName[20];
//char *pChar=SetName;
PList pHead;
if(InitPersonList(&pHead)==1)
{
printf("已经成功创建了5个长度的Person储存空间\n");
//printf("%d %d\n",pHead.Count,pHead.Len);
}else
{
printf("pHead == NULL \n");
return 0;//
}
while(1)
{
showMenu();
printf("请选择您需要的操作编号:");
scanf("%d",&OptNum);
if(OptNum==0){break;}
switch(OptNum)
{
case AppendOneInfo:
AppendInfo_One(&pHead);
break;
case AddFiveInfo:
AddInfo_FIVE(&pHead);
break;
case GetInfoTallest:
GetInfo_Tallest(pHead);
break;
case GetInfoShortest:
GetInfo_Shortest(pHead);
break;
case OutPutInfo:
OutPutInfo_ALL(pHead);
break;
case OutInfoByName:
printf("请输入你要查询的人物姓名:");
scanf("%s",SetName);
OutInfoBy_Name(pHead,SetName);
break;
case SortByHeight:
//2151655
SortBy_Height(pHead);
OutPutInfo_ALL(pHead);
break;
case SwapTwoInfo:
printf("交换之前的储存顺序:\n");
OutPutInfo_ALL(pHead);
printf("交换之后的储存顺序:\n");
SwapTwo_Info(GetInfo_Tallest(pHead),GetInfo_Shortest(pHead));
OutPutInfo_ALL(pHead);
break;
case DelAllInfo:
DelAll_Info(&pHead);
break;
case DelByName:
printf("请输入你要删除的人物姓名:");
scanf("%s",SetName);
DelBy_Name(&pHead,SetName);
break;
case AppendSize:
AppendSize_Two(&pHead);
break;
case CheckStoreSize:
printf("当前总空间大小 %d; 剩余空间 %d 。\n",pHead.Len,CheckStore_Size(pHead));
break;
case InsertOneInfo:
InsertInfo_One(&pHead);
break;
case EXIT:
Destory(pHead);
break;
default:
printf("请重新输入正确的操作指令\n");
}
}
return 0;
}