2016-02-14 2 views
-1

используя двойные указатели первый раз для создания и отображения связанного спискасвязанный список, используя двойные указатели

#include "stdio.h" 
#include "stdlib.h" 

struct node 
{ 
    int data; 
    struct node * next; 
}; 
void Insert(struct node **, int , int); 
void display(struct node *); 
int main() 
{ 
    int c, data, position; 
    struct node* head; 
    do{ 
     printf("Enter a choice :\n"); 
     printf("1. Add an element.\n"); 
     printf("2. Del an element.\n3.Display List.\n"); 
     printf("4.Delete linked list.\n5.Exit.\n"); 
     printf("Your Choice :"); 
     scanf("%d",&c); 
     switch(c){ 
      case 1 : 
       printf("\nEnter data and position :\n"); 
       scanf("%d %d",&data,&position); 
       Insert(&head,data,position); 
       break; 
      case 2 : 

       break; 
      case 3 : 
       printf("Linked List : \n"); 
       display(head); 
       break; 
      case 4 : 

       break; 
      case 5 : 
       exit(0); 
      default : 
       printf("Invalid Choice.\n"); 
       break; 
     } 
    }while(1); 

    return 0; 
} 


void Insert(struct node **ptrhead, int item, int position){ 
    struct node *p,*newnode; 
    //node creation. 
    newnode = (struct node *)malloc(sizeof(struct node)); 
    if (!newnode) 
    { 
     printf("Memory Error.\n"); 
     return; 
    } 
    newnode->next = NULL; 
    newnode->data = item; 

    p = *ptrhead; 

    // Creates initial node 
    if (!(p->data)) 
     { 
      p = newnode; 
     } 

    // insertion at beginning 
    if (position==1) 
    { 
      newnode->next = p; 
      p = newnode; 
      free(newnode); 
    } 
    // insertionn at middle or end. 
    else 
    { 
     int i=1; 
     while(p->next!=NULL && i<position-1){ 
      p=p->next; 
      i++; 
     } 
     newnode->next = p->next; 
     p->next = newnode; 
    } 

    *ptrhead = p; 

}; 

// Display Linked list 
void display(struct node *head){ 
    if (head) 
    { 
     do{ 
      printf("%d\n", head->data); 
      head = head->next; 
     }while(head->next); 
    } 

}; 

Добавлю функции для удаления и других операций позже. Прямо сейчас, я просто хочу вставить и отобразить fns для работы. Но вывод идет как бесконечно работающий цикл с неправильными значениями. Я не могу понять, что не так в моем коде, пожалуйста, помогите? Спасибо заранее.

+0

Ваше название включает в себя * двойные указатели *. Когда вы работаете над своим связанным списком, понимайте, почему 'insert' и' delete_node' требуют передать адрес списка как параметр, а не просто указатель на список. Причина, по которой в этих двух случаях требуется включить или удалить новый первый узел, который изменит адрес вашего списка. Что произойдет, если вы вставите новый первый узел, но только передаете 'node * ptrhead' в функцию' insert'? (примечание: вы можете удалить весь список, не передавая адрес списка). –

ответ

-1

Не уверен, почему кто-то сегодня будет писать этот тип C, похоже, может быть, я делаю домашнее задание для вас ... В любом случае вы попросили исправить свой код, а не переписывать его, так что вот минимальный набор изменений.

head должен быть инициализирован до NULL.

if (!(p->data)) не является правильным. Это утверждение должно быть только:

// Creates initial node 
if (!p) 
{ 
    *ptrhead = newnode; 
    return; 
} 

Удалить free(newnode);.

Вкладыше в середине/конце кода может быть

int i = 1; 
struct node *n = p; 
while (n->next != NULL && i<position - 1){ 
    n = n->next; 
    i++; 
} 
newnode->next = n->next; 
n->next = newnode; 

Окончательный insert функция:

void Insert(struct node **ptrhead, int item, int position) 
{ 
    struct node *p, *newnode; 
    //node creation. 
    newnode = (struct node *)malloc(sizeof(struct node)); 
    if (!newnode) 
    { 
     printf("Memory Error.\n"); 
     return; 
    } 
    newnode->next = NULL; 
    newnode->data = item; 

    p = *ptrhead; 

    // Creates initial node 
    if (!p) 
    { 
     *ptrhead = newnode; 
     return; 
    } 

    // insertion at beginning 
    if (position == 1) 
    { 
     newnode->next = p; 
     p = newnode; 
    } 
    // insertionn at middle or end. 
    else 
    { 
     int i = 1; 
     struct node *n = p; 
     while (n->next != NULL && i<position - 1){ 
      n = n->next; 
      i++; 
     } 
     newnode->next = n->next; 
     n->next = newnode; 
    } 

    *ptrhead = p; 

} 

Ваша print функция не совсем верно, просто сделать это:

// Display Linked list 
void display(struct node *head) 
{ 
    while (head) 
    { 
     printf("%d\n", head->data); 
     head = head->next; 
    } 
} 
+0

Просто любопытно - почему бы кому-то не писать связанный список на C, как этот - сегодня? –

+0

Вы можете просто использовать стандартную библиотеку C++. Существует не так много причин не использовать C++, даже если вы не используете контейнер stl. –

+0

Ну, есть некоторые причины, по которым люди выбирают [** C как вопрос выбора **] (http://article.gmane.org/gmane.comp.version-control.git/57918) ':)' –