использование связанного списка для получения данных из файла - PullRequest
0 голосов
/ 30 января 2011

У меня есть текстовый файл с адресами электронной почты.

Я хочу получить эти электронные письма и сохранить их в любой структуре данных или переменной. Затем мне нужно выбрать адрес электронной почты из случайной структуры данных.

    #include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string>

struct link_list
{
    char mail[50];
    int counter;
    struct link_list *next;
};
typedef struct link_list node;


void main()
{
FILE *fp ;
char string1[80];
node *head;
int count_length=0;
char *fname = "email.txt";
fp = fopen ( fname, "r" ) ;
char line [ 128 ]; /* or other suitable maximum line size */
int count=0;

while ( fgets ( line, sizeof line, fp ) != NULL ) /* read a line */
{
    count++;
    if(head==NULL)
    {
        head=(node *)malloc(sizeof(node));
        fscanf(fp,"%s",string1);
        strcpy(head->mail,string1);
        head->counter=count;
        head->next=NULL;

    }
    else
    {
    node *tmp = (node *)malloc(sizeof (node));
    fscanf(fp,"%s",string1);
    strcpy(tmp->mail,string1);
    tmp->next = head;
    tmp->counter=count;
    head = tmp;

    }

}

fclose(fp);
fp = fopen ( fname, "r" ) ;

fclose(fp);
//printf("%d",count_length);
getch();
}

Я редактировал код .. Я получаю ошибку подтверждения

Ответы [ 2 ]

2 голосов
/ 30 января 2011

Попробуйте добавить новые записи в начало списка вместо хвоста.Например:

node *tmp = malloc(sizeof *tmp);
fscanf(fp, "%s", tmp->mail);
tmp->next = head;
head = tmp;
0 голосов
/ 29 мая 2011

Вы можете использовать fseek, если вы делаете первый проход, чтобы найти смещения для начала каждого элемента.

Или вы можете использовать трюк из Практики программирования, где вы инвертируете распределение вероятностей случайногопроверить с помощью мода вместо деления.Это позволяет выбрать случайный элемент из списка неизвестной длины всего за один проход.

Эта программа использует технику для выбора и печати случайного символа из строки за один проход.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    char *s = "asequenceofasciivalues";
    int i;
    char o;
    srand(time(NULL));
    o = s[0];
    for (i=0; s[i]; i++)
        if (rand() % (i+1) == 0)
            o = s[i];
    printf("%c\n", o);
    return 0;
}
...