Ir para conteúdo
Fah

Lista simplesmente encadeada tendo como argumento outra estrutura com dados

Recommended Posts

Boa Noite Pessoal!

Estou com dificuldade em implementar um exercício de lista simplesmente encadeada.  Nele pede para criar uma estrutura com os dados de um aluno (matricula, nome e media), e outra para ser a lista (com a estrutura com os dados do aluno e um no com as informações do próximo nó). Uma das opções é para inserir os dados de um novo aluno em ordem crescente de matricula. O código está dando erro. Vocês conseguem me dizer onde estou errando? Vejam meu código:

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct aluno{
    int matricula;
    char nome[100];
    float media;
};
typedef struct aluno Aluno;

struct no{
    Aluno* dados;
    struct no* prox;
};
typedef struct no No;
No* cria(No* l){
No* p=(No*)malloc(sizeof(No));
p->dados=NULL;
return l;
}
No* ins_ordenado(No* l,int mat,char* nome,float nota){
    Aluno* Al=(Aluno*)malloc(sizeof(Aluno));
    No* novo=(No*)malloc(sizeof(No));
    int i=0;
    Al->matricula=mat;
    while(nome!='\0'){
       Al->nome=nome;
       i++;
    }
    Al->nome=NULL;
    Al->media=nota;
    novo->dados=Al;
    No*p=l;
    No*aux=NULL;
    if(l==NULL){
        novo->prox=l;
        return novo;
    }
        while(p!=NULL&&p->dados->matricula<Al->matricula){
              aux=p;
              p=p->prox;
        }
        novo->prox=aux->prox;
        aux->prox=novo;
        if(p==NULL){
            novo->prox=NULL;
        }
    return l;
}
void imprime(No* l){
    No* p;
    printf("turma 1:\n");
    for(p=l;p!=NULL;p->prox){
        printf("Matricula: %d\t Nome: %s Nota:%f\n",p->dados->matricula,p->dados->nome,p->dados->media);
    }
    printf("\n");
}
int vazia(No* l){
    return(l==NULL);
}
int main(){
No* l1=cria(l1);
l1=ins_ordenado(l1,1,"Maria",5);
printf("vazia? %d",vazia(l1));
//imprime(l1);
return 0;
}


 

Desde já, Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica: ao invés de dizer que está dando erro, seria mais interessante dizer qual erro está dando. Muita coisa é sintaxe incorreta.

 

Antes de sair acessando e atribuindo coisas a ponteiros você faz bem em verificar se o retorno do malloc não é NULL.

Faz muito tempo que não mexo com C, então compila isso com os warnings ligados.

 

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

#define MAXNOME 100
struct aluno{
  int matricula;
  char nome[MAXNOME];
  float media;
};

typedef struct aluno Aluno;

struct no{
  Aluno* dados;
  struct no* prox;
};

typedef struct no No;

No* criar_lista(){
  No* tmp = (No*) malloc(sizeof(No));
  
  if (tmp == NULL) {
    printf("%s\n", strerror(errno));
    exit(1);
  }
  
  tmp->dados = NULL;
  tmp->prox = NULL;
  
  return tmp;
}

Aluno* criar_aluno() {
  Aluno* no_aluno = (Aluno*) malloc(sizeof(Aluno));
  if (no_aluno == NULL) {
    printf("%s\n", strerror(errno));
    exit(1);
  }
  return no_aluno;
}

Aluno* ler_aluno() {
  
  Aluno* no_aluno = criar_aluno();
  
  printf("Informe a matrícula:");
  scanf("%d%*c", &(no_aluno->matricula));
  
  printf("Informe o nome:");
  fgets(no_aluno->nome, 100, stdin);
  (*strrchr(no_aluno->nome, '\n')) = '\0';
  
  printf("Informe a média:");
  scanf("%f", &(no_aluno->media));
  
  return no_aluno;
}

