实验一 线性表的实验
实验课程名: 数据结构
专业班级: 学号: 姓名:
实验时间: 实验地点: 指导教师:
一、实验目的和要求 1、掌握用Visual C++6.0调试顺序表的基本方法。 2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。 3、掌握用Visual C++6.0上机调试单链表的基本方法。 4、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现。 5、进一步掌握循环单链表的插入、删除、查找算法的实现。 |
二、实验内容 任务一:用顺序表实现通讯录管理
3、增加按学号查找的功能并运行验证。 4、增加删除记录的功能并运行验证。 (1)源代码如下: #include<stdio.h> #include<stdlib.h> #include <string.h> #define list_size 5 #define list_initcrement 10 //声明顺序表元素的类型 typedef struct{ char xuehao[14];//学号 char name[20]; //姓名 int sex; //性别 char tel[14]; //联系电话 char qq[12]; //QQ号 }ElemType; typedef struct { ElemType *elem; //存放一个元素或者说一个节点的基地址 int length; int listsize; }SeqList; //顺序表的初始化 void initSeqlist(SeqList &L){ char flag; //用来标识是否进行输入 int i,n; //标识当前输入的第几个参数;用来标识要初始化参数的个数 L.elem=(ElemType*)malloc(list_size*sizeof(ElemType)); L.length=0; L.listsize=list_size; printf("空表初始化完成"); if(flag=='N'||flag=='n')return; printf("请输入要初始化的参数个数: "); scanf("%d",&n); if(n>L.listsize){ printf("对不起您要输入的参数个数多余我们所初始化的空间了"); return; } ElemType *p; p=L.elem; for(i=0;i<n;i++){ printf("请输入第%d个数据(学号 姓名 性别(0或1) 联系电话 QQ号):\n",i+1);//每次输入完毕后i+1 scanf("%s%s%d%s%s",p[i].xuehao,p[i].name,&p[i].sex,p[i].tel,p[i].qq); L.length+=1; printf("当前顺序表中参数个数为:"); printf("%d\n",L.length); } printf("参数录入完毕\n"); } //输出顺序表中的元素 int printSeqlist(SeqList &L) { if(L.length==0){ printf("您的表还是空表,请先进行初始化操作"); return 0; } printf("学号 姓名 性别 联系电话 QQ号\n"); int i; for(i=0;i<=L.length-1;i++){ printf("%s\t%s\t",L.elem[i].xuehao,L.elem[i].name); if(L.elem[i].sex)printf("男"); else printf("女"); printf("\t%s\t%s\n",L.elem[i].tel,L.elem[i].qq) ; } printf("当前表中元素个数是:"); printf("%d",L.length); printf("还剩下%d个位置:\n",L.listsize-L.length); return 1; } //插入数据,向L表中的第i个位置,插入数据元素e int insertSqelist(SeqList &L,int i,ElemType &e){ if(L.length>=L.listsize){ printf("表满插入失败"); return 0; } if(i<1||i>L.length+1){ printf("插入的位置错误"); return 0; } ElemType *p,*q; //声明一个节点类型 q=L.elem+i-1; //获取第i个元素的地址 for(p=L.elem+L.length-1;p>=q;p--){//判断条件里面必须要有等于号,不然的话原先第i的值会被丢弃掉且原先的第i+1为空值 *(p+1)=*p; } *q=e; //把e的地址赋 L.length++; return 1; } //根据学号查找该学生的信息 int LocateList(SeqList &L,ElemType &e){ int i; printf("您要查找的元素信息为:\n"); for(i=0;i<=L.length-1;i++){ if(strcmp(L.elem[i].xuehao, e.xuehao)==0){ printf("%s\t%s",L.elem[i].xuehao,L.elem[i].name); if(L.elem[i].sex)printf(" 男"); else printf("女"); printf("\t%s\t%s\n",L.elem[i].tel,L.elem[i].qq) ; } } return 0; } int InsetElemType(SeqList &L,ElemType &e){ printf("请输入要插入的数据(学号 姓名 性别(0或1) 联系电话 QQ号):\n"); scanf("%s%s%d%s%s",e.xuehao,e.name , &e.sex , e.tel ,e.qq ); printf("学号 姓名 性别 联系电话 QQ号\n"); printf("%s\t%s\t",e.xuehao,e.name ); if(e.sex) printf("男"); else printf("女"); printf("\t%s\t%6s\n", e.tel ,e.qq ); printf("请输入你要在那个位置插入这个节点:"); int i; scanf("%d",&i); insertSqelist(L,i,e); printSeqlist(L); return 1; } //按照学生序号进行删除该元素或者说是记录 int DeleteSeqList(SeqList &L,ElemType &e){ int i; ElemType *p,*q; for(i=0;i<L.length-1;i++){ if(strcmp(L.elem[i].xuehao,e.xuehao)==0){ (*p)=L.elem[i];//表示e.xuehao所对应的元素位置 e=*p; q=L.elem+L.length;//尾元素的位置 for(++p;p<=q;++p){ *(p-1)=*p; } --L.length; }else{ printf("没有该学号\n"); return 0; } } return 0; } int main(){ SeqList L; //声明一个顺序表类型; ElemType e; //声明一个节点类型 int choice; do{ printf(" 通讯录管理系统\n"); printf("======================================\n"); printf(" 0:退出\n"); printf(" 1:初始化顺序表\n"); printf(" 2:插入\n"); printf(" 3:删除\n"); printf(" 4:查询\n"); printf(" 5:输出\n"); printf("======================================\n"); printf("请选择0-5\n"); scanf("%d",&choice); while(choice<1||choice>6){ printf("输入错误重新输入"); scanf("%d",&choice); } switch(choice){ case 0:exit(1); case 1:initSeqlist(L);break;//初始化顺序表,通过键入记录的方式 case 2:InsetElemType(L,e);break; case 3: printf("请输入要删除记录的学号:\n"); scanf("%s",e.xuehao); printf("要删除的学号为%s\n",e.xuehao); DeleteSeqList(L,e); break; case 4: printf("请输入要查询的学号:\n"); scanf("%s",e.xuehao ); printf("要查询的学号为%s\n",e.xuehao); LocateList(L,e); break; case 5:printSeqlist(L);break; } }while(choice); return 0 ; }(2)程序运行结果: 任务一: 任务二:用链表实现通讯录管理 1、构建通讯录的链表并输出检验 2、增加插入记录的功能并输出检验。 3、增加按学号查找的功能并运行验证。 4、增加删除记录的功能并运行验证。 (1)源代码如下: #include"stdio.h" #include"stdlib.h" #include"string.h" #define MaxSize 100 typedef struct{ char xuehao[14];//学号 char name[20]; //姓名 int sex; //性别 char tel[14]; //联系电话 char qq[12]; //QQ号 }ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; LinkList CreatList()//头插法建立链表 { LinkList head; LNode *p; char flag='y'; head=(LNode *)malloc(sizeof(LNode));//生成头结点 head->next =NULL; while((flag=='Y')||(flag=='y')) { p=(LNode *)malloc(sizeof(LNode)); if(!p) exit(-1); printf("请输入数据(学号 姓名 性别(0或1) 联系电话 QQ号):\n"); scanf("%s%s%d%s%s",p->data.xuehao,p->data.name,&p->data.sex,p->data.tel,p->data.qq); p->next =head->next ; head->next =p; getchar(); printf("继续输入吗?(y/n)"); scanf("%c",&flag); } return head; } void PrintList(LinkList head) { LNode *p; p=head->next ; printf("学号 姓名 性别 联系电话 QQ号\n"); printf("------------------------------------------------------------\n"); while(p!=NULL) { printf("%-14s%-14s",p->data.xuehao,p->data.name); if(p->data.sex) printf("男 \t\t"); else printf(" 女\t\t"); printf("%-14s%-10s\n",p->data .tel,p->data.qq); printf("----------------------------------------------------------\n"); p=p->next ; } } void InsertLinkList(LinkList *head) { LNode *p,*s; int i; int j; p=*head; j=1; printf("请输入要插入结点位置:"); scanf("%d",&i); while(p&&(j<i-1)) { p=p->next ; j++; } if(!p||j<i-1) {printf("错误!\n");return;} s=(LNode *)malloc(sizeof(LNode)); printf("请输入要插入的数据:\n"); printf("学号 姓名 性别(0或1) 联系电话 QQ号\n"); scanf("%s%s%d%s%s",s->data.xuehao,s->data.name,&s->data.sex,s->data.tel,s->data.qq); s->next =p->next ; p->next =s; return; } void GetElemList(LNode *head,ElemType *e) { LNode *p; int i,j=1; printf("请输入要读取第几个元素:"); scanf("%d",&i); p=head->next; while(p&&j<i) { p=p->next ;j++; } if(!p||j>i) {printf("没有找到!\n");return;} printf("学号 姓名 性别(0或1) 联系电话 QQ号\n"); printf("%-14s%-14s",p->data.xuehao,p->data.name); if(p->data.sex) printf(" 男 "); else printf(" 女 "); printf("%-14s%-10s\n",p->data .tel,p->data.qq); e=&p->data; } int DeleteElemLinkList(LinkList *head,ElemType *e) { LNode *p,*q; int i; int j; p=*head; j=1; printf("请输入要删除结点位置:"); scanf("%d",&i); while(p&&(j<i)) { p=p->next ; j++; } if(!p||j<i) {printf("错误!\n");return 0;} q=p->next ;e=&q->data ;p->next =q->next ; free(q); return 1; } int main() { LinkList head; ElemType *e=NULL; int choice; do { printf(" 通讯录管理系统\n"); printf("======================================\n"); printf(" 0:退出\n"); printf(" 1:建立通讯录\n"); printf(" 2:插入\n"); printf(" 3:删除\n"); printf(" 4:查询\n"); printf(" 5:输出\n"); printf("======================================\n"); printf("请选择0-5\n"); scanf("%d",&choice); while(choice<0||choice>5) { printf("输入错误,请重新输入:"); scanf("%d",&choice); } switch(choice) { case 0:exit(1); case 1:head=CreatList();break; case 2:InsertLinkList(&head);break; case 3:DeleteElemLinkList(&head,e);break; case 4:GetElemList(head,e);break; case 5:PrintList(head);break; } }while(choice); } (2)程序运行结果: |
三、结论 掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。 掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现。 掌握循环单链表的插入、删除、查找算法的实现。 |