#include
#include
#include
//联系人信息
typedef struct _Person
{
int num; //编号
char name[10];//姓名
char phone[12];//手机号
}Person ;
//联系人信息数组(线性数组表)
typedef struct _LinePerson
{
Person* elem;/*存放线性表元素的一维数组基址*/
int nElemNum;/*当前线性表中元素的个数*/
int nMaxElem;/*当前线性表存储空间大小*/
}LinePerson;
//初始化链表
LinePerson* InitPerson(LinePerson* list)/*新建节点*/
{
//检测线性表结构体的有效性
if(list==NULL)
{
printf("list shoule not be null\n");
return NULL; //如果无效直接返回空
}
//分配数组空间
list->elem=(Person*)malloc(200*sizeof(Person)); /*分配内存*/
//检验分配空间是否完成
if(list->elem==NULL)
return NULL;/*分配失败,返回0*/
//联系人条目置0,数组容量200
list ->nElemNum=0;
list->nMaxElem=200;
return list;
}
void UnitPerson(LinePerson* list) //销毁操作,释放内存
{
//检测参数合法性
if(list==NULL)
return ;
//检测数组是否为空
if(list->elem==NULL)
return;
//数组空间释放,参数设置
free(list->elem);//释放内存
//首地址置空,防止后续错误使用
list->elem=NULL;
list->nElemNum=0;//线性表长度为0
list->nMaxElem=0;//线性表存储容量为0
}
//线性表置空,这个操作不是很常用,这个操作只是把内存中的数据清空,
LinePerson* ClearPerson(LinePerson* list)//置空操作
{
//参数合法性判断
if(list==NULL)
return NULL;
//数组存在性判断
if(list ->elem==NULL)
{
printf("elem should not null:\n");
return list;
}
//有效联系人数量置空.
list ->nElemNum=0; //置空线性表.
//内存的清空
memset(list->elem,0,200*sizeof(Person));//list->elem 首地址, 最后的参数是清空空间的容量
return list;
}
//查询操作,nElemGet为需要查询条目在数组中的位置 ,返回值是联系人信息
Person* GetPerson(LinePerson* list,int nElemGet)//获取元素
{
//参数合法性的检测
if(list==NULL)
return NULL;
//数组的有效性检测,数组中本身就没有数,返回空.
if(list->elem==NULL)
return NULL;
//数组中对应条目是否存在
if(list->nElemNum
return NULL; //如果数组条目不正确,返回空.
//返回数组中nElemGet-1 对应下标数据.
return list->elem+nElemGet-1;
}
//插入数据操作,nPos代表插入位置,pPer代表插入数据
LinePerson* InsertPerson(LinePerson* list ,int nPos, Person* pPer)
{
int i=0;
//线性表合法性的判断
if(list==NULL)
return NULL;
//判断插入位置的合法性
if(nPos>list->nMaxElem) //获取的值大于最大限度.
return list; //如果插入位置不合法,直接返回
//判断数组是否已满,不进行插入操作,直接返回.
if(list->nElemNum==list->nMaxElem)//当前元素已经等于最大限度,无剩余空间
return list;
if(nPos>list->nElemNum)//满足条件元素
{
//插入位置上原本并没有数据,直接把插入的信息放在插入位置上
(list->elem+nPos-1)->num=pPer-> num;
strcpy((list->elem+nPos-1)->name,pPer->name);
strcpy((list->elem+nPos-1)->phone,pPer->phone);
}
else
{
for(i=list->nElemNum;i>nPos-1;i--)
{
//插入位置上已经存在数据,将插入位置之后的全部数据,向后移一位.
(list->elem + i)->num=(list->elem + i -1)->num;
strcpy((list->elem+i)->name,(list->elem+i-1)->name);
strcpy((list->elem+i)->phone,(list->elem+i-1)->phone);
}
//覆盖原有数据
(list->elem+nPos-1)->num=pPer->num;
strcpy((list->elem+nPos-1)->name,pPer->name);
strcpy((list->elem+nPos-1)->phone,pPer->phone);
}
//有效数据条目加1
list->nElemNum++;
return list;
}
//删除数据 第一个参数,代表哪个线性表, 第二个参数代表 删除第一个,第三个参数返回删除的数据,这是对程序易用性的考虑.
LinePerson* Delete(LinePerson* list,int nPos, Person* pPer)
{
int i;
//线性表的合法性检测;
if(list==NULL)
return NULL;
//检测数组是否存在.
if(list->elem==NULL)
return list;
//检测要删除的条目是否存在, 如果要删除的条目大于数组条目,返回.
if(nPos>list->nElemNum)
return list;
//删除之前,反馈一下删除数据信息.
pPer->num=(list->elem+nPos-1)->num;
strcpy(pPer->name,(list->elem+nPos-1)->name);
strcpy(pPer->phone,(list->elem+nPos-1)->phone);
//数据顺序前移,在前移的过程中,覆盖了要删除的数据信息.
for(i=nPos-1;inElemNum;i++)
{
(list->elem+i)->num=(list->elem+i+1)->num;
strcpy((list->elem+i)->name,(list->elem+i+1)->name);
strcpy((list->elem+i)->phone,(list->elem+i+1)->phone);
}
//数据有效条目-1
list->nElemNum--;
return list;
}
//修改一条数据,参数分别代表目标线性表,修改位置,修改信息
LinePerson* Modify(LinePerson* list, int nPos, Person* pPer)
{
//线性表合法性判断
if(list == NULL)
return NULL;
//数组存在性判断
if(list->elem == NULL)
return list;
//修改项目存在
if(list->nElemNum < nPos)
return list;
//覆盖原有数据信息.
(list->elem + nPos - 1)->num=pPer->num;
strcpy((list->elem + nPos - 1)->name, pPer->name);
strcpy((list->elem + nPos - 1)->phone, pPer->phone);
return list;
}
int main()
{
LinePerson lp;
Person* Perget = NULL;
char szName[10];
char szPhone[12];
int i = 0;
Person pPerson1 = {17,"QIAN","15150100402"};
InitPerson(&lp);
InsertPerson(&lp, 1, &pPerson1);
for(i = 0; i < 20 ;i++)
{
sprintf(szName, "QIAN%02d",i);
sprintf(szPhone, "17173%03d",i);
pPerson1.num=i;
strcpy(pPerson1.name, szName);
strcpy(pPerson1.phone, szPhone);
InsertPerson(&lp, 1, &pPerson1);
}
for(i = 0; i < lp.nElemNum;i++)
{
printf("number=%d name = %8s phone = %8s\n", (lp.elem + i)->num, (lp.elem + i)->name, (lp.elem + i)->phone);
}
Perget = GetPerson(&lp, 10);
if(Perget != NULL)
{
printf("Get the 10th:\nnumber=%d name = %8s phone = %8s\n", Perget->num, Perget->name, Perget->phone);
}
UnitPerson(&lp);
return 0;
}