c语言 有效性检测 返回,C语言实习线性表 - 具备主动性,逆境中成长。 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值