Como alterar um registro usando lista encadeadaem C

ai pessoal, preciso urgente de uma dica de como alterar um cadastro em uma lista encadeada.
por favor me deem uma ajudinha.
o codigo e o seguinte:

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

typedef struct cad{
char nome[30];
char end[40];
char cid[15];
char est[3];
char tel[12];
struct cad *prox;
}entrada_lista;
entrada_lista *inicio;

int agenda(void);
void inserir(void);
void alterar(void);
void remover(void);
void listartodos(void);
void listarultimo(void);

int main(void){

inicio=NULL;
            for (;;){
                switch(agenda()){
                               case 1:inserir();
                                    break;
                               case 2:alterar();
                                    break;
                               case 3:remover();
                                    break;
                               case 4:listartodos();
                                    break;
                               case 5:listarultimo();
                                    break;
                               case 6:exit(0);
                               }
                               }
                              }

int agenda(void){
int c;
system(“cls”);
printf("\t\t********************************\n");
printf("\t\t*********** AGENDA \n");
printf("\t\t
*******************\n");
printf("\n1 - Inserir\n");
printf("\n2 - Alterar\n");
printf("\n3 - Remover Ultimo Contato\n");
printf("\n4 - Listar Todos\n");
printf("\n5 - Listar Ultimo\n");
printf("\n6 - Sair\n\n");

do{
            printf("Opcao:");
            scanf("%d",&c);
            }while (c<1||c>6);
            return c;
            }

void inserir(void){
entrada_lista *info;

 info=(entrada_lista *)malloc(sizeof(entrada_lista));
 if (!info){
            printf("\nSem Memoria");
            return;
            }
            system("cls");
            printf("\nDigite o Nome:");
            gets(info->nome);          
            gets(info->nome);                
            printf("\nDigite o Endereco:");
            gets(info->end);               
            printf("\nDigite a Cidade:");
            gets(info->cid);
            printf("\nDigite o Estado:");
            gets(info->est);
            printf("\nDigite o Telefone:");
            gets(info->tel);
            
            info->prox=inicio;
            inicio=info;
            }

void alterar(void){
char s;
entrada_lista *alte;
/*alte=(entrada_lista )malloc(sizeof(entrada_lista));/
system(“cls”);
entrada_lista *percorre_lista;
system(“cls”);
percorre_lista=inicio;
printf("\n\t\t\tContatos Armazenados\n\n");
while (percorre_lista!=NULL){
printf("\nNome: %s",percorre_lista->nome);
printf("\nEndereco: %s",percorre_lista->end);
printf("\nCidade: %s",percorre_lista->cid);
printf("\nEstado: %s",percorre_lista->est);
printf("\nTelefone: %s\n",percorre_lista->tel);
printf("\nDeseja Alterar Este Contato?");
scanf("%c",s);
if (s == ‘S’ || ‘s’){
system(“cls”);
printf("\nDigite o Novo Nome:");
gets(alte->nome);
gets(alte->nome);
printf("\nDigite o Novo Endereco:");
gets(alte->end);
printf("\nDigite a Nova Cidade:");
gets(alte->cid);
printf("\nDigite o Novo Estado:");
gets(alte->est);
printf("\nDigite o Novo Telefone:");
gets(alte->tel);
}
percorre_lista=percorre_lista->prox;
}
}

void remover(void){
entrada_lista *aux;
if (aux==NULL){
system(“cls”);
printf(“ERRO!!!”);
return;
}
else{
aux=inicio;
inicio=inicio->prox;
free(aux);
}
}

void listartodos(void){
entrada_lista *percorre_lista;
system(“cls”);
percorre_lista=inicio;
printf("\n\t\t\tContatos Armazenados\n\n");
while (percorre_lista!=NULL){

                       printf("\nNome: %s",percorre_lista->nome);
                       printf("\nEndereco: %s",percorre_lista->end);
                       printf("\nCidade: %s",percorre_lista->cid);
                       printf("\nEstado: %s",percorre_lista->est);
                       printf("\nTelefone: %s\n",percorre_lista->tel);
                       percorre_lista=percorre_lista->prox;
                       }

getch();

                       }

void listarultimo(void){

 entrada_lista *percorre_lista;
 system("cls");
 percorre_lista=inicio;
 printf("\n\t\t\tUltimo Contato Armazenado\n\n");
 while (percorre_lista!=NULL){
                        printf("\nNome: %s",percorre_lista->nome);
                        printf("\nEndereco: %s",percorre_lista->end);
                        printf("\nCidade: %s",percorre_lista->cid);
                        printf("\nEstado: %s",percorre_lista->est);
                        printf("\nTelefone: %s\n",percorre_lista->tel);
                        percorre_lista=NULL;
                        }

getch();
}