模拟链表....

模拟链表

先说句题外话:希望疫情早日接除,害!

前言

模拟链表就是用数组来模拟指针,用两个数组,一个数组data用来储存数据,数组right用来连接,其实就相当于链表里面int型变量data和结构体指针struct node *next;关于链表的相关内容我之前也写过了,有兴趣的可以点进去看看:

链表

故事开端

看完模拟链表感觉这东西真的有点玄妙…不想链表那么直接,最后我看懂之后对着书敲了一遍,本来想在妹妹面前装个*,毕竟她还小,我让她随便由小到大报串数字(比如说:2 3 4 5 6 7 -1),最后让她说加上一个1,结果加不到第一个位置,搞得我尴尬死了…附上书上代码(懒得打,拍下算了哈):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这就是不能把值放到第一个的代码,没办法还是得自己改一下,原因就是这段代码(第三张图片第五行开始//第四张图片):

//第三张图片
if (data[right[t]]>data[len]
{
	right[len]=right[t];
	right[t]=len;
	break;
}
//and第四张图片
t=1

这里先解释一下这个数组right的意思就是当前序列中的元素的右边是哪个元素,如图:
在这里插入图片描述
这样就可以用数组right将数组data“连起来”。但是这个代码的漏洞是它是从t=1开始读值,不可避免的就会先去读data[1],所以数字就无法插到首列。

发展

下面是我的改动版,献丑:

创建模拟链表

#include<stdio.h>
int main()
{
	int data[101],right[101];
	int wei=1,t,last,z,x,old,replace,flag=1,del,find,cnt=0;
	while(scanf("%d",&data[wei])&&data[wei]!=-1){//循环输入,-1是结束控制符。
		right[wei]=wei+1;//同时数组right负责将输入的数组串在一起。
		++wei;
	}
	right[wei-1]=-1;/*最后一个位置的右边没有数字,因此最后一个数字的右边为-1,代表结束。*/

链表算是创建完了,和书上的差不多,只是多加了几个变量好方便下面的增删改查。

增加

		last=wei;
		++last;
		scanf("%d",&data[last]);
		t=1;
		while(t!=-1){
			if(data[right[t]]>data[last]){
			//将第一种情况分开讨论,用了0位置。 
				if(t==1){ 
					data[0]=data[1];1位置的值交给0
					data[1]=data[last];新插入的值交给1位置
					z=right[1];/*借助中间变量z将0和1连在一起,使1位置指向0位置,0位置连着2位置*/
					right[1]=0;
					right[0]=z;
					break;
				} 
				//和书上的一样。
				else{
					right[last]=right[t];
					right[t]=last;
					break;
				}
			}
			t=right[t];
		}

这样的话就可以在第一个位置放值了,如果有问题,敬请斧正。

删除

删除的思路和链表锻炼一样,无非就是跳过那个值就行了。

	scanf("%d",&del); //输入像删除的数
		t=1;//从1位置开始
		while(t!=-1){
			if(data[t]==del){
				right[t-1]=right[t];//跳过该位置,注意数组right是记录下一位置的
				flag=0;
				break;
			}
			t=right[t];//否则继续前进
		} 

修改

修改感觉是最简单的,只需要改一下值,当然我这是最简单的修改。

	scanf("%d%d",&old,&replace);
		t=1;
		while(t!=-1){
			if(data[t]==old){
				data[t]=replace;
				flag=0;
			}
			t=right[t];
		} 

查找

	scanf("%d",&find);
		t=1;
		 while(t!=-1){
		 	if(data[t]==find){
		 		printf("系统提示:该数字在%d位置。\n",cnt);
				flag=0;
			}
		++cnt;//记录位置,从0开始,已初始化
	 	t=right[t]; 

高潮

把他们整合到一起给我妹妹玩,虽然还是有些小问题…

#include<stdio.h>
int main()
{
	int data[101],right[101];
	char zhi; 
	int wei=1,t,last,z,x,old,replace,flag=1,del,find,cnt=0;
	printf("请输入一串数列,注意从小到大的顺序呢,最后请以-1结尾。\n"); 
	while(scanf("%d",&data[wei])&&data[wei]!=-1){
		right[wei]=wei+1;
		++wei;
	}
	right[wei-1]=-1;
	out1:
	printf("请输入您要操作的指令代号:\n1.增加数字;\n2.修改数字;\n3.删除数字;\n4.查找数字\n");
	scanf("%d",&x);
	switch(x){ 



//	增加
	case 1: 
		t=1;
		last=wei;
		++last;
		printf("请输入您要增加的数字,并按回车键结束。\n"); 
		scanf("%d",&data[last]);
		t=1;
		while(t!=-1){
			if(data[right[t]]>data[last]){ 
				if(t==1){ 
					data[0]=data[1];
					data[1]=data[last];
					z=right[1];
					right[1]=0;
					right[0]=z;
					break;
				} 
				else{
					right[last]=right[t];
					right[t]=last;
					break;
				}
		
			}
			t=right[t];
		}
		printf("一顿骚操作之后增加后的新数列:\n"); 
		t=1;	
		while(t!=-1){
			printf("%d ",data[t]);
			t=right[t];
		}
		printf("\n");
		printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		out2:
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 
		break;



//	//修改 
	case 2:
		printf("请输入您原数列中的某个数字和它被修改成的数字,并按回车键结束。\n");
		scanf("%d%d",&old,&replace);
		t=1;
		while(t!=-1){
			if(old==data[t]){
				data[t]=replace;
				flag=0;
			}
			t=right[t];
		} 
		if(flag){
			printf("系统提示:您提供的数字有问题!!!\n");
			printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	 
		}
		else{ 
			printf("新数列是:\n");
			t=1;	
			while(t!=-1)
			{
				printf("%d ",data[t]);
				t=right[t];
			}
			printf("\n");
		printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	
		}
		flag=1; 
		break; 



	//删除
	case 3:  
		printf("请输入想要删除的数字,并按回车键结束。\n");
		scanf("%d",&del); 
		t=1;
		while(t!=-1){
			if(data[t]==del){
				right[t-1]=right[t];
				flag=0;
				break;
			}
			t=right[t];
		} 
		if(flag)
			printf("系统提示:没有找到您要找的数。\n");
			printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	
		else{
			printf("(嚯嚯嚯!!!)新数列:\n");
			t=1;	
			while(t!=-1){
				printf("%d ",data[t]);
				t=right[t];
			}
			printf("\n");
		printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		printf("lala");
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	
		}
		flag=1;
		break;




	//查找
	case 4:
		printf("请输入您要查找的数字,并按回车键结束。\n");
		scanf("%d",&find);
		t=1;
		 while(t!=-1){
		 	if(data[t]==find){
		 		printf("系统提示:该数字在%d位置。\n",cnt);
				flag=0;
				cnt=0;
		printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	
			}
		++cnt;
	 	t=right[t];
		}	
		if(flag){
			printf("系统提示:未查找到您提供的数字。\n"); 
		printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	
		}
		flag=1;
		break;
	default:
		printf("系统提示:您所输入的指令不存在。\n");
		printf("您还要进行其他的操作吗?\n是:输入y按回车结束。\n不用:输入n结束。\n");
		scanf("%c",&zhi);
		if(zhi=='y')
			goto out1;
		if(zhi!='y'&&zhi!='n'){ 
			printf("请输入正确的指令!\n");
			goto out2;
		} 	
		break;
	}
}

没有结局,戛然而止了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值