我的代码:
#include "iostream"
using namespace std;
#include<malloc.h>
#define LEN sizeof(struct adapt)
struct adapt
{
int n;
struct adapt *next;
};
struct adapt *creat(int x)
{
struct adapt *head;
struct adapt *p1,*p2;
int n=0;
p1=p2=(struct adapt*) malloc(LEN);
cin>>p1->n;
head=NULL;
while(1)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct adapt*)malloc(LEN);
if(n<x)
cin>>p1->n;
else break;
}
p2->next=NULL;
return(head);
}
int search(struct adapt *p,int n)
{
int k=0;
if(p->next==NULL)
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}
else
{
while(p->next!=NULL)
{
k++;
if(p->n==n) break;
p=p->next;
}
if(p->next==NULL) return(-1);
else return(k);
}
}
struct adapt *del(struct adapt *head,int num)
{
struct adapt *p1,*p2;
if (head==NULL)
{
return(head);
}
else
{
p1=head;
while(num!=p1->n && p1->next!=NULL)
{p2=p1;p1=p1->next; }
if(num==p1->n)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
return(head);
}
}
struct adapt *insert(struct adapt *head,int n)
{
struct adapt *p=NULL;
struct adapt a={0,p};
struct adapt *stud;stud=&a;
stud->n=n;
if(head==NULL)
{stud->next=NULL;}
else
{
stud->next=head;
}
return(stud);
}
int main()
{
int n,m,s;
cin>>n>>m;
int *q=new int[m];
struct adapt* p;
p=creat(n);
for(int i=0;i<m;i++)
{
cin>>q[i];
}
for(int j=0;j<m;j++)
{
s=search(p,q[j]);
cout<<s<<endl;
p=del(p,q[j]);
p=insert(p,q[j]);
}
system("pause");
}
若输入参数为:
5 5
1 2 3 4 5
3 3 6 2 3
则程序出错。经调试发现,在主函数的第二个循环运行到第二次的时候,执行search函数,进入函数调试,当光标指向函数第一步时,参数正常;再下一步,参数值莫名其妙地在链表头处加了一个链结,且next为空。求解释!!为什么中间什么语句都没有参数居然突变了??
1说明
为了便于显示调试信息,我稍微修改了一下。
经过调试,首先发现insert函数有问题,问题如下,修改也如下;
//struct adapt a={0,p};//删除
//struct adapt *stud;stud=&a;不能返回局部变量地址,函数调用后局部地址被清除//删除该句
struct adapt *stud=(struct adapt*)malloc(LEN);//增加
其次search函数也有问题,search函数查找时,若最后一个结点与查找的数相同,会返回-1。
2图片
2.1最终运行图
2.2没有修改search函数时。
测试数据为
5 5
1 2 3 4 5
3 2 4 1 5
2.2修改search函数后
2.4没有调试信息的代码输出
3.代码如下
#include "iostream"
using namespace std;
#include<malloc.h>
#define LEN sizeof(struct adapt)
struct adapt//链表
{
int n;
struct adapt *next;
};
struct adapt *creat(int x)//创建含有x个元素的链表
{
struct adapt *head;
struct adapt *p1,*p2;
int n=0;
p1=p2=(struct adapt*) malloc(LEN);
cin>>p1->n;
head=NULL;
while(1)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct adapt*)malloc(LEN);
if(n<x)
cin>>p1->n;
else break;
}
p2->next=NULL;
return(head);
}
int search(struct adapt *p,int n)//在链表中查找数值为n的数,返回序号
{
cout<<"search:"<<n<<endl;//
int k=0;
if(p->next==NULL)
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}
else
{
while(p->next!=NULL)
{
k++;
if(p->n==n) break;
p=p->next;
}
if(p->next==NULL) ///*********先判断p是否为n,否则若最后一个数为n,会返回-1
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}////*********
//if(p->next==NULL) return(-1);
else return(k);
}
}
struct adapt *del(struct adapt *head,int num)//从链表中删除数值为num的数
{
cout<<"delete:"<<num<<endl;//
struct adapt *p1,*p2;
if (head==NULL)
{
return(head);
}
else
{
p1=head;
while(num!=p1->n && p1->next!=NULL)
{p2=p1;p1=p1->next; }
if(num==p1->n)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
return(head);
}
}
struct adapt *insert(struct adapt *head,int n)//在链表首部插入n
{
cout<<"insert:"<<n<<endl;
struct adapt *p=NULL;
//struct adapt a={0,p};
//struct adapt *stud;stud=&a;不能返回局部变量地址,函数调用后局部地址被清除
struct adapt *stud=(struct adapt*)malloc(LEN);//
stud->n=n;
if(head==NULL)
{stud->next=NULL;}
else
{
stud->next=head;
}
return(stud);
}
/*------------*/
void showLink(struct adapt * head)//显示链表信息
{
struct adapt * temp=head;
cout<<"Link Data:";//
while (head!=NULL)
{
cout<<"->"<<head->n;
head=head->next;
}
cout<<endl;
head =temp;
}
/*------------*/
int main()
{
int n,m,s;
cin>>n>>m;
int *q=new int[m];
struct adapt* p;
p=creat(n);
for(int i=0;i<m;i++)
{
cin>>q[i];
}
for(int j=0;j<m;j++)
{
cout<<"【Times:"<<j+1<<"】"<<endl;//----输出循环次数
s=search(p,q[j]);
showLink(p);//--------------显示查询后链表状况
cout<<s<<endl;
p=del(p,q[j]);
showLink(p);//---------显示删除结点后链表状况
p=insert(p,q[j]);
showLink(p);//--------显示插入结点后链表状况
}
system("pause");//系统命令,暂停
}
4.没有调试信息的代码
#include "iostream"
using namespace std;
#include<malloc.h>
#define LEN sizeof(struct adapt)
struct adapt
{
int n;
struct adapt *next;
};
struct adapt *creat(int x)
{
struct adapt *head;
struct adapt *p1,*p2;
int n=0;
p1=p2=(struct adapt*) malloc(LEN);
cin>>p1->n;
head=NULL;
while(1)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct adapt*)malloc(LEN);
if(n<x)
cin>>p1->n;
else break;
}
p2->next=NULL;
return(head);
}
int search(struct adapt *p,int n)
{
int k=0;
if(p->next==NULL)
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}
else
{
while(p->next!=NULL)
{
k++;
if(p->n==n) break;
p=p->next;
}
if(p->next==NULL) ///*********先判断p是否为n,否则若最后一个数为n,会返回-1
{
if(p->n==n)
{
k++;
return(k);
}
else return(-1);
}////*********
//if(p->next==NULL) return(-1);
else return(k);
}
}
struct adapt *del(struct adapt *head,int num)
{
struct adapt *p1,*p2;
if (head==NULL)
{
return(head);
}
else
{
p1=head;
while(num!=p1->n && p1->next!=NULL)
{p2=p1;p1=p1->next; }
if(num==p1->n)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
return(head);
}
}
struct adapt *insert(struct adapt *head,int n)
{
struct adapt *p=NULL;
//struct adapt a={0,p};
//struct adapt *stud;stud=&a;不能返回局部变量地址,函数调用后局部地址被清除
struct adapt *stud=(struct adapt*)malloc(LEN);//
stud->n=n;
if(head==NULL)
{stud->next=NULL;}
else
{
stud->next=head;
}
return(stud);
}
int main()
{
int n,m,s;
cin>>n>>m;
int *q=new int[m];
struct adapt* p;
p=creat(n);
for(int i=0;i<m;i++)
{
cin>>q[i];
}
for(int j=0;j<m;j++)
{
s=search(p,q[j]);
cout<<s<<endl;
p=del(p,q[j]);
p=insert(p,q[j]);
}
system("pause");
}
参考资料:自己写的
。。。会有结果啊,第一个数搜索3的话会输出位置是3,不过到第二个数的时候就出问题了。。既然第一次没有问题,为什么第二次循环会有问题?
C++中对象作为函数参数传递的问题
1.首先要明确void display(people x){...}是传值方式传参,实参要向形参复制对象,在复制对象时会调用拷贝构造函数。2.由于people类中没有显式定义拷贝构造函数,将使用默认拷贝构造函数不会自动复制堆资源(即通过new得到的资源)。3.因此void display(people x){...}执行时,会调用默认拷贝构造函...
C++编译报错:函数太多参数
看了好久竟然没有看出什么问题,看起来许是自己水准不够。唯一有所怀疑之处:试试将第九行改下,改成:int action(int a,int b);
c++中,在一个类中参数传递中出现的一个问题
double x_val,y_val;x_val=p1.getx();y_val=p1.gety();Point pTemp(x_val-X,y_val-Y);p1=pTemp;解决方法2:写个Point赋值的重载函数。void operator()(double x1,double y1){ x=x1;y=y1;} 将 p1=((p1.getx()-X),(p1.gety()+Y)); \/\/有问题的地方 改成:p1((p1....
C++关于函数调用的问题
所以传进去的参数必须是 int 型, int 型, char 型 在C++中,函数可以有默认的参数,如果调用的时候没有传某个参数,则这个参数使用默认值,如你这个例子, 第二个参数的默认值是 7, 第三个参数的默认值是'z'其次,使用默认值的时候,默认参数的顺序必须是固定的,不能掉过某个参数使用默认...
C++参数问题
idu|te卜(|ntv)来改变v的值,都是徒劳的。c语言里改变的只只能通过争取地址方式,进行传递,或许你会说传递数组就是传人递数组就是传递指针不是变值么,实际上,传递数组传递指针就是(或许对宿主来说,这个真有点特别)。\/\/注意:c里没有引用,C十十里才有,我们先来看一下有趣sWa函数。它用于...
c++虚函数问题,大神请进
1,对函数指针来说,指针值是函数地址,取*还是函数地址,所以相等看起来是没啥问题的。2,不能这么调用,成员函数是隐含带有this参数的,和普通函数不一样。对象内存的第一个指针是vtable(如果有),vtable是一个void **类型的指针,每一项都是一个函数指针,所以你的代码也是没法正确运行的。以下是...
C++字符串小问题,请大家帮个忙,很简单
所以在写传给子函数指针型数据时,如果不想(或不能)改变指针所指的数据,将指针的类型声明为const,即常量,这时可以防止在子函数里无意的改变其内容。但是对于简单的数据传递,由于是把数据复制到参数,子函数和主函数的数据完全不想干,就不用声明该数据是const型的。如果第一的参数也是const的,...
问各位大侠C++中参数在不同的cpp文件里怎么传递的问题。谢谢了
最简单的方法是定义一个duquxml.h头文件 里面定义一个 extern int a;然后在duquxml.cpp引用这个头文件,定义int a。而在myxml.cpp要用的话就extern int a; \/\/全局变量哦。还有你说的构造函数 是怎么样的 能不能贴出来看下啊。给个例子吧 在duquxml.cpp文件中 全局变量 定义 int a;在duqu...
C++ cout的问题
1,函数参数传递的顺序:传入函数的参数是由右至左,第一组和第二组的输出:22 32 22 32 2 + +运算符:一个功能的同时,我和我+ +等,属于C标准定义特定的编译器相关的内容。函数参数传递的顺序,你的结果只是理解。但是我运行在VC + +,结果如下:22 32 操作没有定义的结果 ...
c语言,c++问题,关于把整数逆序输出的代码看不明白求解释。
如楼上几位所说,这是一个递归调用。咱们举个例子来讲,假设main函数里面的x=123,那么第一次传入void f(int n)的就是123。接下来,看f(123)里面的执行情况,首先判断了传入的值数否小于10,答案肯定不是了,那么就进入else里面的内容,第一次的时候你明白了取了个位数,也就是第一位,把...