2013-09-06 1 views
2

Я получаю эту ошибку во время выполнения.Нарушение доступа к связанным спискам

Вы видите, что я был свободный (темп) до соиЬ < < statements.I удален them.I подумал, что это из-за плохого разыменования оказывается его что-то больше к нему.

Это моя программа:

#include "stdafx.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <iostream> 

using namespace std; 

struct node{ 
    int data; 
    node* next; 
}; 

node* head=NULL; 
node* current=NULL; 

void insert_node() 
{ 
    int num=0; 
    cout<<"\nEnter the value of the node to insert\n:"; 

    cin>>num; 

    if(head==NULL) 
    { 
     head=(node*)malloc(sizeof(*head)); 
     //current=(node*)malloc(sizeof(*current)); 
     head->data=num; 
     head->next=NULL; 
     current=head; 
     cout<<"Created list\n"; 

    } 
    else 
    { 
     node* temp=(node*)malloc(sizeof(*temp)); 
     temp->data=num; 
     temp->next=NULL; 
     current->next=temp; 
     current=temp; 
     cout<<"Added element\n"; 
     free(temp); 
     cout<<"dereferenced element\n"; 

    } 
} 

void delete_node() 
{ 

    if(head!=NULL && head->next==NULL )//only one node 
    { 

     current=head=NULL; 
     cout<<"Deleted Head\n"; 
    } 
    else if(head!=NULL && head->next!=NULL)//>= 2 nodes 
    { 
     node* temp; 
     //temp=NULL; 
     temp=head; 
     while(temp->next!=current) 
     { 
      temp=temp->next; 
     } 
     temp->next=NULL; 
     current=temp; 
     cout<<"Deleted last element\n"; 
     // free(temp); 
     cout<<"Dereferenced temp\n"; 
    } 
    else 
    { 
     cout<<"delete was not performed"; 
    } 
} 

void list_linked_list() 
{ 
    node* temp=(node*)malloc(sizeof(* temp)); 

    temp=head; 

    while(temp!=NULL) 
    { 

     cout<<temp->data<<"->"; 
     temp=temp->next; 

    } 
    cout<<"displayed list\n"; 
    //free(temp); 
    cout<<"dereferenced temp"; 
} 

void search_node() 
{ 
    cout<<"\nenter a number to search"; 
    int search=0,found=0; 
    cin>>search; 

    node* temp=(node*)malloc(sizeof(* temp)); 
    temp=head; 
    while(temp!=NULL) 
    { 
     if(temp->data==search) 
      found=1; 
    } 
    if(found==1) 
     cout<<"found\n"; 
    else 
    cout<<"not found\n"; 
    //free(temp); 
    cout<<"dereferenced temp"; 
} 


void main() 
{ 

    int n=0; 
    k: 
    cout<<"Linked List operations: \n1. insert \n2. delete \n3. search\n 4. view List \n5. Exit"; 
    cin>>n; 

    switch(n) 
    { 
    case 1: insert_node();break; 

    case 2: delete_node();break; 

    case 3: search_node();break; 

    case 4: list_linked_list();break; 
    case 5: exit(0);break; 
    default: cout<<" Please enter valid number between 1 and 5"; 
      break; 

    } 
    goto k; 
} 

Я не думаю, что я неправильно понял концепцию связан список. Im довольно ясно на it.I думаю там ошибка с указателем.

спасибо.

EDIT: НОВЫЙ КОД:

struct node{ 
    int data; 
    struct node* next; 
}; 

struct node* head=NULL; 
struct node* current=NULL; 





void insert_node() 
{ 
    int num=0; 
    cout<<"\nEnter the value of the node to insert\n:"; 

    cin>>num; 

    if(head==NULL) 
    { 

     head->data=num; 
     head->next=NULL; 
     current=head; 
     cout<<"Created list\n"; 

    } 
    else 
    { 
     struct node* temp=(node*)malloc(sizeof(node)); 
     temp->data=num; 
     temp->next=NULL; 
     current->next=temp; 
     current=temp; 
     cout<<"Added element\n"; 
     cout<<"dereferenced element\n"; 

    } 


} 

