分段错误

时间:2014-08-22 21:58:08

标签: c++ linked-list

我是编程新手。我编写了以下程序,使用链表交换列表中的两个连续数字。例如。 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;
}

1 个答案:

答案 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 
相关问题