Заполнение списка данными - C (СИ)

  1. Помогите пожалуйста, нужен кусок кода который будет заполнять список данными на языке Си


textual

Код к задаче: «Заполнение списка данными - C (СИ)»

#include <stdio.h>
#include <stdlib.h>
#define N 5
 
typedef struct List
{
    int data;
    struct List *next;
} List;
 
typedef struct Mylist
{
    List *root, *carr;
} Mylist;
 
Mylist *InitMylist( void )
{
    Mylist *u=(Mylist*)malloc(sizeof(Mylist));
    u->root = (List*)malloc(sizeof(List));
    u->carr = u->root;
    if(u->root==NULL)return NULL;
    u->root->next=NULL;
    return u;
}
 
void AddLast_Mylist(Mylist *u, int a)
{
    u->carr->data=a;
    u->carr->next=(List*)malloc(sizeof(List));
    u->carr=u->carr->next;
    u->carr->next=NULL;
}
 
void Delete_Mylist(Mylist* u)
{
    List* uk;
    while(u->root!=NULL)
    {
        uk=u->root;
        u->root=u->root->next;
        free(uk);
    }
    free(u);
}
 
void Print_Mylist(Mylist * u)
{
    List* uk=u->root;
    while(uk->next!=NULL)
    {
        printf("%d\n", uk->data);
        uk=uk->next;
    }
}
 
 
int main(void)
{
    Mylist *sp=InitMylist();
    int d;
    char x;
 
    for(int i=1; i<=N; ++i)
    {
        printf("Vvedite chisla v spisok: ");
        scanf("%d", &d);
        AddLast_Mylist(sp, d);
        printf("Prodolzhit? y/n: "); 
        while(getchar()!='\n');
        scanf("%c", &x);
        if(x=='n')break;
    }
 Print_Mylist(sp);
 
Delete_Mylist(sp);
 
    sp=NULL;
 
    return 0;
}

СДЕЛАЙТЕ РЕПОСТ

6   голосов, оценка 4.000 из 5



