实验2链表的定义及其相关操作算法的实现副本副本Word格式.docx
- 文档编号:21746592
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:18.55KB
实验2链表的定义及其相关操作算法的实现副本副本Word格式.docx
《实验2链表的定义及其相关操作算法的实现副本副本Word格式.docx》由会员分享,可在线阅读,更多相关《实验2链表的定义及其相关操作算法的实现副本副本Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
ListNode*p;
//定义一个指向结点的指针变量
LinkListhead;
//定义指向单链表的头指针
3.主控菜单设计要求
程序运行后,给出6个菜单项的内容和输入提示:
1.通讯录链表的建立
2.通讯者结点的插入
3.通讯者结点的查询
4.通讯者结点的删除
5.通讯录链表的输出
0.退出管理系统
请选择0——5
使用数字0——5来选择菜单项,其他输入则不起作用。
选做内容要求:
约瑟夫(Joseph)问题的一种描述是:
30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分。
因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难。
无奈,大家只好同意这种办法,并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海,然后再从他的下一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。
问哪些位置是将被扔下大海的位置?
1.利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各人的编号。
2.为了不失一般性,将30改为一个任意输入的正整数n,而报数上限(原为9)也为一个任选的正整数k。
这样该算法描述如下:
(1)创建含有n个结点的单循环链表;
(2)生者与死者的选择:
p指向链表第一个结点,初始i置为1;
while(i<
=n/2)//删除一半的结点
{从p指向的结点沿链前进k-1步;
删除第k个结点(q所指向的结点);
p指向q的下一个结点;
输出其位置q->
data;
i自增1;
}
(3)输出所有生者的位置。
3.测试结果
对于总人数30,报数上限为9,则
死者编号为:
9,18,27,6,16,26,7,19,30,12,24,8,22,5,23
生者编号为:
1,2,3,4,10,11,13,14,15,17,20,21,25,28,29
实验结果
1、演示程序运行结果。
2、说明调试过程中出现的现象
学生实验评价依据:
优:
实验认真、刻苦,有钻研精神,不无故缺席。
良:
能认真对待实验,不无故缺席。
中:
基本能认真对待实验,不无故缺席。
差:
对待实验不够认真,有少量迟到、早退或无故缺席现象。
不及格:
对待实验马虎、敷衍,经常迟到、早退或无故缺席。
通讯录管理
#include"
stdio.h"
#include<
string.h>
stdlib.h"
typedefstructstudent{//通讯录结点类型
charnum[10];
//学号
charname[20];
charmajor[20];
//专业
charphone[20];
charaddr[30];
}DataType;
typedefstructnode{//结点类型定义
DataTypedata;
structnode*next;
}ListNode,*LinkList;
//*************************菜单显示*****************************//
voidmenu_select()
{
system("
cls"
);
printf("
通讯录管理系统\n"
=============================================\n"
1.通讯者结点的插入\n"
2.通讯者结点的删除\n"
3.通讯者结点的查询\n"
4.通讯录链表的输出\n"
5.返回原菜单\n"
0.退出通讯录管理系统\n"
请选择0-5:
"
}
//**************************通讯链表的建立*************************//
voidCreateList(LinkList&
head){
head=(LinkList)malloc(sizeof(ListNode));
head->
next=NULL;
//**************************通讯录结点的插入*************************//
voidInsertNode(LinkList&
head)
{
**************************通讯录结点的插入*************************\n"
charflag;
do{
LinkListp,q=head->
next,r=head;
请输入节点信息:
\n"
p=(LinkList)malloc(sizeof(ListNode));
//申新结点
请输入学号:
scanf("
%s"
p->
data.num);
请输入姓名:
data.name);
请输入专业:
data.major);
请输入电话:
data.phone);
请输入地址:
data.addr);
while(q&
&
!
(strcmp(p->
data.num,q->
data.num)<
0))
{
r=q;
q=q->
next;
}
r->
next=p;
p->
next=q;
printf("
插入成功\n"
Wouldyouliketocontinuetoinsert(y/n)"
%*c%c"
&
flag);
}while(flag=='
y'
||flag=='
Y'
input0:
exit5:
returnthemenu:
"
//**************************通讯者结点的查询**************************//
ListNode*ListFind(LinkListhead)
{//有序通讯录链表上的查找
LinkListp=head->
charname[9];
intxz;
=====================================================================\n"
1.按学号查询\n"
2.按姓名查询\n"
3.按专业查询\n"
请选择:
%d"
xz);
if(xz==1)
{
请输入要查找者的学号:
scanf("
num);
while(p&
strcmp(p->
data.num,num)!
=0)
p=p->
elseif(xz==2)
请输入要查找者的姓名:
name);
while(p&
data.name,name)!
elseif(xz==3)
请输入要查找者的专业:
major);
data.major,major)!
returnp;
//***************************通讯者结点的删除****************************//
voidDelNode(LinkList&
*********************通讯录信息的删除**********************\n"
charjx;
charflag;
LinkListp,q=head;
if(!
head->
next)
该链表为空,请向链表中插入记录!
else
do{
p=ListFind(head);
//调用查找函数
if(p==NULL)
{
printf("
没有查到要删除的通讯者!
gotojump;
}
printf("
真的要删除该结点吗?
(y/n):
scanf("
jx);
if(jx=='
||jx=='
)
while(q&
q->
next!
=p)
q=q->
q->
next=p->
//删除结点
free(p);
//释放被删结点空间
通讯者已被删除!
jump:
Wouldyouliketocontinuetodelete(y/n)"
//***************************通讯录链表的输出*****************************//
voidPrintList(LinkListhead)
LinkListp;
p=head->
编号姓名专业电话地址\n"
\n"
while(p!
=NULL)
%-12s%-10s%-11s%-14s%-8s\n"
data.num,p->
data.name,p->
data.major,p->
data.phone,p->
p=p->
//后移一个结点
voidprint(DataTypee)
e.num,e.name,e.major,e.phone,e.addr);
voidSearchNode(LinkListhead,void(*vi)(DataType))
*********************通讯录信息的查询**********************\n"
p=ListFind(head);
if(p==NULL)
没有查到要查询的通讯者!
else
vi(p->
data);
Wouldyouliketosearch?
(y/n)"
voidmain()
{inti;
LinkListhead;
CreateList(head);
menu_select();
i);
while(i)
switch(i)
case1:
InsertNode(head);
break;
////通讯录信息的插入
case2:
DelNode(head);
//通讯录信息的删除
case3:
SearchNode(head,print);
//通讯录信息的查询
case4:
PrintList(head);
//通讯录链表的输出
case5:
menu_select();
case0:
\t**您已选择退出文件管理系统,谢谢您的使用!
**\n"
约瑟夫环
#include<
stdio.h>
malloc.h>
#defineNULL0
#defineLENsizeof(structlist)
structlist
intnum;
structlist*next;
};
intn,k;
structlist*creat(void)//创建空间
structlist*head;
structlist*p1,*p2;
n=1;
head=(structlist*)malloc(LEN);
p2=head;
while(n<
30)
p1=(structlist*)malloc(LEN);
p2->
next=p1;
p2=p1;
n++;
next=head;
return(head);
}
list*search(structlist*head1)//查找要删除的人
intk=1,n=1;
structlist*p3,*p4;
p4=head1;
while(k<
=15)
if((n+1)%9==0)
p3=p4->
p4->
next=p3->
%d"
p3->
num);
free(p3);
k++;
p4=p4->
n++;
return(head1);
voidprint(structlist*head)
list*p;
p=head;
k=1;
{
inti=1;
structlist*head,*p,*head1;
head=creat();
while(i<
=30)
num=i;
i++;
thenumberofpeoplewhowilldie:
head1=search(head);
puts("
theleftpeople:
print(head1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验2链表的定义及其相关操作算法的实现 副本 实验 定义 及其 相关 操作 算法 实现