thuck
(usa Debian)
Enviado em 14/09/2008 - 23:56h
Bem, fiz o código abaixo na minha aula de SO, não é lá essas coisas, mas pode te dar uma luz, não tem o remover de uma posição, mas tem o inserir em uma posição e remover um item específico, creio que se vc olhar as duas funções deve ajudar:
#define NULL 0
#define FALSE 0
#define TRUE 1
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct item{
char nome[50];
char telefone[40];
int idade;
};
struct node{
struct item info;
struct node *proximo;
};
typedef struct{
struct node *inicio ;
struct node *fim ;
int num_elementos;
}lista;
typedef struct node *PPNODE;
void inserirNO(struct item *novo, lista *l);
void inicializarLista(lista *l);
struct item criarItem();
struct item *buscarItem(const char *string,lista *l);
PPNODE removerItem(const char *string, lista *l);
void mostrarLista(lista *l);
void ordenarLista(lista *l);
PPNODE buscarMenor(lista *l);
void menu();
void inserirNOP(struct item *novo, lista *l, int pos);
int main(void){
lista l;
struct item nitem, *bitem;
char nome[50];
int ok = TRUE, valor, pos;
inicializarLista(&l);
do{
menu();
scanf("%d",&valor);
switch (valor){
case 1: nitem = criarItem();
inserirNO(&nitem,&l);
break;
case 2:
if(l.num_elementos > 0){
printf("\nInsira o Nome: ");
scanf("%s",nome);
bitem = buscarItem(nome,&l);
if(bitem != NULL){
printf("\nNome: %s\n", bitem->nome);
printf("Telefone: %s\n", bitem->telefone);
printf("Idade: %d\n\n", bitem->idade);
}
else printf("\n\nNão está cadastrado\n\n");
}
else printf("\n\nNão há itens na lista\n\n");
break;
case 3:
if(l.num_elementos > 0){
printf("\nInsira o Nome: ");
scanf("%s",nome);
free(removerItem(nome,&l));
}
else printf("\n\nNão há itens na lista\n\n");
break;
case 4:
if(l.num_elementos > 0){
mostrarLista(&l);
}
else printf("\n\nNão há itens na lista\n\n");
break;
case 5: ordenarLista(&l);
break;
case 6: printf("Em qual posição deseja inserir: ");
scanf("%d",&pos);
if(l.num_elementos >= pos){
nitem = criarItem();
inserirNOP(&nitem, &l, pos);
}
else printf("\nPosição inválida!!\n\n");
break;
case 7: ok = FALSE;
break;
default : printf("\nValor não tratado\n\n");
}
}while (ok);
return 0;
}
void inserirNO(struct item *novo, lista *l){
PPNODE p;/*ponteiro para um no*/
p = (PPNODE) malloc(sizeof(struct node));/*alocação dinâmica de memória*/
(p->info) = *novo; /*copia do item para o novo nó*/
if(l->inicio == NULL){/*inserção no caso de ser a primeira vez*/
l->inicio = p;
l->fim = p;
p->proximo = NULL;
l->num_elementos = 1;
}
else{
l->fim->proximo = p;
p->proximo = NULL;
l->fim = p;
l->num_elementos++;
}
}
void inicializarLista(lista *l){/*insere os valores na lista*/
l->inicio= NULL;
l->fim = NULL;
l->num_elementos = 0;
}
struct item criarItem(){/*cria o nome item lendo um a um*/
struct item novo;
printf("\nDigite o nome: ");
scanf("%s",&novo.nome);
printf("\nDigite o telefone: ");
scanf("%s", &novo.telefone);
printf("\nDigite a idade: ");
scanf("%d",&novo.idade);
printf("\n");
return novo;
}
struct item *buscarItem(const char *string,lista *l){/*busca um item específico*/
int cont = 1;
PPNODE p = l->inicio;
while(strcmp(string, p->info.nome)!= 0 && p->proximo !=NULL){/*avança até encontrar ou chegar ao fim da lista*/
p = p->proximo;
cont++;
}
if(cont == l->num_elementos && strcmp(string, p->info.nome)!= 0){/*verifica se o último não é o elemento procurado*/
return NULL;
}else return &p->info;
}
PPNODE removerItem(const char *string, lista *l){/*remove um item específico*/
PPNODE q,p;
int cont = 1;
p = l->inicio;
while(strcmp(string, p->info.nome)!= 0 && p->proximo !=NULL){/*procura o item armazenando o anterior*/
q = p;
p = p->proximo;
cont++;
}
if(cont == 1 && strcmp(string, p->info.nome)== 0){/*verifica se o item procurado não é o primeiro*/
l->inicio = p->proximo;
l->num_elementos--;
return p;
}
else
if(cont == l->num_elementos && strcmp(string, p->info.nome)!= 0){
printf("\nItem não localizado!!!\n\n");
}
else{/*faz a troca no meio da lista ou no fim*/
q->proximo = p->proximo;
l->num_elementos--;
return p;
}
}
void mostrarLista(lista *l){/*imprimi todos os itens da lista*/
PPNODE p = l->inicio;
while(p->proximo != NULL){
printf("Nome: %s\nTelefone: %s\nIdade: %d\n\n", p->info.nome, p->info.telefone, p->info.idade);
p = p->proximo;
}
printf("Nome: %s\nTelefone: %s\nIdade: %d\n\n", p->info.nome, p->info.telefone, p->info.idade);
}
void ordenarLista(lista *l){/*Ordena a lista (Péssimo algoritmo)*/
lista tmp;
PPNODE p,q;
register int i = 0;
inicializarLista(&tmp);
for(; i=l->num_elementos;i++){
p = buscarMenor(l);
q = removerItem(p->info.nome, l);
inserirNO(&q->info, &tmp);
free(q);
}
*l = tmp;
}
PPNODE buscarMenor(lista *l){/*Encontra o menor item de uma lista*/
PPNODE p = l->inicio, q = p;
register int i = 0;
for(;i<l->num_elementos;i++){
if(strcmp(q->info.nome,p->info.nome) > 0){
q = p;
}
p = p->proximo;
}
return q;
}
void menu(){
printf("O que deseja fazer: \n\n");
printf("1) Inserir item\n");
printf("2) Buscar item\n");
printf("3) Remover item\n");
printf("4) Mostrar Toda a Lista\n");
printf("5) Ordenar Lista\n");
printf("6) Inserir numa posição\n");
printf("7) Sair\n\n");
}
void inserirNOP(struct item *novo, lista *l, int pos){
register int i = 1;
PPNODE p, q, s;/*ponteiro para um no*/
p = (PPNODE) malloc(sizeof(struct node));/*alocação dinâmica de memória*/
q = l->inicio;
s = q;
(p->info) = *novo; /*copia do item para o novo nó*/
for(; i < pos; i++){
s = q;
q = q->proximo;
}
if(i == 1){/*inserção no caso de ser a primeira vez*/
p->proximo = l->inicio;
l->inicio = p;
l->num_elementos++;
}
else{
p->proximo = q;
s->proximo = p;
l->num_elementos++;
}
}