C/Visual C - Ayuda con estructuras dinámicas de datos en C

 
Vista:

Ayuda con estructuras dinámicas de datos en C

Publicado por Mathías Rodríguez (1 intervención) el 14/10/2005 23:49:51
Hola, quisiera saber si me podrían ayudar. Estoy haciendo un pseudo-shell y tengo problemas al intentar crear subdirectorios, pongo el código para que vean mi problema y si les sirve, mejor.
Lo estoy implementando con una lista simplemente enlazada.
Desde ya muchas gracias.
Mathías.

#include <conio.h>
#include <stdio.h>
#include "main.h"

struct FILESYSTEM {
char nombre[9];
STORAGE subdir;
STORAGE siguiente;
};

struct FILES {
char nombre_file[13];
char text[256];
ARCHIVER next;
};

char directorio_actual[9]={'\0'};

/* ==== Funciones del shell ==== */

/* ---- Creación de directorios ---- */

STORAGE make_dir(STORAGE list)
{
char nombre[9];
STORAGE nuevo,actual,anterior;

nuevo = (STORAGE) malloc (sizeof(struct FILESYSTEM));

if (nuevo==NULL)
printf( "No hay memoria disponible!\n");
else {
scanf("%8s",nombre);
fflush(stdin);
strcpy(nuevo->nombre,nombre);
nuevo->siguiente=list;
return nuevo;
}
}

/* ---- Función que muestra toda la lista ---- */

void printList(STORAGE l)
{

if(!isempty(l)) {
printf("%s\n",head(l));
printList(l->siguiente);
}
}

/* -----------------------------------------------------------------------
Función que muestra toda la ayuda, aprovechando INTELIGENTEMENTE
la capacidad del búfer de entrada de desbordarse para guardar el resto
en la siguuiente variable a tomar
----------------------------------------------------------------------- */


/* ==== Funciones de manejo de la lista ==== */

/* ----------------------------------------------
Función que verifica si la lista está vacía
---------------------------------------------- */
int isempty(STORAGE l)
{
return (l==NULL);
}

/* ----------------------------------------------
Función que vacía un puntero a estructura
FILESYSTEM, devolviendo NULL
---------------------------------------------- */

STORAGE emptier()
{
return NULL;
}

/* ==== Funciones de comparación y transformación de comandos ==== */

/* ----------------------------------------------
Función que compara los datos recibidos con
una lista de comandos posibles. Cabe destacar
que los datos recibidos son pasados a mayúsculas
con el fina de comparalos con los comandos de
la lista, los cuales están en mayúsculas.
---------------------------------------------- */

int command_comparison(char *command_to_compare)
{
if(strcmp(command_to_compare,commands[0])==0)
return 1;
else if(strcmp(command_to_compare,commands[1])==0)
return 2;
else if(strcmp(command_to_compare,commands[2])==0) {
return 3;
fflush(stdin);
}
else if(strcmp(command_to_compare,commands[3])==0)
return 4;
else if(strcmp(command_to_compare,commands[4])==0)
return 5;
else if(strcmp(command_to_compare,commands[5])==0)
return 6;
else if(strcmp(command_to_compare,commands[6])==0)
return 7;
else if(strcmp(command_to_compare,commands[7])==0) {
clearscr();
fflush(stdin);
}
else if(strcmp(command_to_compare,commands[8])==0)
return 9;
else if(strcmp(command_to_compare,commands[9])==0) {
fflush(stdin);
return 10;
}
else if(strcmp(command_to_compare,commands[10])==0) {
ver();
fflush(stdin);
}
else {
fflush(stdin);
printf("%s: %s\n",command_to_compare,errorcodes[0]);
}
}

/* -------------------------------------------
Función que convierte un datos tomado a ma-
yúsculas.
------------------------------------------- */

void uppercase_real_making(char *what_to_really_modify)
{
unsigned int i=0;
int max;

max = strlen(what_to_really_modify);

for(i=0;i<=max;i++) {
what_to_really_modify[i]=toupper(what_to_really_modify[i]);
}

}

/* ==== Implementación de la función principal ==== */

int main(void)
{
char com[10];
int function_return=0;
STORAGE list = emptier();
ARCHIVER listFile = NULL;

strcpy(directorio_actual,"/");
clearscr();

do {
printf("[dargor@mad:%s]# ",directorio_actual);
scanf("%s",com);
uppercase_real_making(com);
function_return=command_comparison(com);

switch(function_return) {
case 1:
list=make_dir(list);
break;
case 2:
list->subdir=change_dir(list);
break;
case 3:
printList(list);
break;
case 4:
if(isempty(list)) {
printf("%s\n",errorcodes[9]);
fflush(stdin);
}
else {
list=remove_dir(list);
}
break;
case 5:
help();
break;
case 10:
exit(0);
break;
}
}while(strcmp(com,commands[9])!=0);

}

STORAGE change_dir(STORAGE list)
{
STORAGE to_change,actual,anterior;
char nombre[9];

to_change = emptier();
scanf("%8s",nombre);

if(strcmp(nombre,"/")==0) {
strcpy(directorio_actual,nombre);
return list;
}
/* else if(strcmp(nombre,list->nombre)==0) {
strcpy(directorio_actual,nombre);
list->subdir=to_change;
return list;
}*/
else {
printf("%s\n",errorcodes[3]);
return list;
}

/* else {
anterior=list;
actual=list->siguiente;

while((actual!=NULL)&&(strcmp(actual->nombre,nombre)!=0)) {
anterior=actual;
actual=actual->siguiente;
}

if(actual!=NULL) {
strcpy(directorio_actual,nombre);
return to_change;
}
}*/
}

STORAGE append(STORAGE list1,STORAGE list2)
{
STORAGE temp1,temp2;

temp1=list1;
temp2=list2;

}

char *head(STORAGE list)
{
return list->nombre;
}

STORAGE tail(STORAGE list)
{
return list->siguiente;
}

STORAGE remove_dir(STORAGE list)
{
char nombre[10];
STORAGE actual,anterior,rem;
char op;

scanf("%8s",nombre);
fflush(stdin);

if(strcmp(nombre,"*")==0) {
printf("Se eliminara todo el contenido\n");
printf("¨Desea continuar[S/N]?: ");
op=toupper(getch());

if(op=='S') {
printf("\n");
return NULL;
}
else if(op=='N') {
printf("\n");
return list;
}
}

if(strcmp(nombre,"/")==0) {
printf("%s\n",errorcodes[8]);
return list;
}

if(isempty(list)) {
return NULL;
}

if(strcmp(nombre,list->nombre)==0) {
rem=list;
list=list->siguiente;
free(rem);
printf("Exito\n");
return list;
}
else {
anterior=list;
actual=list->siguiente;

while((actual!=NULL)&&(strcmp(actual->nombre,nombre)!=0)) {
anterior=actual;
actual=actual->siguiente;
}

if(actual!=NULL) {
rem=actual;
anterior->siguiente=actual->siguiente;
free(rem);
printf("Exito\n");
return list;
}
if(actual==NULL) {
printf("%s\n",errorcodes[3]);
return list;
}

}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder