C语言实习线性表

上一篇 / 下一篇  2010-11-03 12:37:41

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 

//联系人信息
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<nElemGet)//获取的值大于元素
  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;i<list->nElemNum;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;
}

 


TAG:

 

评分:0

我来说两句

日历

« 2024-05-08  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18162
  • 日志数: 29
  • 建立时间: 2010-09-25
  • 更新时间: 2010-12-19

RSS订阅

Open Toolbar