我是编程新手。我写了下面的程序来交换两个连续的数字在一个列表使用链表。如。1 2 3 4 5 6将显示为2 1 4 3 6 5。但事实证明,在编译时没有错误,但当这段代码运行时,它没有提供所需的更新。有人能帮我一下吗?
#include <iostream>
using namespace std;
struct node{
int data;
node *next;
};
int main(){
node* head;
head=NULL;
node *temp= new node;
temp->data=1;
temp->next=NULL;
head=temp;
int p=2;
while(p%6!=0){
node* temp1= new node;
temp1->data=p;
temp1->next=NULL;
temp->next=temp1;
temp=temp->next;
p++;
}
node* t1=new node;
t1=head;
while(t1!=NULL){
cout<<t1->data<<endl;
t1=t1->next;
}
t1=head;
node* t2=new node;
t2=t1->next;
cout<<p;
while(t1!=NULL || t1->next!=NULL){
p=t1->data;
cout<<p;
t1->data=t2->data;
t2->data=p;
t1=t1->next->next;
}
t1=head;
while(t1!=NULL){
cout<<t1->data<<endl;
t1=t1->next;
}
return 0;
}
使用这个循环
while(p%6!=0){
node* temp1= new node;
temp1->data=p;
temp1->next=NULL;
temp->next=temp1;
temp=temp->next;
p++;
}
你将不会得到数据等于6的节点:)当p等于6时,循环将不会迭代。
在这些语句中存在内存泄漏
node* t1=new node;
t1=head;
,因为你首先将新分配的内存地址分配给t1,然后用head重新分配。
同样的错误存在于以下语句
node* t2=new node;
t2=t1->next;
这个循环中有不正确的条件
while(t1!=NULL || t1->next!=NULL){
必须有
while(t1!=NULL && t1->next!=NULL){
或
while(t1!=NULL && t2!=NULL){
同样在循环体中,不能重新赋值t2。
下面是一个示例,它与您正在尝试做的相同
#include <iostream>
#include <algorithm>
struct node
{
int data;
node *next;
};
int main()
{
node *head = NULL;
node **tmp = &head;
for ( int i = 1; i <= 6; i++ )
{
*tmp = new node { i, NULL };
tmp = &( *tmp )->next;
}
for ( tmp = &head; *tmp; tmp = &( *tmp )->next )
{
std::cout << ( *tmp )->data << ' ';
}
std::cout << std::endl;
for ( tmp = &head; *tmp && ( *tmp )->next; tmp = &( *tmp )->next->next )
{
std::swap( ( *tmp )->data, ( *tmp )->next->data );
}
for ( tmp = &head; *tmp; tmp = &( *tmp )->next )
{
std::cout << ( *tmp )->data << ' ';
}
std::cout << std::endl;
tmp = &head;
while ( *tmp )
{
node *current = *tmp;
tmp = &( *tmp )->next;
delete current;
}
return 0;
}
输出为
1 2 3 4 5 6
2 1 4 3 6 5