实验一 线性表的应用(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;
}