Lista Circular em C


25-04-2006 por Kati690
Lista Circular em C
Gente, tenho um programa para abrir arquivos em C e armazenar em um vetor.

Ta aí:


Código:
#include<stdio.h> #include<conio.h> #include<stdlib.h> struct no { char ID[2]; int tamanho; }; typedef struct no No; int main() { No vetor[15]; int N=0,i; char nome[10]; FILE * pFile; pFile = fopen ("myfile.txt","r"); if (pFile!=NULL) { fscanf(pFile,"%d",&N); printf("%d",N); getche(); for (i=0; i < N; i++) { fscanf(pFile,"%s %d",&vetor[i].ID,&vetor[i].tamanho); } fclose(pFile); } for (i=0; i<N; i++) { printf("Nome: %s Tamanh %d\n\n",vetor[i].ID,vetor[i].tamanho); } getch(); return 0; }
O arquivo que ele abre é o seguinte:

p1 2
p2 3
p3 20
p4 15
p5 24

*fazer no bloco de notas


os valores que vem depois do p... (que podem ser qualquer um) tem que ser armazenados em uma lista circular...
Alguém sabe como fazer?

Como armazenar o arquivo aberto em uma lista circular?

me ajudem por favor

Beijinhos!!!
25-04-2006 por Rui_Carlos
para começar podia utilizar as tags 'code' para o código ficar legível, depois podia indicar o SO (pelo que percebi é o Windows, certo?).

o que é que você considera uma lista circular? é uma lista ligada?
veja se consegue explicar melhor...
25-04-2006 por Kati690
É Windows sim!
e também é uma lista ligada como um anel... entende?!
25-04-2006 por jackinabox
Citação:
Postado Originalmente por Kati690
Como armazenar o arquivo aberto em uma lista circular?
É uma história meio grande demais para ser explicada em um fórum. Você não está querendo que alguém lhe dê uma implementação pronta não, né?
26-04-2006 por Kati690
Caro Amigo, estou fazendo um escalonador de processos... mas não sei muito bem trabalhar com arquivos.
Não precisa ser a implementação não... apenas uma ajuda. Se tiver algo pronto e puder me enviar agradeço herica_mp@hotmail.com
senãao vou continuar tentando ... um dia sai!
rs...
Obrigada mesmo assim!
26-04-2006 por peczenyj
Veja um exemplo de lista duplamente encadeada:

http://www.java2s.com/Code/C/Data-Structure-Algorithm/illustratestheuseandmaintenanceofdoublylinkedlists .htm

Algumas coisas que eu percebi:

Vc lê o tamanho N com o scanf no inicio do arquivo, mas o formato do seu arquivo é diferente. Sugiro que vc conte o numero de linhas com uma rotina desse tipo:

Código:
char ch; int tam = 0; while((ch = fgetc(pFile)) != EOF){ if (ch == '\n') tam++; } rewind (pFile); /* veja depois o que acontece sem este comando e pesquise o que ele faz */
outra coisa, seria interessante vc usar algum tipo de alocação dinamica. Eu faria assim:

Código:
/*Fora do main*/ // Definição de um No typedef struct No{ char ID[2]; int tamanho; } TNo; /* Definição de um vetor de nos isto eh util para termos nao apenas os vetores como um 'objeto' que contem tanto o vetor quanto o numero de elementos uma vez que nao precisamos de variaveis adicionais para limitar os laços de repeticao. */ typedef struct Vector{ TNo *no; int size; } TVector; /* dentro do main */ TVector vector; ... vector.size = tam; // obtido daquela forma vector.no = calloc(vector.size,sizeof(TNo)); if(vector.no == NULL){ printf("Erro ao alocar memoria\n"); exit(3); } for (i=0; i < vector.size; i++) fscanf(pFile,"%s %d",vector.no[i].ID,&vector.no[i].tamanho); fclose(pFile);
Perceba que para ler o vector.no[i].ID vc não precisa colocar o operador & pois como ID é uma matriz, o 'nome' da matriz sem os '[ ]' ja é um ponteiro.

