Escreva uma instrução ou um conjunto de instruções para realizar cada uma das tarefas a seguir. Suponha que todas as manipulações ocorram em main (portanto, endereços de variáveis de ponteiro não são necessários), e considere as seguintes definições:
struct gradeNode {
char lastName[ 20 ];
double grade;
struct gradeNode *nextPtr;
};
typedef struct gradeNode GradeNode;
typedef GradeNode *GradeNodePtr;
a) Crie um ponteiro para o início da lista chamada startPtr . A lista está vazia.
b) Crie um novo nó do tipo GradeNode que seja apontado pelo ponteiro newPtr do tipo GradeNodePtr . Atribua a string “Jones” ao membro lastName e
o valor 91.5 ao membro grade (use strcpy ). Inclua todas as declarações e instruções necessárias.
c) Suponha que a lista apontada por startPtr atualmente consista em 2 nós - um contendo “Jones” e um contendo “Smith” . Os nós estão em ordem alfabética. Indique as instruções necessárias para inserir nós na ordem contendo os seguintes dados para lastName e grade. Use ponteiros previousPtr , currentPtr e newPtr para realizar as inserções. Informe para onde pre-
viousPtr e currentPtr apontam antes de cada inserção. Suponha que newPtr sempre aponte para o novo nó, e que o novo nó já tenha recebido dados.
d) Escreva um loop while que imprima os dados em cada nó da lista. Use o ponteiro currentPtr para se movimentar pela lista.
e) Escreva um loop while que exclua todos os nós na lista e libere a memória associada a cada nó. Use o ponteiro currentPtr e o ponteiro tempPtr para percorrer a lista e liberar a memória, respectivamente.
Passo 1
Fala galera, tudo tranquilo? Primeiramente, as linhas de códigos acima são uma estrutura auto referenciada. O que ele nos pede no item (a) é para escrever uma linha de código ou ponteiro que que é dado ao fazer:
int main ( void ) {
GradeNodePtr startPtr = NULL; /*Se ouver espaço disponível*/
Para o item (b) vamos precisar copiar as linhas acima para nos situarmos melhor
struct gradeNode {
char lastName[ 20 ];
double grade;
struct gradeNode *nextPtr;
};
typedef struct gradeNode GradeNode;
typedef GradeNode *GradeNodePtr;
Agora que já copiamos, vamos fazer o que se pede.
Criar um nó que sela apontado pelo ponteiro newPtr
/*criando nó*/
GradeNodePtr newPtr;
newPtr = malloc(sizeof(GradeNode)); /* nó alocado na memória */
Atribuir string “Jones” usando o strcpy
strcpy (newPtr -> lastName, “Jones”);
newPtr -> grade = 91.5;
/* atribuir ponteiro*/
newPtr -> nextPtr = NULL;
Passo 2
Vamos ao item (c). Precisamos dar instruções para inserir nós em ordem alfabética. Para isso iremos fazer algumas intrusões.
Primeiro vamos adicionar Adam:
previousPtr is NULL, currentPtr /* aponta para o primeiro nome ou elemento da lista*/
então fazemos a atribuição
newPtr -> nestPtr = currentPtr;
Adicionando Thompson
previousPtr /* aponta para o último nome ou elemento da lista Simth*/
currentPtr is NULL;
então fazemos a atribuição
newPtr -> nextPtr = currentPtr;
previousPtr -> nextPtr = newPtr;
Adicionando Pritchard
previousPtr /*agora aponta para Jones*/
currentPtr /* aponta para Smith */
newPtr -> nextPtr = currentPtr;
previousPtr -> nextPtr = newPtr;
essa letra c é um ciclo de relações utilizadas. perceba que sempre o código procura elementos mais próximos.
(d) Ele nos pede um loop. Você ainda lembra do comando while, certo? Ele quer que usemos o currentPtr para se mover na lista.
Podemos começar com:
while (currentPtr != NULL) { /* enquanto currentPtr for diferente de NULL, ele vai adicionar elemento a lista “lastName”*/
printf (“lastName = %s\nGrande =%6.2f\n”
agora para que ele possa se movimentar na lista:
currentPtr -> lastName, currentPtr -> grade);
currentPtr = currentPtr -> nextPtr;} /* fim do while. Assim ele pode se mover pela lista pois as atribuições estão interligadas*/
(e) agora precisamos fazer um loop para todos os nós e liberar memória. Para liberar memória usaremos o free.
while (currentPtr != NULL) {
agora usando o ponteiro tempPtr
tempPtr = currentPtr;
currentPtr = currentPtr -> nextrPtr; /* mais uma vez movendo-se pela lista*/
agora para liberar espaço alocado usamos o free
free (tempPtr); } /* fim do while*/
statPtr = NULL;
Resposta
a) GradeNodePtr startPtr = NULL;
b) struct gradeNode {
char lastName[ 20 ];
double grade;
struct gradeNode *nextPtr;
};
typedef struct gradeNode GradeNode;
typedef GradeNode *GradeNodePtr;
/*criando nó*/
GradeNodePtr newPtr;
newPtr = malloc(sizeof(GradeNode)); /* nó alocado na memória */
strcpy (newPtr -> lastName, “Jones”);
newPtr -> grade = 91.5;
/* atribuir ponteiro*/
newPtr -> nextPtr = NULL;
c) //Primeiro vamos adicionar Adam
previousPtr is NULL, currentPtr /* aponta para o primeiro nome ou elemento da lista*/
então fazemos a atribuição
newPtr -> nestPtr = currentPtr;
//Adicionando Thompson
previousPtr /* aponta para o último nome ou elemento da lista Simth*/
currentPtr is NULL;
então fazemos a atribuição
newPtr -> nextPtr = currentPtr;
previousPtr -> nextPtr = newPtr;
//Adicionando Pritchard
previousPtr /*agora aponta para Jones*/
currentPtr /* aponta para Smith */
newPtr -> nextPtr = currentPtr;
previousPtr -> nextPtr = newPtr;
d) while (currentPtr != NULL) { /* enquanto currentPtr for diferente de NULL, ele vai adicionar elemento a lista “lastName”*/
printf (“lastName = %s\nGrande =%6.2f\n”
currentPtr -> lastName, currentPtr -> grade);
currentPtr = currentPtr -> nextPtr;} /* fim do while. Assim ele pode se mover pela lista pois as atribuições estão interligadas*/
e) while (currentPtr != NULL) {
tempPtr = currentPtr;
currentPtr = currentPtr -> nextrPtr; /* mais uma vez movendo-se pela lista*/
free (tempPtr); } /* fim do while*/
statPtr = NULL;
Com isso encerramos nosso exercício. Até a próxima galerinha!