我是编程新手。我编写了以下程序,使用链表交换列表中的两个连续数字。例如。 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;
}
答案 0 :(得分: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,然后将其重新分配给头部。
这些陈述中存在同样的错误
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