Ir ao conteúdo
  • Cadastre-se

C Referência funções que tenham lista encadeada


Posts recomendados

Boa tarde,

 

Estou realizando um trabalho da faculdade mas estou com duvida, eu necessito desenvolver uma lista encadeada com cursos de um plataforma de ensino, assim, eu tenho que criar um menu, com uma opção é adicionar um curso, ai informo o código e o nome do curso, esses valores passo pra uma lista encadeada, posterior em outra opção eu adiciono os aluno aos curso que eu adicionei anteriormente, contudo estou com dúvida como posso adicionar os alunos, ao mesmo curso que eu adicionei anteriormente, e se caso eu tenho dois curso eu possa informar o código da turma e ele adicione os valores referenciados ao curso certo. Poderiam me ajudar a como eu posso ligar os alunos ao curso e possa escolher qual curso eu quero adicionar. Tenho um limite de 6 alunos por curso. 

 

Agradeço qualquer ajuda ou ideia de onde posso buscar um meio de fazer isso. 

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

#define NOME 50

struct nodoA{
	int codA;
	char nomeA[20];
}aluno;

//Estrutura do nodo
struct nodoC{
	int codC;
	char nomeC[10];
	struct nodoA alunos [6];
	struct nodoC *proxC;
}curso;

struct nodoC *auxC;
struct nodoC *inicio;
int valor;
char nC [10];
char nA [20];

// Procedimento para inserir curso
void insere_curso(int codigC, char vetC [])
{
	auxC=(struct nodoC*)malloc(sizeof(curso));
	auxC->codC=codigC;
	auxC->proxC=NULL;
	strcpy( auxC->nomeC, vetC);
	if(inicio == NULL){
		inicio = auxC;
		}
	else{
		auxC->proxC=inicio;
		inicio=auxC;
	}
}

void insere_aluno(int codigC,int codigA, char vetA){

	curso.codC=codigC;
	for(int i=0; i<6; i++){
		auxC->alunos[i].codA=codigA;
		strcpy( auxC->alunos[i].nomeA, vetA);
	}
}

int consulta(int valor)
{
  int resp = 0;
  struct nodoC *atual = inicio;
  while(atual != NULL){
	 if(atual->codC == valor){
        resp = 1;
     }
	 atual = atual->proxC;
  }
  return resp;
}

void exclui()
{
  struct nodoC *atual = inicio;
  if(inicio != NULL){
    inicio = inicio->proxC;
    free(atual); //libera o espaço ocupado na memória
  }
  else{
     printf("Lista Vazia\n");
  }
}

//remore curso
void remove_curso(int valor)
{
  struct nodoC *atual = inicio;
  struct nodoC *ant = NULL;

  if(inicio != NULL){ //Lista existe
     if(consulta(valor) != 1){ // Verifica se o valor existe na lista
        printf("Valor %d nao existe na lista\n",valor);
     }
     else{
          if(inicio->proxC == NULL){ //testa se a lista só possui um elemento
          // Valor existe na lista, mas a lista só possui um elemento
             free(inicio);
             inicio = NULL;
          }
          else{
               if(atual->codC == valor){ //Lista possui vários elementos e o elemento a ser excluido é o primeiro
                  exclui();
               }
               else{ //acha o valor a ser excluído
                  while(atual->codC != valor){
                     ant = atual;
                     atual = atual->proxC;
                  }
                  ant->proxC = atual->proxC;
                  free(atual);
               }
          }
     }
  }
  else{
     printf("Lista Vazia\n");
  }
}



void menu(){

	printf("\n-----------Centro de cursos (CCSO)-----------\n");
	printf("1 - Insere curso: \n");
	printf("2 - Insere aluno no curso: \n");
	printf("3 - Remove curso: \n");
	printf("4 - Remove aluno no curso: \n");
	printf("5 - Exibir curso em execucao em ordem de nome: \n");
	printf("6 - Exibir curso em execucao em ordem de ID: \n");
	printf("7 - Exibir nome dos alunos de um curso: \n");
	printf("8 - Exibir ID de todos os alunos: \n");
	printf("9 - Exibir curso de aluno: \n");
	printf("10 - Exibir curso que tem 6 alunos: \n");
	printf("11 - Exibir informações de um curso: \n");
	printf("0 - FIM \n");

}


int main(void) {
	setbuf(stdout, NULL);
	int resp = 1;
	menu();
	fflush(stdin);
	printf("\nDigite sua opcao: ");
	scanf("%d", &resp);

	while(resp != 0){
		switch(resp){
			case 1:	printf("\nDigite o ID do curso: ");
					scanf("%d",&valor);
					fflush(stdin);
					printf("\nDigite o nome do curso: ");
					gets(nC);
					fflush(stdin);

					insere_curso(valor, nC);
					break;


			case 2: printf("\nDigite o ID do curso: ");
					scanf("%d",&valor);
					fflush(stdin);
					printf("\nDigite o ID do aluno: ");
					scanf("%d",&valor);
					fflush(stdin);
					printf("\nDigite o nome do aluno: ");

//					insere_aluno;
					break;

			case 3:	printf("\nDigite o ID do curso a ser removido: ");
					scanf("%d",&valor);
					fflush(stdin);

					remove_curso(valor);
					break;

			case 4: printf("\nDigite o ID do curso: ");
					scanf("%d",&valor);
					fflush(stdin);
					printf("\nDigite o ID do aluno: ");
					scanf("%d",&valor);
					fflush(stdin);

					break;

			case 5:
					break;
			case 6:
					break;
			case 7:
					break;
			case 8:
					break;
			case 9:
					break;
			case 10:
					break;
			case 11:
					break;
		}

		menu();
		fflush(stdin);
		printf("Digite sua opcao:\n");
		resp=getch();
	}

	system("pause");
	return EXIT_SUCCESS;
}

 

 

