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 new­Ptr 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!