Ошибка при добавлении нового элемента в список - 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;
}