No* inserir_ordenado(No* lista_alunos, Aluno* aluno) {
  if(lista_alunos == NULL) {
    return -1;
  }
  
  int posicao = 0;
  No* elemento = lista_alunos;
  No* anterior = NULL;
  if (elemento->dados == NULL && elemento->prox == NULL) {
    lista_alunos->dados = aluno;
  
  } else {
    
    while (elemento != NULL && elemento->dados->matricula < aluno->matricula) {
      anterior = elemento;
      elemento = elemento->prox;
    }
    
    No * tmp = (No*) malloc(sizeof(No));
    if (tmp == NULL) {
      printf("%s",strerror(errno));
      free(lista_alunos);
      free(aluno);
      exit(1);
    }
    
    tmp->dados = aluno;
    
    if (anterior == NULL) {
      tmp->prox = lista_alunos;
      return tmp;
    } else {
      if (elemento == NULL) {
        tmp->prox = NULL;
        anterior->prox = tmp;
      } else {
        tmp->prox = elemento;
        anterior->prox = tmp;
      }
    }
  }
  
  return lista_alunos;
}

void imprimir(const No* lista_alunos) {
  No* tmp = lista_alunos;
  while(tmp != NULL) {
    if (tmp->dados != NULL) {
      printf("Nome:%s\tMatrícula:%d\tMédia:%.2f\n", tmp->dados->nome, tmp->dados->matricula, tmp->dados->media);
    }
    tmp = tmp->prox;
  }
}

