模拟链表
先说句题外话:希望疫情早日接除,害!
前言
模拟链表就是用数组来模拟指针,用两个数组,一个数组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;
}
}
无
没有结局,戛然而止了。