Сформировать односвязный списком с типом информационного поля char* - C (СИ)
Формулировка задачи:
Нужно сформировать односвязный списком с типом информационного поля char*
С типом int программа работает нормально, с типом char* компилирует, но работает не правильно. Насколько я понимаю, это связано с объемом памяти, отводимой под символы. Помогите отредактировать программу, пожалуйста.
P.S. Программировать начал недавно, так что уровень программы низкий, не обессудьте
#include <stdio.h> #include <conio.h> struct list {char* data; list *next; }; list *make_list(int ); void print_list(list *); int main (){ int m; list* adr; printf ("number of elements = "); scanf ("%d",&m); adr=make_list(m); print_list(adr); } list *make_list(int n) {list *first,*tec,*nel,*tel; int i; first=new list; printf ("Enter the element = ");//vvodim znachenie pervogo elementa scanf ("%c",&first->data); first->next=NULL;//obnulyaem adresnoe pole tec=first;//stavim ukazatel tec for (i=0;i<n-1;i++) { nel=new list;//pamyat' pod novyi element printf ("\nEnter the element = ");//sozdaem new element scanf ("%c",&nel->data); nel->next=NULL; tec->next=nel; tec=nel; } return first; } void print_list(list *first) {list *tec=first; while (tec!=NULL){ printf ("%c ",tec->data); tec=tec->next; } }
Решение задачи: «Сформировать односвязный списком с типом информационного поля char*»
textual
Листинг программы
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> struct list {char data; list *next; }; list *make_list(int,char* ); void print_list(list *); list* add_point(int,int,list*,char*); int main (){ int m,f; char alph[27]="abcdifghigklmnopqrstuvwxyz"; list* adr; printf ("number of elements = "); scanf ("%d",&m); adr=make_list(m,alph); print_list(adr); printf ("\nNumber of additon = "); scanf ("%d",&f); add_point(m,f,adr,alph); print_list(adr); getch(); return 0; } list *make_list(int n,char*mas) {list *first,*tec,*nel; int i; srand(time(NULL)); first=new list; first->data=mas[rand()%26]; first->next=NULL; tec=first; for (i=0;i<n-1;i++) { nel=new list; nel->data=mas[rand()%26]; nel->next=NULL; tec->next=nel; tec=nel; } return first; } void print_list(list *first) {list *tec=first; printf ("\nThe full list: "); while (tec!=NULL){ printf ("%c ",tec->data); tec=tec->next; } } list* add_point(int n,int k,list* first,char*mas) { int i; list *tec,*newel; srand(time(NULL)); tec=first; newel=new list; newel->data=mas[rand()%26]; if (k==0){ newel->next=first; first=newel; return first; } for (i=0;i<k-1&&tec!=0;i++) tec=tec->next; if(tec!=0){ newel->next=tec->next; tec->next=newel; } else { printf ("\nError, number k is wrong"); } return first; }
Объяснение кода листинга программы
- Структура списка определена в файле
, , и - Функция make_list создает список из n элементов, используя массив символов alph.
- Первый элемент списка выбирается случайным образом из массива alph.
- Функция print_list выводит список на экран.
- Функция add_point добавляет k элементов в начало списка.
- Если k равно 0, новый элемент становится первым элементом списка.
- Если k больше 1, функция ищет место для добавления элементов в списке.
- Если найденное последнее звено списка имеет следующий элемент, равный NULL, значит, список пуст, и новый элемент добавляется в начало списка.
- Если найденное последнее звено списка имеет следующий элемент, отличный от NULL, новый элемент добавляется в начало списка, и ссылка на новый элемент передается в качестве следующего элемента найденного последнего звена списка.
- Если после k-1 проходов по списку не найдено ни одного звена списка со следующим элементом, равным NULL, выводится сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д