Сформировать односвязный списком с типом информационного поля 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, выводится сообщение об ошибке.