实验一 线性表的应用(2学时)

实验一  线性表的应用(2学时)

1、实验目的

通过本实验,掌握线性表链式存储结构的基本原理和基本运算以及在实际问题中的应用。

2、实验内容                                                      

  建立某班学生的通讯录,要求用链表存储。

  具体功能包括:

(1)可以实现插入一个同学的通讯录记录;

    (2)能够删除某位同学的通讯录;

    (3)对通讯录打印输出。

3、实验要求

(1)定义通讯录内容的结构体;

(2)建立存储通讯录的链表结构并初始化;                                                

(3)建立主函数:

       1)建立录入函数(返回主界面)

       2)建立插入函数(返回主界面)

       3)建立删除函数(返回主界面)

       4)建立输出和打印函数(返回主界面)

            I)通过循环对所有成员记录输出

           II)输出指定姓名的某个同学的通讯录记录

       5)退出

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
 struct student
{
char name[20];
char phone[11];
char number[15];
};
   typedef struct StuList
   {
    struct student info;
    struct StuList *next;
   }list;
   
   int menu()
   {
    int select;
    system("cls"); 
    printf("\t\t\t***********主菜单***********\n");
    printf("\t\t\t-----------------------------\n");
    printf("\t\t\t|*********1:显示************|\n");
    printf("\t\t\t|*********2:添加************|\n");
    printf("\t\t\t|*********3:删除************|\n") ;
    printf("\t\t\t|*********4:查找************|\n");
    printf("\t\t\t|*********5:插入************|\n") ;
    printf("\t\t\t|*********6:退出************|\n");
    printf("\t\t\t|---------------------------|\n");
    printf("请输入操作(1-6):");
    scanf("%d",&select);
    printf("\n");
    return select;
   }
 
   list *init(list *p)
   {
    list *q;
    q=(list*)malloc(sizeof(list));
    p->next=q;
    p=q;
    p->next=NULL;
    return p;
   }
   void print(list *p)//输出 
   {
    printf("\t学号:%s\t",p->info.number);
    printf("\t姓名:%s\t",p->info.name);
    printf("\t电话:%s\t",p->info.phone);
    printf("\n");
   }
    list *scanf(list *p)//输入 
   {
    printf("\t\t\t------------------------------\n");
    printf("\t\t\t请输入添加成员学号:");scanf("%s",p->info.number);printf("\n");
    printf("\t\t\t请输入添加成员姓名:");scanf("%s",p->info.name);printf("\n");
    printf("\t\t\t请输入添加成员电话:");scanf("%s",p->info.phone);
    printf("\t\t\t------------------------------\n");
    return p;
   }
   void display(list *p)//输出 
   {
    int i=1;
    if(p->next==NULL)printf("\t\t\t通讯录空的 请添加\n\n");
    else
    {
    printf("\n\t现有通讯录成员如下:\n\n");
    while(p->next)
    {
    printf("\t编号:%d\t",i++);
   print(p);
   p=p->next; 
   } 
   printf("\n");
   }
}
   list *add(list *p)//添加 
   { int n,i; 
    printf("请输入要录入学生个数的值n:");
   scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
   
    scanf(p);
    p=init(p);} 
    return p;
   }
   void *find(list *head,char *name)//查找 
   {
    list *p;
    p=head;
    if(!(head->next))printf("\n\t\t通讯录为空\n\n");
    else
   {
    printf("要查找的学生姓名:");
scanf("%s",name);
printf("\n");
while(p)
{
if(strcmp(p->info.name,name)==0)break;
else p=p->next;

if(p)
{
printf("\n\t%s 通讯录如下:\n\n",name);
print(p); 
}
    else printf("\n\t\t不存在该学生\n\n");
   }
   } 
   list *dele(list *head,char *name)//删除 
   {
    list *p,*q;
    p=head;
    if(!(head->next))printf("\n\t\t\t通讯录为空\n\n");
    else
{
printf("请输入要删除的同学姓名");
scanf("%s",name);
printf("\n");
while(p)
{
if( strcmp(p->info.name,name)==0 ) break; 
else
{q=p; 
p=p->next;


if(p)
{
if(p==head) head=head->next;
else q->next=p->next;
free(p);
printf("\n\t删除成功:\n\n");
print(p); 
}
    else printf("\n\t\t删除失败:\n\n");
   }
   return head; 
   } 
    list *numberfind(list *head,int i)
   {
    int j=1;
   list *p=head;
   list *q=head;
    if(i<1)
   {
   printf("\n\t\t通讯录为空\n\n");
   p->next=NULL;
   }
   
while(p->next&&i!=j)
{
q=p;
p=p->next;
j++;

if(!(p->next))
{
printf("\n\t输入有误!!!:\n\n");
}
    return q;
   } 
   list *insert(list *head)
   {
     int i;
    list *p,*q;
    if(!(head->next))printf("\n\t\t\t通讯录为空\n\n");
    else
{
printf("请输入要插入的位置");
scanf("%d",&i);
q=numberfind(head,i);
printf("\n");
if(q->next!=NULL)
{
if(i==1)
{
p=(list*)malloc(sizeof(list));
p=scanf(p);
    p->next=head;head=p; 

else if
(q->next->next!=NULL)
{
p=(list*)malloc(sizeof(list));
p=scanf(p);p->next=q->next;
q->next=p;
}
}
   }
   return head; 
   } 
   int main()
   {
    list *p,*head;
    p=(list*)malloc(sizeof(list));
    p->next=NULL;
    head=p;
    char name[10];
    int select=1;
    while(select)
    {
    switch(menu())
    {
    case 1:display(head);break;
    case 2:p=add(p);break;
    case 3:head=dele(head,name);break;
    case 4:find(head,name);break;
    case 5:head=insert(head);break;
    case 6:{ printf("退出成功");
                return 0;}break;
    default:printf("\n\t\t\t WRONG!请重新输入\n\n");
   }
   }
   return 0;
}
   
   
   
   
   
   
   
   
   

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值