Ошибка при добавлении нового элемента в список - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть код для односвязного списка. Без функций всё работает, при попытке сделать в виде функций, при добавлении нового элемента в список, - программа вылетает. В чем причина?
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
struct Node
{
    int number;
    Node* next;
};
 
struct Node* head;
 
void add_numb(Node *head);
void show_list(Node *head);
void search_numb(Node *head);
void del_elem(Node *head);
void del_list(Node *head);
void count_elem (Node *head);
void sort(Node *head);
 
void item()
{
 int Key;
 do { 
  system("cls");
  printf("\n");
  printf("\nHello! Possible operations (select 0 to 7):\n");
  printf ("1. Add Element\n");
  printf ("2. Show List\n");
  printf ("3. Search Element\n");
  printf ("4. Delete Element\n");
  printf ("5. Delete List\n");
  printf ("6. Count Elements\n");
  printf ("7. Sort List\n");  
  printf ("0. Exit\n");
  
  scanf("%d",&Key);
  switch(Key)
  {
   case 1:add_numb(head);break;
   case 2:show_list(head);break;
   case 3:search_numb(head);break;
   case 4:del_elem(head);break;
   case 5:del_list(head);break;
   case 6:count_elem(head);break;
   case 7:sort(head);break;   
  }
 } while(Key!=0);
} 
 
void add_numb(Node *head)
{
     system("cls");
     int numb = -1;
     printf ("Input Number: ");
     scanf ("%d", numb);
     Node* ptr = new Node;
     ptr->number = numb;
     ptr->next = NULL;
     if (head == NULL)
        head = ptr;
     else
     {
         Node * temp = head;
         while (temp->next)
               temp = temp->next;
         temp->next = ptr;
     }
     system("pause");
}
 
void show_list(Node *head)
{
     system("cls");
     if (head == NULL)
     {
        printf ("\t!!! List is Empty !!!\n\n");
        system("pause");
     } else
     {
     printf ("* * * * * List * * * * *\n\n");
     Node* ptr = head;
     while (ptr)
     {
     printf ("%d ", ptr->number);
     ptr = ptr->next;
     }
     printf ("\n\n");
     system("pause");
     }
}
 
void search_numb(Node *head)
{
    system("cls");
    if (head == NULL)
    {
       printf("\t!!! List is Empty !!!\n\n");
       system("pause");
    } else
    {
    int key = -1;
    printf("Input element for search: ");
    scanf("%d", key);
    Node * ptr = head;
    while ((ptr) && (key != ptr->number))
          ptr = ptr->next;
    if (ptr && (key == ptr->number))
       printf("\n\t!!! Element is found !!!\n");
    else
        printf("\n\t!!! Element is not found !!!\n");
    system("pause");
    } 
}
 
void del_elem(Node *head)
{
    system("cls");
    if (head == NULL)
    {
       printf("\t!!! List is Empty !!!\n\n");
       system("pause");
    } else
    {
      int key = -1;
      printf("Input element for delete: ");
      scanf ("%d", key);
      Node * ptr = head;
      Node* prevPtr = ptr;
      while ((ptr) && (key != ptr->number))
      {
            prevPtr = ptr;
            ptr = ptr->next;
      }
      if (ptr && (key == ptr->number))
      {
         if (ptr == head)
         head = ptr->next;
         else
         prevPtr->next = ptr->next;
         delete ptr;
         printf("\n\t!!! Element successfully deleted !!!\n");
      } else
      printf("\n\t!!! Element is not found !!!\n");
      system("pause");
    } 
}
 
void del_list(Node *head)
{
     system("cls");
     if (head == NULL)
     {
        printf("\t!!! List is Empty !!!\n\n");
        system("pause");
     } else
       {
           Node *ptr = head;
           Node *temp;
           while(ptr)
           {
            temp = ptr;
            ptr = ptr->next;
            delete temp;
           }
           head = 0;
           printf("\n\t!!! List successfully deleted !!!\n");
           system("pause");
       }
}
 
void count_elem(Node *head)
{
     system("cls");
     if (head == NULL)
     {
        printf("\t!!! List is Empty !!!\n\n");
        system("pause");
     } else
       { 
          int count = 0;
          Node* ptr = head;
          while (ptr)
          {
           count++;
           ptr = ptr->next;
          }
          printf("Amount of elements in list: \n\n");
          printf("%d", count);
          printf("\n\n");
          system("pause");
       }
}
 
void sort(Node *head)
{
     system("cls");
     if (head == NULL)
     {
        printf("\t!!! List is Empty! !!!\n\n");
        system("pause");
     } else
       {
           Node *a = NULL;
           Node *b = NULL;
           Node *c = NULL;
           Node *e = NULL;
           Node *tmp = NULL;               
           while (e != head->next)
           {
                 c = a = head;
                 b = a->next;
                 while (a != e)
                 {
                  if (a->number > b->number)
                  {
                   if (a == head)
                   {
                    tmp = b -> next;
                    b->next = a;
                    a->next = tmp;
                    head = b;
                    c = b;
                   } 
                   else 
                   {
                    tmp = b->next;
                    b->next = a;
                    a->next = tmp;
                    c->next = b;
                    c = b;
                   }
                  } 
                  else
                  {
                   c = a;
                   a = a->next;
                  }
                  b = a->next;
                  if (b == e)
                     e = a;
                 }
           }
     printf("\n\t!!! List successfully sorted !!!\n");
     printf("\n\n");
     system("pause");
     }
}
 
int main()
{
    head = NULL;
    item();
    printf("\n");
    return 0;
}

Решение задачи: «Ошибка при добавлении нового элемента в список»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
 
