Sheldon的小本本 (10 分)

2 篇文章 0 订阅
本文通过一个关于美剧《Bigbang》的情境,介绍了如何使用链表来管理一个人讨厌的人名单。文章详细阐述了链表的初始化、插入、删除和查询操作,并提供了一个C语言实现的例子。读者可以通过这个例子了解链表数据结构的基本操作。
摘要由CSDN通过智能技术生成

《Big bang》是著名的美剧。在剧中Sheldon可以说是一个极品,真不知Leonard是如何忍受这位极品室友成天的唠叨。

你知道么?Sheldon有一个神秘的小本本,记录了所有他从小开始讨厌的人名。Stuart这位漫画店老板就是小本本的一员哦,谁叫他常常毫不客气地挤兑Sheldon,曾多次赌赢过Sheldon呢。

Penny是一个漂亮的女孩,好奇心也很强。为了满足她的好奇心,我当回编剧让她意外知道了Sheldon的那个小本本放在了哪里。于是她几乎每天都去看,看看上面有哪些人。但是那个小本本上的人名实在太多。要知道她可是没上过大学在饭店里面当服务员啊。请聪明的你帮帮她处理处理那个小本本吧。

Sheldon每天都会在小本本里记录些人名,当然有时也会与他们和好就会从小本本中将这个人名删除。我们假设Sheldon会在一个空的小本本上插入、删除、查询某个人。

要帮助Penny,你需要知道一个链表是怎么初始化、插入、删除以及查找的。

输入格式:

输入数据只有一组,有很多行。每行的格式可能是下列一种:

insert a name

delete name

show

search name

其中 a 是一个整数,代表在第a个名字前插入名字。name是一个姓名,只包含英文字母的大小写,每个名字不超过30个字符。
输入保证不会插入列表中已经存在的姓名,不会删除列表中不存在的姓名,不会搜索列表中不存在的姓名,也不会要求在非法的位置插入列表。

输出格式:

起始时,列表是空的。只输出show和search name 的结果。show将列表中的姓名全部输出,search只输出找到该名字的序号(从1开始)。每次输出占一行,姓名间用空格隔开。如果列表中没有名字了,show时也要输出一个空行。

输入样例:

在这里给出一组输入。例如:

insert 1 Stuart
insert 2 Bernadette
show
search Stuart
delete Stuart
show
insert 2 Stuart
show
insert 1 Amy
insert 2 Leslie
insert 3 Stephanie
show
delete Leslie
show
search Stuart

输出样例:

在这里给出相应的输出。例如:

Stuart Bernadette 
1
Bernadette 
Bernadette Stuart 
Amy Leslie Stephanie Bernadette Stuart 
Amy Stephanie Bernadette Stuart 
4

提示

1、名字是不含空格的,指令也是一定的,所以可以用scanf("%s", str)来读取。

2、题目要求每个输出占一行,所以要注意换行。

3、输入的行数是不确定的。必须用输入循环来读输入数据。例如
char cmd[10];
while (scanf("%s", cmd) == 1)
{
//Todo: 此处是你的代码
}

 #include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 #include<malloc.h>
 
 typedef struct Node
 {
 	char name[35];
 	struct Node *next;
 }node;
 
 void insert (node*L,int x,char name[])
 {
 	node*p;
 	p=L;
 	for(int i=0;i<x-1;i++)
 	{
 	  p=p->next;
	 }
	node*s;
 	s=(node*)malloc(sizeof(struct Node));
 	strcpy(s->name,name);
	s->next =p->next;
	p->next=s;
 }
 
 void show(node*L)
 {
 	L=L->next;
 	while(L!=NULL)
 	{
 		printf("%s ",L->name);
 		L=L->next; 
	 }
	 printf("\n");
 }
 
int search(node*L,char name[])
 {
 	node*p;
 	p=L;
 	int count=0;
 	while(p&&strcmp(p->name,name)!=0)
 	{
 		count++;
 		p=p->next;
	 }
	 printf("%d\n",count);
 }
 
void detele(node*L,char name[])
 {
 	node*p,*q;
 	p=L;
 	q=L;
 	while(p!=NULL)
 	{
 		if(strcmp(p->name,name)==0)
 		{
 			break;
		 }
		 else
		 {
		 	q=p;
		 	p=p->next;
		 }
	 }
	 q->next=p->next;
	 free(p);
 }
 
 int main()
 {
 	int x; 
 	int len=0;
 	node*L,*p;
    //L是指向链表头结点的指针
	//p是指针 
	L=(node*)malloc(sizeof(struct Node)); 
	p=L;//将L的地址赋给p 
	L->next=NULL;
 	char name[35];
 	char cmd[100];
 	while((scanf("%s",cmd))==1)
 	{
 		if(strcmp(cmd,"insert")==0)//增加 
 		{
 			scanf("%d %s",&x,name);
 			insert(L,x,name);
 			len++;
		 }
		 else if(strcmp(cmd,"show")==0)//展示
		 {
		 	show(L);
		  } 
		  else if(strcmp(cmd,"search")==0)//搜索
		  {
		  	 scanf("%s",name);
		  	 search(L,name);
		   } 
		   else if(strcmp(cmd,"delete")==0)//删除
		   {
		   	  scanf("%s",name);
		   	  detele(L,name);
		   	  len--;
			} 
	 }
 }

终于搞懂了链表的基本操作!! 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值