void delete_node() 
{ 

    if(head!=NULL && head->next==NULL )//only one node 
    { 

     current=head=NULL; //Am I supposed to do anything else here?? 
     cout<<"Deleted Head\n"; 
    } 
    else 
    if(head!=NULL && head->next!=NULL)//>= 2 nodes 
    { 
     struct node* temp=(node*)malloc(sizeof(node));; 
     //temp=NULL; 
     temp=head; 
     while(temp->next!=current) 
     { 
      temp=temp->next; 
     } 
     temp->next=NULL; 
     current=temp; 
     cout<<"Deleted last element\n"; 
     free(temp->next); 
     cout<<"Dereferenced temp\n"; 
    } 
    else 
    { 
     cout<<"delete was not performed"; 
    } 


} 

void list_linked_list() 
{ 
    node* temp=(node*)malloc(sizeof(node)); 

    temp=head; 

    while(temp!=NULL) 
    { 

     cout<<temp->data<<"->"; 
     temp=temp->next; 

    } 
    cout<<"displayed list\n"; 
    //free(temp);    //should I free temp? 
    cout<<"dereferenced temp"; 
} 

void search_node() 
{ 
    cout<<"\nenter a number to search"; 
    int search=0,found=0; 
    cin>>search; 

    node* temp=(node*)malloc(sizeof(node)); 
    temp=head; 
    while(temp!=NULL) 
    { 
     if(temp->data==search) 
      found=1; 
     else 
      temp=temp->next; 
    } 
    if(found==1) 
     cout<<"found\n"; 
    else 
    cout<<"not found\n"; 
    free(temp);   //shoudl I free temp? 
    cout<<"dereferenced temp"; 
} 
+0

Вам необходимо освободить узлы при удалении узла. Не когда вы вставляете узел. –

+0

Не используйте 'free (temp)' в 'insert_node()'. Он изменяет местоположение памяти, указанное током как недоступное. –

+0

Спасибо.Я сделал это :) – LoveMeow

ответ

4

Есть несколько проблем в вашем коде:

  1. Вы free() ИНГ узел в вашей функции вставки, которая является не то, что вы хотите. Поэтому удалите строку free(temp) из вашей функции вставки.

  2. Вы do хотите освободить узел при удалении элемента из связанного списка. Так раскомментируйте строку: free(temp);. Но это неправильный узел current, который вы хотите освободить(). Здесь temp является вашим новым current, тогда как вы хотите освободить() свой старый current который temp->next. Таким образом, ваш оператор free() должен быть: free(temp->next); в delete_node() функция (не free(temp);).

  3. Возвращаемое значение основного должно быть int.

  4. Если вы используете C++, существуют более эффективные способы реализации связанных списков. Вы можете использовать new и delete вместо malloc и free. Используйте заголовки C++ вместо заголовков C.

  5. Если вы используете C, затем don't cast the value returned by malloc in C.

  6. Вы используете goto в качестве замены для цикла, который требуется, если вы можете просто использовать for(;;) { } или while(1) { }.

+0

Поздравляем с 20K RP !! :) –

+0

Спасибо Grijesh ;-) –

+0

Я изменил все, что вы упомянули. Теперь, когда я вставляю элемент, он говорит о нарушении прав доступа или просто застревает – LoveMeow

3

В еще части вставки функций в вас свободный новый узел сразу после добавления его в связный список, который вызывает неопределенное поведение во время выполнения:

else 
    { 
     node* temp=(node*)malloc(sizeof(*temp)); 
     temp->data=num; 
     temp->next=NULL; 
     current->next=temp; 
     current=temp; 
     cout<<"Added element\n"; 
     free(temp); <------"Bug" 
     cout<<"dereferenced element\n";  
    } 

Примечание: Вы можете 't получить доступ к узлу, для которого память освобождена (free()), делая это незаконной операции. Вы должны освободить память для узла, когда закончите с программой (и вам не нужен доступ к этой памяти еще раз).

+0

спасибо. Я изменил эту ошибку, я все еще получаю ошибку нарушения доступа. – LoveMeow

+0

@RamapriyaSridharan Добавить новый код в свой вопрос или задать новый вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^