void desalocar(No* l) {
  if (l->prox == NULL) {
    free(l);
    return;
  } else {
    desalocar(l->prox);
    free(l);
  }
}
int main(){
  No* lista_alunos = criar_lista();
  imprimir(lista_alunos);
  
  Aluno * aluno;
  
  for(int i =0 ; i<5; i++) {
    aluno = ler_aluno();
    lista_alunos = inserir_ordenado(lista_alunos, aluno);
  }
  
  imprimir(lista_alunos);
  
  
  free(aluno);
  desalocar(lista_alunos);
  return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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

  • Conteúdo Similar

    • Por Marcelo Lopes Vidal
      #include<stdio.h> #include<string.h> #include<stdlib.h> struct aluno { char nome[20]; char endereco[50]; char data_de_nascimento[10]; char telefone[15]; float nota1; float nota2; }; struct aluno recadastramento(struct aluno valuno[10]); void media_das_notas(struct aluno valuno[10]); void aprovado_ou_reprovado(struct aluno valuno[10]); void mostrar_informacoes(struct aluno valuno[10]); int main(void) { struct aluno valuno[10]; int op; float media; int i; int j; printf("Digite as informacoes dos alunos"); for(i=1;i<11;i++) { printf("Digite O Nome Do Aluno[%d]\n\n",i); printf("Nome: "); fflush(stdin); gets(valuno[i].nome); printf("\nDigite O Endereco Do Aluno[%d]\n\n",i); printf("Endereco: "); fflush(stdin); gets(valuno[i].endereco); printf("\nDigite A Data De Nascimento Do Aluno [%d] No Formato <00/00/0000>\n\n",i); printf("Data De Nascimento: "); fflush(stdin); gets(valuno[i].data_de_nascimento); for(j=0;j <15; j++) { if(valuno[i].data_de_nascimento[2] != '/' && valuno[i].data_de_nascimento[5] != '/') { printf("ERRO! Digite novamente"); printf("\nDigite A Data De Nascimento Do Aluno [%d] No Formato <00/00/0000>\n\n",i); gets(valuno[i].data_de_nascimento); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite O Telefone Do Aluno [%d] No Formato <(DDD)00000-0000>\n\n",i); printf("Telefone Do Aluno: "); fflush(stdin); gets(valuno[i].telefone); for(j=0;j <15; j++) { if(valuno[i].telefone[0] != '(' && valuno[i].telefone[4] != ')' && valuno[i].telefone[10] != '-') { printf("ERRO! Digite novamente"); printf("Digite O Telefone Do Aluno [%d]: ",i); gets(valuno[i].telefone); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite A Primeira Nota Do Aluno [%d]\n\n",i); printf("Nota 1: "); scanf("%f",&valuno[i].nota1); printf("\nDigite A Segunda Nota Do Aluno [%d]\n\n",i); printf("Nota 2: "); scanf("%f",&valuno[i].nota2); } do { printf("\nMENU\n"); printf("- 1)Editar informações dos alunos \n 2)Mostrar as medias dos alunos \n 3)Dizer se os alunos foram aprovados medias >= 6 ou reprovados (medias <6)\n 4)Listar todas as informações dos alunos"); printf("\n\nOpcao::: "); scanf("%d",&op); switch(op) { case 1: recadastramento(valuno); break; case 2: media_das_notas(valuno); break; case 3: aprovado_ou_reprovado(valuno); break; case 4: mostrar_informacoes(valuno); break; default: printf("\nOpcao INVALIDA\n"); break; } }while(op > 0 && op < 5); } struct aluno recadastramento(struct aluno valuno[10]) //recadastramento de informações//Funções { int i; for(i=1;i<11;i++) { printf("\nDigite O Nome Do Aluno [%d]\n\n",i); printf("Nome: "); fflush(stdin); gets(valuno[i].nome); printf("\nDigite O Endereco Do Aluno [%d]\n\n",i); printf("Endereco: "); fflush(stdin); gets(valuno[i].endereco); printf("\nDigite A Data De Nascimento Do Aluno [%d] No Formato <00/00/0000>\n\n",i); printf("Data De Nascimento: "); fflush(stdin); gets(valuno[i].data_de_nascimento); int j; for(j=0;j < 11; j++) { if(valuno[i].data_de_nascimento[2] != '/' && valuno[i].data_de_nascimento[5] != '/')//validção de data no formato correto { printf("ERRO! Digite novamente"); printf("\nDigite A Data De Nascimento Do Aluno [%d]No Formato <00/00/0000>\n\n",i); gets(valuno[i].data_de_nascimento); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite O Telefone Do Aluno [%d] No Formato <(DDD)00000-0000>\n\n",i); printf("Telefone Do Aluno: "); fflush(stdin); gets(valuno[i].telefone); for(j=0;j <15; j++)//validção de numero no formato correto { if(valuno[i].telefone[0] != '(' && valuno[i].telefone[4] != ')' && valuno[i].telefone[10] != '-') { printf("ERRO! Digite novamente"); printf("Digite O Telefone Do Aluno [i]: ",i); gets(valuno[i].telefone); break; } else { printf("FORMATO CORRETO"); break; } } printf("\nDigite A Primeira Nota Do Aluno [%d]\n\n",i); printf("Nota 1: "); scanf("%f",&valuno[i].nota1); printf("\nDigite A Segunda Nota Do Aluno [%d]\n\n",i); printf("Nota 2: "); scanf("%f",&valuno[i].nota2); } } void media_das_notas(struct aluno valuno[10])//media de notas { int i; for(i=1;i<11;i++) { float media; media = (valuno[i].nota1 + valuno[i].nota2) / 2; printf("Media: %.2f\n",media); } } void aprovado_ou_reprovado(struct aluno valuno[10])//se foi aprovado ou reprovado { int i; for(i=1;i<11;i++) { float media; media = (valuno[i].nota1 + valuno[i].nota2) / 2; if(media >= 6) { printf("\nAluno [%d] APROVADO\n",i); } else { printf("\nAluno [%d] REPROVADO\n",i); } printf("\nMedia do Aluno[%d]: %.2f\n",i,media); } } void mostrar_informacoes(struct aluno valuno[10])//mostrando informções de cadastro { int i; for(i=1;i<11;i++) { printf("-Listagem Do Aluno[%d]",i); printf("\n\nNome do Aluno[%d]: %s",i,valuno[i].nome); printf("\nEndereco do Aluno[%d]: %s",i,valuno[i].endereco); printf("\nData De Nascimento do Aluno[%d]: %s",i,valuno[i].data_de_nascimento); printf("\nTelefone do Aluno[%d]: %s",i,valuno[i].telefone); printf("\nNota 1 do Aluno[%d]: %.2f ",i,valuno[i].nota1); printf("\nNota 2 do Aluno[%d]: %.2f ",i,valuno[i].nota2); } } //Fim Do Codigo  
    • Por willianvaneli
      Preciso enviar struct via winsock de um cliente em C para servidor em Python.
       
      to apanhando muito e já fiz diversas mudanças porém não consegui acertar. Resumindo estou completamente perdido.
      Fiz um cliente que salvava todas informações da estrutura em uma unica string e enviava .... deu tudo certo ... porém quando tento enviar a estrutura tudo cai em ruínas =õ(

      cliente em C:
       
      #include <stdio.h>
      #include <winsock.h>
      #include <conio.h>
      #include <windows.h>
      #include <string.h>
      //ESTRUTURA QUE CONTEM OS DADOS PARA ENVIAR PARA O SERVIDOR
      typedef struct Dados {
          int idMensagem;
          int umidade;
          int temperatura;
          char data[128];
          char confirmacao[2];
      }TDados,*PDados;

      //FUNCAO QUE GERA DADOS A SEREM ENVIADOS PARA O SERVIDOR
      TDados gera_dados(TDados dados){
          srand(time(NULL));
          dados.idMensagem++;
          dados.umidade=30+(rand() % 60);
          dados.temperatura=(rand() % 100)-50;
          strcpy(dados.confirmacao,"");
          /** Gera a data e hora atual:*/
          time(&dados.data);
          strftime(dados.data,sizeof(dados.data), "%H:%M:%S %A %d %b %Y \n", localtime(&dados.data));
          printf(dados.data);
          /*strcpy(dados.date,"Data: ");
          strcat(dados.date,__DATE__);
          strcat(dados.date," - Hora: ");
          strcat(dados.date,__TIME__);*/
          return dados;
      }
      int main(int argc,char *argv[]) {    
          //DECLARANDO VARIAVEIS
          WSADATA data;
          SOCKET winsock;
          SOCKADDR_IN sock;
          char strDados[1024];
          int bytes;
          TDados dados;
          PDados pdados;
          dados.idMensagem=0;
          int idCliente=5;
          while(1){
              //INICIALIZANDO WINSOCK
              if(WSAStartup(MAKEWORD(1,1),&data)==SOCKET_ERROR){
                  printf("Erro ao inicializar o winsock");
                  return 0;
              }
              //CRIANDO SOCKET
              if((winsock = socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR){
                  printf("Erro ao criar socket");
                  return 0;
              }
              //ESTRUTUDA DO SOCKET
              sock.sin_family=AF_INET;
              sock.sin_port=htons(5000);
              sock.sin_addr.s_addr=inet_addr("127.0.0.1");
              
              //GERANDO DADOS...
              printf("\n ------------GERANDO OS DADOS--------------- \n");
              dados=gera_dados(dados);
              //sprintf(strDados,"%d,%d,%d,%d,%s",idCliente,dados.idMensagem,dados.umidade,dados.temperatura,dados.date);
              //printf("\n ------------IMPRIMINDO OS DADOS--------------- \n");
              //printf(strDados);
              printf("\n --------------------------- \n");
              //CONEXAO COMO SERVIDOR, CASO NÃO SE CONECTE RETORNA ERRO
              if(connect(winsock,(SOCKADDR*)&sock,sizeof(sock))==SOCKET_ERROR){
                  printf("Erro ao se conectar");
                  return 0;
              }
              printf("Conectado!\n");    
              while(strcmp(dados.confirmacao,"ok")){
                  printf("Enviando Dados ao servidor!\n");
                  //ENVIANDO MENSAGEM
                  //char buffer[sizeof(Header)];(TDados*)
                  //memcpy(buffer, &header, sizeof(Header));
                  char* pdados= (PDados)malloc (sizeof(TDados)*1);   /// DEI MOLLOC PRA ENVIAR PELO WINSOCK
                  memcpy(pdados, &dados, sizeof(dados));               /// MEMCPY NEM SEI Q Q ISSO DIREITO USEI PQ MANDARAM
                  if(send(winsock,pdados,sizeof(dados),NULL) < 0){  /// ENVIANDO PELO WINSOCK
                      perror("Erro ao enviar a mensagem \n");
                      exit(1);
              }
                  //RECEBENDO CONFIRMACAO
                  printf("Recebendo resposta do servidor!\n");
                  memset(dados.confirmacao,0,2);
                  bytes=recv(winsock,dados.confirmacao,2,0);
                  if(bytes==-1){
                      printf("Conexão perdida");
                      getch();
                      return 0;
                  }else{
                      printf("\nMensagem Recebida %s \n",dados.confirmacao);
                  }
              }
              
              closesocket(winsock);
              //FAZ O PROGRAMA ESPERAR 30 SEGUNDOS PARA ENVIAR NOVA MENSAGEM
              Sleep(30000);
          }
          getch();
          closesocket(winsock);
          WSACleanup();
          return 0;
          
      }
       
      ------------------------------------------------------------------------------------------------------------------------------
      servidor em python ... NOTA : AINDA NÃO SEI RECEBER NA ESTRUTURA CORRETAMENTE.
       
      import base64
      # FUNCAO DE PERSISTENCIA
      def salvaLog(string):
          try:
              with open('log.txt','rt') as arq:
                  conteudo = arq.readlines()
                  if conteudo!="":
                      conteudo.append("\n")
                  conteudo.append(msg)
          except IOError:
              print('Arquivo não encontrado!')
          #~ arq=open('log.txt','rt',encoding="utf-8")
          #~ conteudo = arq.readlines()
          #~ if conteudo!="":
              #~ conteudo.append("\n")
              conteudo=msg
          arq=open('log.txt','wt',encoding="utf-8")
          arq.writelines(conteudo)
          arq.close()
      import struct
      idMensagem=0
      umidade=0
      temperatura=0
      data=b''
      confirmacao=b''

      import socket
      HOST = ''              # Endereco IP do Servidor
      PORT = 5000            # Porta que o Servidor esta
      tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      orig = (HOST, PORT)
      tcp.bind(orig)
      tcp.listen(5)
      while True:
          print ('Servidor Aberto\n')
          conexao, cliente = tcp.accept()
          print ('Conectado por', cliente)
          print ('Recebendo mensagem\n')
          msg = conexao.recv(142)
          print(len(msg))
          print (struct.calcsize('i i i 128s 2s'))
          print (msg)
          print(msg.decode())
          #~ msg= base64.decodebytes(msg)
          #~ print (msg)
          #~ print (msg.decode())
          cod = struct.unpack('i i i 128s 2s',msg)
          print (cod)
          (idMensagem,umidade,temperatura,data,confirmacao) = struct.unpack('i i i 128s 2s',msg)
          print ("Mensagem recebida, decodificando....\n")
          msg=msg.decode('UTF-8')
          print(msg)
          resposta='ok'
          conexao.send(resposta.encode())
          print ('\nSalvando em LOG as informacoes do cliente', cliente)
          salvaLog(msg)
          print ('\nFinalizando conexao do cliente', cliente)
          print("\n ----------------------------------------- \n")
          conexao.close()
       
    • Por Manu Oliveira
      Vetor é um conjunto de variáveis subordinadas a um único nome e struct também é um conjunto de variáveis subordinadas a um único nome.  Meu professor pediu para diferencia -las. mais estou com dificuldade.
       
       
    • Por diegowell25
      Preciso criar uma agenda de contatos distribuída com as seguintes características:
      Cada contato deverá conter: nome, número de telefone, número de celular, endereço, e-mail.
      Agenda deve funcionar menu da seguinte forma: adição, remoção, alteração ou pesquisa de algum contato.
      Deve salvar os contatos em um arquivo .txt formatado.
       
      Estou fazendo assim:
      Abro o arquivo em modo de leitura ("r" = read).
       
      Verifico se existe;
      Se não, eu defino o tamanho do vetor e vou para o menu para cadastrar e salvo um novo arquivo em modo de leitura "w";
       
      Se existir, eu leio o arquivo.txt(formatado) e envio os dados para struct (NÃO SEI FAZER ISSO), e continuo a incrementação se for o cada de um novo cadastro, depois salvo tudo (o que ja tinha e o novo cadastro)
       
      Alguém tem algum exemplo de como pode fazer isso sem ser binário?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.