typedef struct node_t
{
   int number;
   struct node_t* next;
}  Node;
 
void add_numb(Node** head);
void show_list(Node* head);
void search_numb(Node* head);
void del_elem(Node** head);
void del_list(Node** head);
void count_elem(Node* head);
void sort(Node** head);
 
void item()
{
   Node* head = NULL;
 
   int Key;
   do
   {
      system("cls");
      printf("\n");
      printf("\nHello! Possible operations (select 0 to 7):\n");
      printf("1. Add Element\n");
      printf("2. Show List\n");
      printf("3. Search Element\n");
      printf("4. Delete Element\n");
      printf("5. Delete List\n");
      printf("6. Count Elements\n");
      printf("7. Sort List\n");
      printf("0. Exit\n");
 
      scanf("%d", &Key);
      switch (Key)
      {
         case 1:
            add_numb(&head);
            break;
         case 2:
            show_list(head);
            break;
         case 3:
            search_numb(head);
            break;
         case 4:
            del_elem(&head);
            break;
         case 5:
            del_list(&head);
            break;
         case 6:
            count_elem(head);
            break;
         case 7:
            sort(&head);
            break;
      }
   }
   while (Key != 0);
 
   del_list(&head);
}
 
void add_numb(Node** head)
{
   system("cls");
   int numb = -1;
   printf("Input Number: ");
   scanf("%d", &numb);
   Node* ptr = (Node*) malloc(sizeof(Node));
   ptr->number = numb;
   ptr->next = NULL;
   if (*head == NULL)
   {
      *head = ptr;
   }
   else
   {
      Node* temp = *head;
      while (temp->next)
      {
         temp = temp->next;
      }
      temp->next = ptr;
   }
   system("pause");
}
 
void show_list(Node* head)
{
   system("cls");
   if (head == NULL)
   {
      printf("\t!!! List is Empty !!!\n\n");
      system("pause");
   }
   else
   {
      printf("* * * * * List * * * * *\n\n");
      Node* ptr = head;
      while (ptr)
      {
         printf("%d ", ptr->number);
         ptr = ptr->next;
      }
      printf("\n\n");
      system("pause");
   }
}
 
void search_numb(Node* head)
{
   system("cls");
   if (head == NULL)
   {
      printf("\t!!! List is Empty !!!\n\n");
      system("pause");
   }
   else
   {
      int key = -1;
      printf("Input element for search: ");
      scanf("%d", &key);
      Node* ptr = head;
      while ((ptr) && (key != ptr->number))
      {
         ptr = ptr->next;
      }
      if (ptr && (key == ptr->number))
      {
         printf("\n\t!!! Element is found !!!\n");
      }
      else
      {
         printf("\n\t!!! Element is not found !!!\n");
      }
      system("pause");
   }
}
 
void del_elem(Node** head)
{
   system("cls");
   if (head == NULL)
   {
      printf("\t!!! List is Empty !!!\n\n");
      system("pause");
   }
   else
   {
      int key = -1;
      printf("Input element for delete: ");
      scanf("%d", &key);
      Node* ptr = *head;
      Node* prevPtr = ptr;
      while ((ptr) && (key != ptr->number))
      {
         prevPtr = ptr;
         ptr = ptr->next;
      }
      if (ptr && (key == ptr->number))
      {
         if (ptr == *head)
         {
            *head = ptr->next;
         }
         else
         {
            prevPtr->next = ptr->next;
         }
         free(ptr);
         printf("\n\t!!! Element successfully deleted !!!\n");
      }
      else
      {
         printf("\n\t!!! Element is not found !!!\n");
      }
      system("pause");
   }
}
 
void del_list(Node** head)
{
   system("cls");
   if (*head == NULL)
   {
      printf("\t!!! List is Empty !!!\n\n");
      system("pause");
   }
   else
   {
      Node* ptr = *head;
      Node* temp;
      while (ptr)
      {
         temp = ptr;
         ptr = ptr->next;
         free(temp);
      }
      *head = 0;
      printf("\n\t!!! List successfully deleted !!!\n");
      system("pause");
   }
}
 
void count_elem(Node* head)
{
   system("cls");
   if (head == NULL)
   {
      printf("\t!!! List is Empty !!!\n\n");
      system("pause");
   }
   else
   {
      int count = 0;
      Node* ptr = head;
      while (ptr)
      {
         count++;
         ptr = ptr->next;
      }
      printf("Amount of elements in list: \n\n");
      printf("%d", count);
      printf("\n\n");
      system("pause");
   }
}
 
void sort(Node** head)
{
   system("cls");
   if (*head == NULL)
   {
      printf("\t!!! List is Empty! !!!\n\n");
      system("pause");
   }
   else
   {
      Node* a = NULL;
      Node* b = NULL;
      Node* c = NULL;
      Node* e = NULL;
      Node* tmp = NULL;
      while (e != (*head)->next)
      {
         c = a = *head;
         b = a->next;
         while (a != e)
         {
            if (a->number > b->number)
            {
               if (a == *head)
               {
                  tmp = b -> next;
                  b->next = a;
                  a->next = tmp;
                  *head = b;
                  c = b;
               }
               else
               {
                  tmp = b->next;
                  b->next = a;
                  a->next = tmp;
                  c->next = b;
                  c = b;
               }
            }
            else
            {
               c = a;
               a = a->next;
            }
            b = a->next;
            if (b == e)
            {
               e = a;
            }
         }
      }
      printf("\n\t!!! List successfully sorted !!!\n");
      printf("\n\n");
      system("pause");
   }
}
 
int main()
{
   item();
   return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы