当前位置:文档之家› 数据结构顺序表(电话通讯录)

数据结构顺序表(电话通讯录)

数据结构用顺序表实现的电话通讯录(C语言)#include<stdio.h>#include<malloc.h>#include<math.h>#include<string.h>#define FALSE 0#define ERROR 0#define OK 1#define INFEASIBLE -1#define LIST_INIT_SIZE 10#define LIST_INCREMENT 5#define N 5typedef int Status;typedef struct{ char name[10]; //姓名char num[15]; //号码}student;typedef struct{student *elem;//存储空间基址int length;//当前长度int listsize;//当前分配的存储空间(以sizeof(student)为单位) }Sqlist;Sqlist L; //定义全局变量L 为Sqllist类型Status ListInsert(Sqlist &L,int i,student e){//插入学生信息到顺序表L中int j;student *newbase;if(i<1||i>L.length+1) return ERROR; //i值不合法if(L.length>=L.listsize)//当前存储空间已满,增加分配{newbase=(student*)realloc(L.elem,(LIST_INIT_SIZE+LIST_INCREMENT)*(sizeof(student)));if(!newbase) //存储分配失败exit(OVERFLOW);L.elem=newbase;//新基址L.listsize+=LIST_INCREMENT;//增加存储容量}for(j=L.length;j>=i;j--)L.elem[j]=L.elem[j-1]; //插入位置及之后元素的右移L.elem[i-1]=e;L.length++;return OK;void InitList(Sqlist &L){//创建顺序表L.elem=(student *)malloc(LIST_INIT_SIZE*sizeof(student));if(!L.elem) exit(OVERFLOW);//存储分配失败L.length=0;//空表长度L.listsize=LIST_INIT_SIZE;//初始存储容量}void ListTraverse(Sqlist L,void(*vi)(student &)){//显示顺序表中的所有记录system("cls");printf("姓名电话号码\n");student *p;int i;p=L.elem;for(i=1;i<L.length+1;i++)vi(*p++);printf(" 输入0:返回菜单请输入您的选择:");}void print(student &a){//信息输出printf("%-10s%-8s",,a.num);printf("\n");}int ListLength(Sqlist L) //返回顺序表的长度{ return L.length; }int LocateElem(Sqlist L,student e,Status(*compare)(student,student)){//返回L中第一个与e满足关系compare的数据的位序,//若这样的数据不存在,则返回为0;int i=1;//i的初值为第1个元素的位序student*p=L.elem;//p的初值为第1个元素的存储位置while(i<=L.length&&!compare(*p++,e))i++;if(i<=L.length)return i;elsereturn ERROR;}Status ListDelete(Sqlist &L,int i,student &e)//在顺序表L中删除第i个元素,并返回OKsystem("cls"); //清除屏幕int j;if(i<1||i>L.length) //i值不合法return ERROR;else{e=L.elem[i-1];//p为删除元素的位置for(j=i;j<=L.length;j++) L.elem[j-1]=L.elem[j];L.length--;return OK;}}void wrong(){//错误提示信息输出printf("you have inputed a wrong number");printf(" please input the number that is between 0 and 8");}void Delete(Sqlist &L){//根据i删除顺序表中的记录student e;int j;printf("请输入要删除的位置(1≦i≦%d):",L.length+1);scanf("%d",&j);ListDelete(L,j,e);printf("已删除!");printf("输入0:返回菜单请输入您的选择:");}void ScanIn(Sqlist &L){//信息输入system("cls");int i;student e;char a[2];printf("请输入信息:\n");do{student *p=L.elem;printf("请输入姓名:");scanf("%s",);printf("请输入电话号码:");scanf("%s",e.num);printf("请输入你要插入的位置(1≦i≦%d): ",L.length+1);scanf("%d",&i);ListInsert(L,i,e);jump:printf("是否继续输入信息(y/n)");scanf("%s",a);}while(strcmp(a,"y")==0||strcmp(a,"Y")==0);printf("输入0:返回菜单请输入您的选择:");}student stu[N]={{"小易","137****1111"},{"小二","134****2222"},{"小伞","187****3333"},{"小斯","158****4444"},{"小武","134****5555"}};int stuIntsertList(Sqlist &L){//将结构体数组stu中的记录插入到顺序表int i,j;for(i=0;i<N;i++)j=ListInsert(L,i+1,stu[i]);system("cls");if(j)printf("已成功加入到顺序表中\n");printf(" 输入0:返回菜单请输入您的选择:");return OK;}void menu(){//菜单函数printf("\t\t *************************************\n");printf("\t\t * 1. 导入记录*\n");printf("\t\t * 2. 输入记录*\n");printf("\t\t * 3. 删除记录*\n");printf("\t\t * 4. 显示所有记录*\n");printf("\t\t *0. 返回本菜单*\n");printf("\t\t *************************************\n\n\n");}//开始函数void start(){printf("\n");printf("\t\t\t**************************\n");printf("\t\t\t* 欢迎使用*\n");printf("\t\t\t* 电话查询系统*\n");printf("\t\t\t**************************\n");printf("\t\t\t* *\n");printf("\t\t\t**************************\n");printf("\n");menu();}int main(){int i=0,j;student e;Sqlist p,q;InitList(L);start();while(scanf("%d",&i)){switch(i){case 1: stuIntsertList(L); break;case 2: ScanIn(L);break;case 3: Delete(L);break;case 4: ListTraverse(L,print);break;case 0: menu();break;default:wrong();}}return 0;}。

相关主题