Link para o comentário
Compartilhar em outros sites

Há 3 maneiras de organizar isso. Ao menos.

 

Tudo depende do que vai fazer depois com essas informações. Das funções do programa.

 

Você vai ter uma lista de cursos e uma lista de alunos. Ou alguma combinação de listas disso.

 

  • Pode ser que precise incluir uma lista de alunos para cada elemento da lista de cursos e baste.
  • Pode ser que precise incluir na lista de alunos uma lista de cursos e baste.
  • Pode ser que precise das duas coisas e então o mais simples é criar uma lista ou arquivo de relações, vinculando alunos a cursos e cursos a alunos. É o que faz um banco de dados: cria tabelas de relações e tabelas de dados.

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Boa noite arfneto,

 

Bom, o intuito do programa é realizar as opções da imagem abaixo, assim, estava pensando que eu teria que criar uma lista de alunos (que tivesse no máximo 6 alunos) para cada cursos (ID), assim eu poderia pesquisar os alunos, pois assim, vou cadastrar primeiramente o curso com a opção 1 do menu, e depois cadastrarei cada aluno. Com isso terei que mostrar e excluir tanto curso e alunos.

 

image.png.441d03470d4d45e7a8505d0b467e1812.png

Link para o comentário
Compartilhar em outros sites

Não tem um limite para o número de cursos que um aluno pode fazer? Se não tem deve criar uma lista de cursos no registro do aluno. Ou definir um limite mesmo e declarar um vetor fixo de cursos dentro da estrutura. Melhor confirmar com seu professor.

 

Como tem apenas uma lista de 6 possíveis alunos em cada curso pode definir mesmo um vetor de 6 caras e marcar lá a id de cada aluo inscrito.

 

O resto das informações pode levantar na hora da consulta mesmo, usando loops. Ou criar os arquivos ou tabelas de referência vinculando alunos e cursos

adicionado 19 minutos depois
int consulta(int);
void exclui()

Entenda que main() deve ser a primeira função de seu programa e não a última.

 

No início apenas declare as funções, são chamados protótipos, como acima.

 

Entenda que usar void() quase sempre é um desperdício de informação. E algumas vezes um erro.

 

É essencial você entender que uma lista encadeada é simplesmente uma abstração, e que você não deve misturar os conteúdos. Se prepare para tratar os dados e escreva seu programa em torno dos dados

 

não deve usar consulta() e exclui(). Não é esperto. Deve usar algo como

 

int     consulta(Dado*, Lista*);

int     exclui(Dado*,Lista*);

 

Porque?

 

Simples: você não quer programar toda vez a mesma coisa. Uma lista é uma lista, de cursos ou alunos ou livros ou músicas ou produtos...

 

Programe e teste sua lista em separado e apenas crie listas adicionais onde precisa. Ou vai levar uma eternidade para fazer o programa, a toa.

Lista* alunos;
Lista* cursos;
Lista* outra;

Muitas linguagens tem listas para você declarar e usar como se fossem um tio e conseguem isso declarando assim.

 

struct nodoA{
	int codA;
	char nomeA[20];
}aluno;

//Estrutura do nodo
struct nodoC{
	int codC;
	char nomeC[10];
	struct nodoA alunos [6];
	struct nodoC *proxC;
}curso;

struct nodoC *auxC;
struct nodoC *inicio;

Isso está um pouco confuso. Não vai criar uma lista de alunos? Então não devia usar essa nomenclatura de nodo.

E se vai usar entenda que todos esses "nodo" são iguais...

struct nodo
{
	Dado*    info;
	struct nodo* prox; // antes
	struct nodo* prev; // depois
}

Algo assim afinal. Dado pode ser qualquer coisa. Em C em geral se declara (void*) e converte quando preciso, por exemplo, para ponteiro para aluno ou curso. Em outras linguagens se usa algo como generics ou templates e assim pode ter listas de qualquer coisa, como alunos ou cursos.

 

Entenda que estruturalmente é igualzinho. Por isso essas são chamadas de tipos abstratos, uma maneira de representar coisas concretas como filas ou listas em programas de computador.

 

E isso simplifica muito as coisas e não o contrário

Link para o comentário
Compartilhar em outros sites

Não tem um limite pra cursos que o aluno pode fazer, podendo um aluno estar em vários cursos, professor especificou isso. Tem como eu referência a lista de alunos ao ID do curso? Pois além da ID do aluno, eu vou ter o nome do mesmo, e pode ocorrer que eu adicione um aluno posterior eu criar o curso, ou tenha que remover um aluno em especifico de um curso, assim preciso de uma informação para saber como identificar qual curso está, e qual aluno é. Mas to me atrapalhando nesse pensando, como eu posso referenciar uma coisa na outra. Desculpa pedir assim, mas to iniciando o uso de lista encadeada, ainda não entendo direito.

 

E muito obrigado pelas respostas, estão ajudando. 

Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Leonardo Burato disse:

Tem como eu referência a lista de alunos ao ID do curso?

Mas cada curso tem apenas 6 alunos no máximo. Porque não declara apenas um vetor de 6 e coloca os ids la?

 

Se fala do contrário veja o que te expliquei no primeiro post. O aluno tem uma lista de cursos, se não há limite apenas use uma lista. Ou apenas monte na hora de mostrar

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...