用线性表实现的通讯录管理 C++代码

 

/****************************************/ /*主控菜单处理测试程序main2.c************/ /***************************************/ #include <iostream> #include <string> using namespace std; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 int OK=1; int OVERFLOW=0; int ERROR=0; typedef struct { //通讯录结点类型 char num[10]; //编号 char name[20]; //姓名 char sex[6]; //性别 char phone[13]; //电话 char addr[31]; //地址 } DataType; typedef struct { DataType *elem; int length;//当前长度 int listsize;//线性表的长度 }SqList; /*******************/ /* 菜单选择函数程序 */ /***************************/ int menu_select( ) { int choice; cout<<" 通讯录管理系统 /n"; cout<<"======================================================================/n"; cout<<"1.建立/t"<<"2.插入/t"<<"3.查询/t"<<"4.删除/t"<<"5.输出/t"<<"0.退出/n"; cout<<"======================================================================/n"; cout<<"请 选 择 0-5: "; for( ; ; ) { cin>>choice; if (choice<0||choice>5) cout<<"输入错误,重选0-5:"; else break; } cout<<endl; return choice; } void InitList(SqList &L) { L.elem=(DataType *)malloc(LIST_INIT_SIZE*sizeof(DataType)); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE;//以上步骤为初始化 } /**************************/ /*建立通讯录线性表函数 */ /**************************/ void CreateList(SqList &L) { L.elem=(DataType *)malloc(LIST_INIT_SIZE*sizeof(DataType)); if(!L.elem) exit(OVERFLOW); L.length=0; L.listsize=LIST_INIT_SIZE;//因为建立一个通讯录,即重新开始建立一个,所以要初始化 //使不和以前的通讯录相混淆。 int i=0; int flag=1; while(flag==1) { cout<<"/n编号(4)-姓名(8)-性别(3)-电话(11)-地址(31)/n"; cin>>L.elem[i].num>>L.elem[i].name>>L.elem[i].sex>>L.elem[i].phone>>L.elem[i].addr; i++; L.length++; cout<<"/n是否还要输入?(0 or 1):"; cin>>flag; cout<<endl; }//输入信息 } /******************************/ /*在通讯录线性表中插入元素 */ /******************************/ int InsertNode(SqList &L,int i,DataType x) { /*特殊情况的处理*/ if(i<1||i>L.length+1)//这里L.length加1的目的是,用户可能会在最后边接上元素,并不插, //只是顺序接到最后面 return ERROR; DataType * newbase; DataType * p,* q; if(L.length>=L.listsize) { newbase=(DataType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(DataType)); if(!newbase) exit(OVERFLOW); L.elem=newbase; L.listsize+=LISTINCREMENT; } /*插入操作*/ q=&(L.elem[i-1]);//q为第i个元素的位置 for(p=&(L.elem[L.length-1]); p>=q; p--) { strcpy((p+1)->num,p->num); strcpy((p+1)->name,p->name); strcpy((p+1)->sex,p->sex); strcpy((p+1)->phone,p->phone); strcpy((p+1)->addr,p->addr);//i-1之后的元素依次后移一位 } strcpy(q->num,x.num); strcpy(q->name,x.name); strcpy(q->sex,x.sex); strcpy(q->phone,x.phone); strcpy(q->addr,x.addr); //---------------------------------------------------------------------------------------- //“->”和“.”的区别:“->”是用于指针的,而“.”是用于对象调用的。 //---------------------------------------------------------------------------------------- L.length++; return OK; } /******************************************/ /* 有序通讯录线性表的查找 */ /******************************************/ int ListFind(SqList &L) {// 有序通讯录线性表上的查找 int i=1; int xz; DataType *p; p=L.elem; char SNum[5]; char SName[9]; do { cout<<"1 按编号查询 2 按姓名查询:"; cin>>xz; cout<<endl; if(xz!=1&&xz!=2) cout<<"输入错误!/n/n"; }while(xz!=1&&xz!=2); if(xz==1) { int j=0; cout<<"输入编号:"; cin>>SNum; cout<<endl; while(i<=L.length && strcmp(p[i-1].num,SNum)!=0) i++; if(i>L.length) return 0; else return i; } else { int j; cout<<"输入姓名:"; cin>>SName; cout<<endl; while(i<=L.length && strcmp(p[i-1].name,SName)!=0) i++; if(i>L.length) return 0; else return i; } } /*******************************/ /* 通讯录线性表上的结点删除 */ /*********************************/ int DelNode(SqList &L) { DataType * p; DataType * q; int i; cout<<"要删除哪个位置上的元素?:"; cin>>i; cout<<endl; if(i<1||i>L.length) return ERROR;//特殊情况的处理 p=&(L.elem[i-1]); q=L.elem+L.length-1; for(p;p<q;p++) { strcpy(p->num,(p+1)->num);//i-1之后的元素依次后移一位 strcpy(p->name,(p+1)->name); strcpy(p->sex,(p+1)->sex); strcpy(p->phone,(p+1)->phone); strcpy(p->addr,(p+1)->addr); }//i之后的元素依次左移 L.length--; return OK; } /**********************************/ /* 通讯录线性表的输出函数 */ /**********************************/ void PrintList(SqList &L) { int i; for(i=0;i<L.length;i++) { cout<<L.elem[i].num<<" "<<L.elem[i].name<<" "<<L.elem[i].sex<<" " <<L.elem[i].phone<<" "<<L.elem[i].addr<<endl; } if(L.length==0) cout<<"通讯录中没有元素!/n"; cout<<endl; } //主函数 void main() { SqList L; InitList(L); for( ; ; ) { switch(menu_select( ) ) { case 1: cout<<"**********************************/n"; cout<<"* 通 讯 录 线 性 表 的 建 立 */n"; cout<<"**********************************/n"; CreateList(L); break; case 2: cout<<"**********************************/n"; cout<<"* 通 讯 者 信 息 的 添 加 */n"; cout<<"**********************************/n"; cout<<endl; cout<<"编号(4)-姓名(8)-性别(3)-电话(11)-地址(31)/n"; DataType p; //申请新结点 cin>>p.num>>p.name>>p.sex>>p.phone>>p.addr; int i; int m; cout<<"想插到哪个位置上? "; cin>>i; cout<<endl; m=InsertNode(L,i,p); if(m==ERROR) cout<<"你输入的元素位置超过了界限!/n/n"; else cout<<"已经插入了该元素!/n/n"; break; case 3: int a; cout<<"**********************************/n"; cout<<"* 通 讯 者 信 息 的 查 询 */n"; cout<<"**********************************/n"; a=ListFind(L); if(a!=0) { cout<<"编号(4)-姓名(8)-性别(3)-电话(11)-地址(31)/n"; cout<<L.elem[a-1].num<<" "<<L.elem[a-1].name<<" "<<L.elem[a-1].sex<<" " <<L.elem[a-1].phone<<" "<<L.elem[a-1].addr<<endl; cout<<endl; } else cout<<"没有查到要查询的通讯者!/n/n"; break; case 4: int b; cout<<"**********************************/n"; cout<<"* 通 讯 者 信 息 的 删 除 */n"; cout<<"**********************************/n"; b=DelNode(L); //删除结点 if(b==0) cout<<"你输入的元素位置超过界限!/n/n"; else cout<<"已经成功删除了该元素!/n/n"; break; case 5: cout<<"**********************************/n"; cout<<"* 通 讯 者 信 息 的 输 出 */n"; cout<<"**********************************/n"; PrintList(L); break; case 0: cout<<"/t 再 见! /n"; return; } } } 

 

你可能感兴趣的:(C++,list,struct,通讯,电话,通讯录管理)