Agora que vc ficou fera em manipular arquivos, lendo-os ao seu bel prazer, sugiro que vc se concentre no problema em si, em como adaptar o conteito de lista duplamente encadeada ao que vc quer fazer.
26-04-2006 por jackinabox
Citação:
Postado Originalmente por Kati690
... Obrigada mesmo assim!
Desculpe-me se fui "hostil" :-D

É que é relativamente comum encontrarmos posts que buscam respostas prontas, cujo autor do post nem mesmo estudou previamente o assunto em material de referência, documentação, etc. É que acho realmente muito difícil obter algumas informações sobre assuntos mais intrincados em um fórum. Eu mesmo, ou procuraria no Google, ou em material de referência impresso (livros, etc.), se eu precisasse de informações nesse nível, simplesmente por razões práticas.

Em minha opinião, é perfeitamente viável a ajuda e o esclarecimento de dúvidas pontuais através de um fórum, mas muitas vezes é impraticável fornecer (ou obter) ajuda sobre um tópico inteiro, principalmente os mais intrincados. O esforço necessário para explicar em um fórum (e em contrapartida o esforço necessário para entender) determinados assuntos seria infinitamente maior do que o esforço necessário para obter informações mais abrangentes, e em geral de melhor qualidade e mais dirigidas através, por exemplo, de um livro. Ou do Google.

Com relação a listas encadeadas em geral, incluindo algumas explicações sobre listas circulares, e até desenhos passo a passo das operações com listas encadeadas, talvez esse material possa ajudar em algo:

http://www.ppgia.pucpr.br/~laplima/aulas/materia/listas_m.html
26-04-2006 por Kati690
Então... tava olhando o que vcs me enviaram...
O que ocorre é o seguinte: eu fiz um escalonador de processo... porém quero que os processos sejam recebidos via arquivo de texto... dei uma modificada pra facilitar e só receber números...
Vejam

struct process {
int pid; /* Nome */
int burst; /* Surto */
int priority; /* Prioridade */
int working; /* Working time */
int waiting; /* Waiting time */
struct process *next;
};

struct process *init_process (int pid, int burst, int priority);
void listprocs (struct process *proc);
void priority (struct process *proc);
void rr (struct process *proc, int quantum);
int main (void) {

struct process *plist, *ptmp;
plist = init_process(1, 10, 2);
plist->next = init_process(2, 5, 1); ptmp = plist->next;
ptmp->next = init_process(3, 25, 2); ptmp = ptmp->next;
ptmp->next = init_process(4, 30, 2); ptmp = ptmp->next;
ptmp->next = init_process(5, 35, 2);

rr(plist, 5);

Acho que assim fica mais fácil... ele precisa receber um TXT que tenha o 1 10 2 em uma linha
2 5 1 segunda linha... e assim por diante.
Com vetor deu certo mas vou ter que receber direto... aí no init_process.
Sabem como posso fazer... a rotina realmente deve ser simples. E é o único módulo que ainda não consegui implementar. Sei também que é difícil explicar por aqui.
Mas se puderem... agradeço muito.
E desculpem se disse algo que não devia, fiquei até as 4 da manhã acordada par conseguir implementar na encadeada, estou um pouco exausta... Agora está apenas numa lista.
Se puderem me ajudar agradeço MESMO!

Beijos,
Hérica
26-04-2006 por Kati690
ah... o fgetc não funciona no meu programa :-)
26-04-2006 por jqueiroz
Kati690, quando postar um código, por favor, coloque as tags [code] e [/code] em volta, para que possamos visualizá-lo... outra coisa, quando se trabalha com programação estruturada, é importante que a gente consiga visualizar onde os blocos começam e terminam, por isso se usa a indentação (colocação de espaços no início da linha conforme o nível de aninhamento dos blocos). Não deixe de usar, e não deixe de colocar aqui também.
26-04-2006 por jackinabox
Talvez possamos tentar uma abordagem por partes. A dificuldade inicial estaria em montar a lista circular (na definição da estrutura de dados e funções que a manipulam) ou no tratamento do arquivo (leitura dos valores)?
27-04-2006 por Kati690
Olá... bem me desculpe... eu não sabia como postar ;-)

Amigos... já consegui terminar... Agradeço aos que me ajudaram :-)

Beijinhos
Katinha
 
Guia do Hardware Melhores Tópicos