2015-02-01 3 views
0

Создание списка в C реализации SLL.Применение одиночного связанного списка в C

struct dat 
{ 
char fname[20]; 
char lname[20]; 
}; 

typedef struct node_s 
{ 
struct dat data; 
struct node_s *next; 
}NODE; 

NODE *list=NULL; 

NODE *list_create(struct dat *data) 
{ 
    NODE *node; 
    if(!(node=malloc(sizeof(NODE)))) 
    { 
     return NULL; 
    } 
    node->data = data; 
    node->next = NULL; 
    return node; 
} 

NODE *list_insert_after(NODE *node, struct dat *data) 
{ 
    NODE *newnode; 
    newnode = list_create(data); 
    newnode->next = node->next; 
    node->next = newnode; 
    return newnode; 
} 

Я не могу найти хорошие примеры, используя SLL. Теперь у меня есть эта функция append, теперь я применим две функции SLL, list_create и list_insert_after. Это правильно?

void app(struct dat x) 
{ 
    FILE *fp; 
    fp=fopen("database.dat","a"); 

    if(fp==NULL) 
    { 
     printf("file error"); 
    } 
    if(fp!=NULL) 
    { 
     printf("enter lname: "); 
     gets(x.lname); 
     printf("enter fname: "); 
     gets(x.fname); 

     fprintf(fp,"%s %s\n",x.lname,x.fname); 

     if(list == NULL) 
     { 
     list=list_create((&x)); 
     } 
     else 
     { 
     next=list_insert_after(list,&x); 
     } 

    } 

    fclose(fp); 

} 
+0

См [? Является ли это хорошая идея указатели определения типа во] (http://stackoverflow.com/questions/750178/is-it- a-good-idea-to-typedef-указатели) –

+0

В 'list_insert_after()', это хорошая идея, чтобы проверить t он возвращает значение из 'list_create()' перед разыменованием его; это может быть нулевой указатель. –

+1

См. [Почему функция 'gets()' опасна?] (Http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be- используется) для объяснения причин, почему вы никогда не должны использовать функцию 'gets()'. –

ответ

0

Чтобы завершить пример, вы должны решить:

а), что если роль вашего файла database.dat.

b) как вы работаете со своим списком.

Я полагаю, что вам нужно два указателя для работы со списком: указатель на первый элемент (это list, я думаю) и указатель на последний элемент (может быть, это next). Теперь называют такие, как list_insert_after(list,&x); всегда вставляет элемент после первого элемента, так что ваш список не может быть больше, чем 2.

Рассмотрим изменения в коде следующим образом:

 if(list == NULL) 
     { 
     list = list_create((&x)); 
     next = list; // the last is the first 
     } 
     else 
     { 
     next=list_insert_after(next,&x); // insertion after the last 
     } 

И о файле: если вы решите хранить не строки в текстовом файле, а структуры в двоичном файле, сохраните только struct dat в файл, потому что указатели хранения не имеют смысла.

+0

«ваш список не может быть длиннее 2», почему вы думаю, что? – maja

0

Даже если C - язык низкого уровня, структура данных не запрещена. Узел должен быть внутренним объектом списка. Как реализовать его в C зависит от того, как вы хотите его использовать. Некоторые примеры:

  • стек FIFO: 2 функции нажмите и поп, и этот список необходимо только сохранить последний добавленный элемент (не будет добавлять после, но прежде - в качестве упражнения)
  • LIFO: все еще добавляются и берутся только 2 функции, и список должен сохранять первый элемент (его головку), потому что следующий его будет занят, а последний (его хвост), потому что там вы добавите следующий

    typedef struct list_s { 
        NODE *head; 
        NODE *tail; 
        int len; 
    } LIST; 
    
    int add(LIST *list, struct dat *data) { 
        list->tail = list_insert_after(list->tail, data); 
        list->len += 1; 
        return list->len; 
    } 
    
    struct dat * take(LIST *list) { 
        if (list->len == 0) return NULL; 
        struct dat *data = head->data; 
        NODE *n = head; 
        head = head->next; 
        free(n); 
        return data; 
    } 
    

    , конечно же, вам придется инициализировать список, может занять его длину, ...

  • истинный список: внутри такой же, как LIFO, но вы должны определить итератор (содержит только NODE *), и, например, BOOL hasnext(*ITERATOR) и struct dat * next(*ITERATOR)
  • остальные, ограничено только вашими требованиями

NB: Я предполагал, NODE.data был struct dat * не struct dat ...

Смежные вопросы