Похожие ответы
  1. Добрый день. Изучаю азы программирования, преподаватель попросил сделать так, чтобы пользователем вводилась квадратная матрица, при этом размер матрицы не задается в начале программы или пользователем. Происходит считывание количества элементов(csv-формат), выходит, из этого и создается размерность, но как? Если у кого-то есть пример такого кода, то было бы еще лучше, я бы разобрался К примеру: Введите матрицу 1; 2; 3; 4; 5; 6; 7; 8; 9; Вы ввели матрицу 3x3: 1; 2; 3; 4; 5; 6; 7; 8; 9;

  1. Мне нужно вставить узел в хвост списка. Я написал функцию вставки, но она не доходит до конца списка. В функцию передаю список и информационное поле узла, которое надо вставить. Можете помочь найти ошибку?C++1 2 3 4 5 6 7 8 9 10 11 12 Node*AddInTail(Node**p,int k) {       Node*ins=new Node; // узел, который надо вставить     Node*walk=new Node;// создаем новый узел,для прохода по списку         ins->k=k;                 //в информационное поле вставляю число k         for(walk=*p;walk->next!=NULL;walk=walk->next) //дохожу до конца списка             {                 walk->next=ins; //в указатель конца списка записываю узел                 ins->next=NULL; //в указатель вставленного узла записываю NULL     return *p;     }     return *p; }

  1. В общем, я запутался. Вот задание. Необходимо разработать программу согласно варианту задания. При реализации использовать указатели на функции и (или) массивы указателей на функции. -------------------------------------------------- Дан список записей типа ТОВАР (размер списка и его элементы вводятся пользователем). Упорядочить список по любому из полей в любом направлении. Поле и направление выбирает пользователь. В функцию сортировки должен передаваться указатель на функцию сравнения двух элементов. (20 баллов). ТОВАР: - наименование товара (строка 15 символов); - единицы измерения (строка 5 символов); - цена (вещественное число с двумя знаками после запятой); - количество (целое положительное число). То, что накаляканоC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include #include #include #include #include typedef struct {     char  name[16];     char  mesr[6];     double price;     int count; }Good; typedef Good *Ptr; typedef int (*Pfun)( void *, void * ); int cmpNM ( void *, void * ); int cmpCNT( void *, void * ); void sortbychoice( Ptr , int, size_t, void (*), Pfun ); void swap ( Ptr , Ptr ); int main( int argc, char *argv[ ] ) {     //printf( "%d",  offsetof( Good, count) );     int d = 0, count;     printf( "Enter count of lists: ");     while( !d || count <= 0)     {         d = scanf( "%d", &count );         if( !d || count <= 0 ) { while( getchar( ) != '\n' ); printf( "Repeat: "); }     }     fflush( stdin );     int i;     Ptr list = (Good*)calloc( count, sizeof(Good));     for( i = 0; i < count; i++ ) { printf( "Name|Measure|Price|Count: " ); scanf( "%s%s%lf%d", list[i].name, list[i].mesr, &list[i].price, &list[i].count ); while( getchar( ) != '\n' );}       //       //sortbychoice( list, count, sizeof(char)*15, list[i].name, cmpNM );     sortbychoice( list, count, offsetof( Good, count ), &list[i].count, cmpCNT);     for( i = 0; i < count; i ++ ) printf( "Name: %s | Measure: %s | Price: %3.2lf | Count: %03d\n", list[i].name, list[i].mesr, list[i].price, list[i].count );     system( "pause" );     getch( );     return 0; }   void swap ( Ptr arg1, Ptr arg2 ) {    Good temp = *arg1;    *arg1 = *arg2;    *arg2 = temp;    return; } int cmpNM( void * arg1, void * arg2 ) {     if( strcmp( (char*)arg1, (char*)arg2 ) == 1 ) return 1;     else return 0; } int cmpCNT( void * arg1, void *arg2 ) {     if(*((int*)arg1) > *((int*)arg2)) return 1;     else return 0; } void sortbychoice ( Ptr good, int count, size_t size, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char* )arr;      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*size),  (void*)( ar + j * size )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }Добавлено через 3 минуты дело в том, что я не могу понять, как мне обращаться к началу памяти одного и того же поля в массиве структур. Делал такое с обычными массивами, вроде всё работало. Вот как делал:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void SortArray( void *array, unsigned num, size_t size, int (*fun)(void *arg1, void *arg2), void (*fun1)( void *arg1, void *arg2)) {     int i, j;     int imin, imax;     char *ptr = (char* )array; // указатель на начало памяти массива     for( i = 0; i < num - 1; i += 2 )     {         imin = i;         for( j = i + 2; j < num; j += 2 )         if( fun( (void*)(ptr + imin*size), (void*)(ptr + j*size)) > 0 ) imin = j;                 fun1( ptr + i*size, ptr + imin*size);// смещение указателя на size бацтов массив     }  for( i = 1; i < num - 1; i += 2 )     {         imax = i;         for( j = i + 2; j < num; j += 2 )         if( fun( (void*)(ptr + imax*size), (void*)(ptr + j*size)) < 0 ) imax = j;                 fun1( ptr + i*size, ptr + imax*size );// смещение указателя на size бацтов массив     } }Добавлено через 32 минуты Сообщение от Michail97 //sortbychoice( list, count, sizeof(char)*15, list[i].name, cmpNM ); * * sortbychoice( list, count, offsetof( Good, count ), &list[i].count, cmpCNT); На эти строки на намекать. ИсправилДобавлено через 3 минуты В общем, для сортровки по кол - ву работает вроде.C1 2 3 4 5 6 7 8 9 10 11 12 void sortbychoice ( Ptr good, int count, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char * )arr; // указатель на начало памяти выбранного поля аргумента arg      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*sizeof( Good)),  (void*)( ar + j * sizeof(Good) )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }Сейчас попробую со строками также провернутьДобавлено через 9 минут В общем, пока работает. Если найдёте грабли ещё, укажите, пожалуйста. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include #include #include #include #include typedef struct {     char  name[16];     char  mesr[6];     double price;     int count; }Good; typedef Good *Ptr; typedef int (*Pfun)( void *, void * ); int cmpNM ( void *, void * ); int cmpCNT( void *, void * ); void sortbychoice( Ptr , int, void (*), Pfun ); // для 1 - ого аргумента необходимо передать 2 - ой указатель void swap ( Ptr , Ptr ); int main( int argc, char *argv[ ] ) {     //printf( "%d",  offsetof( Good, count) );     int d = 0, count;     printf( "Enter count of lists: ");     while( !d || count <= 0)     {         d = scanf( "%d", &count );         if( !d || count <= 0 ) { while( getchar( ) != '\n' ); printf( "Repeat: "); }     }     fflush( stdin );     int i;     Ptr list = (Good*)calloc( count, sizeof(Good));     for( i = 0; i < count; i++ ) { printf( "Name|Measure|Price|Count: " ); scanf( "%s%s%lf%d", list[i].name, list[i].mesr, &list[i].price, &list[i].count ); while( getchar( ) != '\n' );}       //       sortbychoice( list, count,list[0].name, cmpNM );     //sortbychoice( list, count, &list[0].count, cmpCNT);     for( i = 0; i < count; i ++ ) printf( "Name: %s | Measure: %s | Price: %3.2lf | Count: %03d\n", list[i].name, list[i].mesr, list[i].price, list[i].count );     system( "pause" );     getch( );     return 0; }   void swap ( Ptr arg1, Ptr arg2 ) {    Good temp = *arg1;    *arg1 = *arg2;    *arg2 = temp;    return; } int cmpNM( void * arg1, void * arg2 ) {     if( strcmp( (char*)arg1, (char*)arg2 ) == 1 ) return 1;     else return 0; } int cmpCNT( void * arg1, void *arg2 ) {     if(*((int*)arg1) > *((int*)arg2)) return 1;     else return 0; } void sortbychoice ( Ptr good, int count, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char * )arr;      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*sizeof( Good)),  (void*)( ar + j * sizeof(Good) )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }

  1. Не получается выполнить сортировку двусвязного списка методом пузырька. У меня получилось сделать только один заход, а их надо несколько.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 struct LIST {     int info;     LIST* next;     LIST* prev; };   void sort(LIST *i, LIST *start, LIST *last) {     int tmp=0;     i=start;     if((i->info)>(i->next->info))     {         tmp=i->info;         i->info=i->next->info;         i->next->info=tmp;     } }

  1. Задача Описать функцию или процедуру, которая находит сумму последнего и предпоследнего элементов списка, содержащего не менее двух элементов (тип=целочисленный). C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 #include #include #include     struct TNode {                       int n;       TNode *next;     }  *start , *last ;      void funkt1 (int m ) {              TNode *p;      while (m!=0) {        if (start==NULL) {              start= new TNode;        start->n=random(100);        start->next=NULL;        last=start;        printf(" %d ",start->n);        }        else {                          p= new TNode;        p->n=random(100);        p->next=NULL;        last->next=p;        last=p;        printf(" %d ",p->n);        }         m--;       }     return  ;    }    void funkt2 () {          int S=0;    TNode *f;    f=start;    while ((f->next)->next!=NULL)     f=f->next;    S= f->n + (f->next)->n ;       printf("\n S=%d ",S);   return ;   }   int main() {    randomize ();    clrscr ();    int L;    printf("vvedute kol-vo elementov : ");  scanf("%d",&L);    funkt1 (L);    funkt2 ();    getch();   return 0 ;   }

  1. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #define _CRT_SECURE_NO_WARNINGS #include * #include struct sportsmen{     char FirstName[32];     int number[10], points[128]; }; void read(struct sportsmen *sportsmen, int i) {     for (int j = 0; j < i; j++){         printf("enter FirstName \n");         scanf("%s", &sportsmen[j].FirstName);         printf("enter number \n");         scanf("%i", &sportsmen[j].number);         printf("enter points \n");         scanf("%i", &sportsmen[j].points);     } } int main() {     setlocale(LC_ALL, "ukr");     struct sportsmen sportsmen[5];     read(sportsmen, 5);     FILE *f, *fdell;     if ((f = fopen("f.txt ", "wb")) == NULL)     {         printf("Помилка при відкритті файлу");         return 1;     }     } Нашел в интернете код C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 #define _CRT_SECURE_NO_WARNINGS   #include #include #include #include   char c; struct sports { char fam[20]; int number, score; } spr; void inputdata(FILE *); void updatedata(FILE *); void printdata(FILE *); void deletedata(FILE *);   void inputdata(FILE *st) {     char ch;     st = fopen("file1.dat", "wb");     do     {         printf("\nВведите данные спортсмена через пробел - фамилия, номер, количество набранных очков.\n");         scanf("%s%d%d", spr.fam, &spr.number, &spr.score);         fwrite(&spr, sizeof(spr), 1, st);         printf("\nЗакончить ввод данных?\n");         ch = getch();     } while (ch != 'y');     fclose(st);     system("cls");     printf("Данные о спортсменах записаны!\n"); }   void printdata(FILE *st) {     system("cls");     int i;     st = fopen("file1.dat", "rb");     i = 1;     fread(&spr, sizeof(spr), 1, st);     while (!feof(st))     {         printf("\n%d. Фамилия спортсмена: %s, номер: %d, количество очков: %d", i, spr.fam, spr.number, spr.score);         fread(&spr, sizeof(spr), 1, st);         i++;     }     printf("\n\nНажмите любую клавишу для выхода в меню.\n");     getch();     system("cls"); }   void updatedata(FILE *st) {     char ch;     st = fopen("file1.dat", "ab");     do     {         printf("\nВведите данные о спортсмене через пробел - фамилия, номер, количество набранных очков.\n");         scanf("%s%d%d", spr.fam, &spr.number, &spr.score);         fwrite(&spr, sizeof(spr), 1, st);         printf("\nЗакончить добавление данных? y/n\n");         ch = getch();     } while (ch != 'y');     fclose(st);     system("cls"); }   void deletedata(FILE *st) {     system("cls");     char ch;     int i, n, min;     sports *p, temp;     st = fopen("file1.dat", "rb");     n = 0;     fseek(st, 0, 2);     n = ftell(st) / sizeof(sports);     fseek(st, 0, 0);     p = (sports *)malloc(n*sizeof(sports));     for (i = 0; i

  1. У меня есть односвязный список элементов, нужно разбить список на 2 методом перераспределения элементов по признаку четности. Прототип списка:C1 2 3 4 typedef struct Node {     int value;     struct Node *next; } Node;До этого я сделал методом переписи, но преподаватель говорит что так не годится, а как перераспределить элементы я не пойму.

  1. Дано предложение, слова в котором разделены пробелами. Составить из него два предложения по правилу: на первое переписать все четные по порядку слова, а во второй - нечетные. Пожалуйста, выручите, могу посчитать количество слов, а вот это задание мозг выедает)

  1. Привет всем. Подскажите, как можно сортануть элементы списка. Есть список книг и нужно упорядочить их по количеству страниц. Вот пример:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #include #include   int main (void) {     typedef struct list     {         char *name;         int pages;         struct list *next;     } list;         list *book1, *book2,*book3;     book1 = book2 = book3 = NULL;         book1 = malloc(sizeof(list));     book1->pages = 200;     book1->next = NULL;         book2 = malloc(sizeof(list));     book2->pages = 150;     book2->next = NULL;         book3 = malloc(sizeof(list));     book3->pages = 300;     book3->next = NULL;         book1->next = book2;     book2->next = book3;     book3->next = NULL;         list *ptr1;     ptr1 = book1;         list *ptr2;     ptr2 = book1;         while(ptr1!=NULL)     {         while(ptr2!=NULL)         {             if(ptr2->next->pages < ptr2->pages)             {                 list *minbook;                 minbook=ptr2->next;                 ptr2->next=ptr2;                 ptr2=minbook;             }                             ptr2=ptr2->next;         }                 ptr1=ptr1->next;     }         ptr1=ptr2;     while(ptr1!=0)     {         printf("%d\n",ptr1->pages);     } }