实验一 线性表的实验

实验一  线性表的实验

实验课程名 数据结构

专业班级:      学号:    姓名:  

实验时间:   实验地点:    指导教师:       

一、实验目的和要求

1、掌握用Visual C++6.0调试顺序表的基本方法。

2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。

3、掌握用Visual C++6.0上机调试单链表的基本方法。

4、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现。

5、进一步掌握循环单链表的插入、删除、查找算法的实现。

二、实验内容

任务一:用顺序表实现通讯录管理

  1. 构建通讯录的顺序表并输出检验。
  2. 增加插入记录的功能并输出检验。

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)程序运行结果:

三、结论

掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。

掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现。

掌握循环单链表的插入、删除、查找算法的实现。

第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计与实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值