Red de conocimiento informático - Material del sitio web - Cómo agregar, eliminar, cambiar e inspeccionar detalles internos usando lenguaje C

Cómo agregar, eliminar, cambiar e inspeccionar detalles internos usando lenguaje C

Escrito para un amigo hace mucho tiempo, muy parecido a lo que necesitas, así que ahí lo tienes.

Puedes modificar la función principal para adaptarla mejor a tus necesidades.

Si no sabes cómo cambiarlo, puedo ayudarte a cambiarlo.

------------------------------------------- --

#include

#include

#define NULL -2<

#define ERROR -1

#define OK 1

#define VERDADERO 2

#define FALSO 3

#define Boolen int

#define Estado int

#define defineLIST_INIT_SIZE 3

#define LIST_INCREMENT 2

#define NAME_LEN 13

#define DES_LEN 30

char ErrDescription[DES_LEN];

typedef struct{

int NO;

char Nombre[NAME_LEN];

p>

enum{masculino,femenino}Sexo;

int Edad;

char Tel[15];

char Inserttime[ 64];

}ElemType,*ElemPointer;

typedef struct{

ElemPointer base; //dirección base

int length; //longitud de la tabla

int listsize; //espacio de memoria

int elemcount; //recuento de registros

}SqList,*SqPointer;

int ErrorEXP (int i)

{

switch(i)

{ case 1.strcpy(ErrDescription, "InitList::(ElemType *) malloc(LIST_INIT_SIZE * sizeof(ElemType)) Error en la solicitud de espacio");break;

caso 2: strcpy( ErrDescription, "IncreaseList::(ElemType *)realloc(L->base,(L-> length + LIST_INCREMENT) * sizeof(ElemType)) solicitud de espacio fallida");break;

caso 3: strcpy(ErrDescription, "if(! L->base) devuelve Error; SqList no existe");break;

caso 4: strcpy(ErrDescription, "GetElem:: estoy fuera de límites");break )

caso 5: strcpy(ErrDescription, "ListInsert:: estoy fuera de límites");break;

caso 6: strcpy(ErrDescription, "ListInsert::CALL AumentaLista(L) == ERROR return Error adyacente

La solicitud de espacio falla y es devuelta por ListInsert ");break;

caso 7: strcpy(ErrDescription, "ListDelete:: i está fuera de límites");break;

caso 8: strcpy( ErrDescription , "KeyInList:: estoy fuera de límites");break;

caso 9: strcpy(ErrDescription, "KeyInList:: CALL ListInsert(L,i,temp)==ERROR return Error La solicitud de espacio adyacente falló, devuelta por KeyInList");break;

caso 10: strcpy(ErrDescription, "ScanfList:: CALL KeyInList(L,i++)==ERROR return Error");break;

}

puts("!!!!!!!!!!!!!!!! ERROR!!!!!!!!!!!!!!!!\ n");

puts(ErrDescription);

puts("\n!!!!!!!!!!!!!!!! ERROR !!!!!! !!!!!!!!! !! \n");

Devolver ERROR;

}

Estado InitList(SqPointer L)

{

L->base = 0; // ¡¡¡No, no, no lo hagas !!! Después de eliminarlo, el sistema lo considerará incluso si (ElemType *)malloc (LIST_INIT_SIZE * sizeof(ElemType)) falla Es normal

L->base = (ElemType *)malloc(LIST_INIT_SIZE * sizeof( ElemType));

if(!length * sizeof(ElemType);

L->elemcount = 0;

return OK;

}

Estado IncrementarList(SqPointer L)

{

ElemPointer nueva base;

nueva base = (ElemType *)realloc(L->base,(L->longitud + LIST_INCREMENT) * sizeof(ElemType ));

si(! nuevabase ) devuelve ErrorEXP(2);

L->base = nueva base;

L->longitud += LIST_INCREMENT;

L->listsize = L ->longitud * tamañode( ElemType);

Devolver OK;

}

Estado DestroyList(SqPointer L)

{

if(!L->base) return ErrorEXP(3); //L no existe, devuelve

free(L->base);

L - >longitud = NULL;

L-> tamaño de lista = NULL;

L->elemcount = NULL;

Devolver OK;

}

Estado ClearList(SqPointer L)

{

if(!L->base) return ErrorEXP(3); //L no existe, devuelve

L->elemcount = 0;

devuelve OK;

}

Boolen ListEmpty(SqPointer L)

{

if(!L->base) return ErrorEXP(3); //L no existe, regresa

if(L->elemcount == 0)

return VERDADERO;

else

devuelve FALSO;

}

int ListElemCount(SqPointer L)

{

if(!L->base) return ErrorEXP (3); //L no existe, devuelve

return L->elemcount;

}

Status GetElem(SqPointer L,int i,ElemType *ret) //Llamar a esta función requiere que ret apunte a la variable ElemType en el dominio de la función principal.

Variable ElemType

{

if(!L->base) return ErrorEXP(3); //L no existe, devuelve

if(i > L ->elemcount) return ErrorEXP(4); //i está fuera de los límites, return

*ret = L->base[i-1] //i comienza desde 1 y este método cambia. *ret in main Cambiará directamente los datos en la lista vinculada

return OK;

}

// El puntero temp->base L.base común

< obviamente se encuentra p>int LocateElem(SqPointer L,char Locatename[]) //devuelve i desde 1

{

int i=0;

ElemType *temp;

if(!L->base) return ErrorEXP(3 ); //L no existe, devuelve

while(ielemcount)

{

temp=&(L->base[i]); // Cambia a temp=L->base[i++]; ?

if(strcmp(temp->Name,Locatename) == 0) return i+1 // No se puede usar temp->Name==locatename para intentar comparar cadenas

i++;

}

devuelve 0;

}

Estado ListInsert(SqPointer L,int i,ElemType newelem) / /insertar posición 1<=i<= elemcount+1

{

ElemPointer newbase;

ElemType *temp,*flag;

if(! L->base) return ErrorEXP(3 ); //L no existe, regresa

if(i<1 ||| i>L->elemcount + 1) return ErrorEXP(5); /p>

if(L- >elemcount == L->longitud)

if(IncreaseList(L) == ERROR) return ErrorEXP(6);

flag=&(L->base[i -1]); // insertar posición

for(temp=&(L->base[L->elemcount-1]);temp>= flag;temp--)

*(temp+1)=*temp;

*flag=newelem;

L-& gt;elemcount++;

Regresar OK;

}

Status ListDelete(SqPointer L,int i,ElemType *ret) //Llame a esta función para señalar ret a una variable ElemType en el dominio de la función principal{

ElemType *temp;

if(! L->base) return ErrorEXP(3); //L no existe, devuelve <

/p>

if(i<1 ||| i>L->elemcount) return ErrorEXP(7);

*ret=L->base[i-1]; Posición, devuelva el valor aquí primero

for(temp=&(L->base[i]);temp<=&(L->base[L->elemcount-1]);temp + +)

*(temp-1)=*temp;

L->elemcount--;

Devolver OK;

}

Estado KeyInList(SqPointer L,int i)

{

ElemType temp;

time_t t;

char tmp[64];

char S;

if(!L->base) return ErrorEXP(3); //L no existe, devuelve

if(i<1 ||| i& gt;L->elemcount + 1) return ErrorEXP(8);

printf("Introduciendo el valor del elemento %dth:",i) ;

printf("\n número:(int)\n");

scanf("%d",&temp.NO);

printf (" \n Nombre:(char *)\n");

scanf("%s",&temp.Name);

printf("\n Género:(m o f )\n");

do{

S=getch();

if(S=='m')

temp.Sexo=masculino;

else if(S=='f')

temp.Sexo=femenino;

else

puts("Ingrese 'm' o 'f'. \n");

} while(S!Tel);

printf("\n Registro tiempo: \n");

t=tiempo(0);

strftime(tmp,sizeof( tmp),"%Y/%m/%d %X %A %j día de este año %z",localtime(&t));

puts(tmp);

strcpy(temp.Inserttime,tmp);

if (ListInsert(L,i,temp)= =OK)

Devuelve OK;

En caso contrario

Devuelve ErrorEXP(9);

}

ElemType ScanfElem()

{

ElemType temp;

tiempo_ t t;

char tmp [64];

char S;

printf("Entrada de elemento en curso: ");

printf("\n número:( int) \n");

scanf("%d",&temp.NO);

printf("\n Nombre:(char *)\n");

> scanf("%s",&temp.Name);

printf("\n Género:(m o f)\n");

hacer{

S=getch();

si (S== 'm')

temp.Sexo=masculino;

si no (S= ='f')

temp.Sex=female;

else

puts("Ingrese 'm' o 'f'. \n") ;

}mientras(S!='m' && S!='f');

putchar(S);

printf("\n Edad:(int)\n");

scanf("%d",&temp.Age);

printf("\n Tel:(char *)\n" );

scanf("%s",&temp.Tel);Estado ScanfList(SqPointer L,int i)

{

char p='c ';

while(putchar('\n'),p=='c'||p=='C')

{ p='\0';

if( KeyInList(L,i++)==ERROR) return ErrorEXP(10);

printf("/nPresione la tecla ESC para salir o 'C' para continuar..")

while(p!='c' && p!='C' && (int)p!=27)

p=getch();

}

Devolver OK;

}

Estado PrintListProperty(SqPointer L)

{

pone ("Atributo SqList L:");

if(!L->base)

{ puts("¡La tabla de cadenas no existe!");

return OK;}

else

puts("Tabla de cadenas inicializada...\n");

printf("%d/%d BASE =%d,MemoryStatus=%d\n",L->elemcount,L->length,L->base,L->listsize);

return OK;

}

Estado PrintOnScreen(SqPointer L)

{

int i;

char Stmp[7],t;

si(! L->base) return ErrorEXP(3); //L no existe, devuelve

puts("Empuje 'C' shell CLS u otra tecla para omitir.");

t=getch();

if(t=='c' || t=='C')

system("cls");

puts("Impresión de hoja de datos:");

for(i=0;i<=L->elemcount-1;i++)

{ p

rintf("\nElem %d st:\n",i+1);

if(L->base[i].Sexo == masculino)

strcpy( Stmp , "masculino");

else if(L->base[i].Sexo == femenino)

strcpy(Stmp, "female");

else

strcpy(Stmp, "Desconocido");

printf("NO:%d\tNombre:%s\tSexo:%s\tEdad:%d\n \tTel:%s\n\tInsertTime:%s\n",L->base[i].NO,L->base[i].Nombre,Stmp,L->base[i].L->base [i].Teléfono,L->base[i].Inserttime);

}

return OK;

}

Estado PrintElem(ElemPointer elem)

{

char Stmp[7];

printf("\nPrintElem:\n");

if(elem->Sexo == masculino)

strcpy(Stmp, "masculino");

else if(elem->Sexo == femenino)

strcpy(Stmp, "mujer");

else

strcpy(Stmp, "Desconocido");

printf("NO:%d \tNombre:%s\tSexo:%s\tEdad:%d\n\tTel :%s\n\tInsertTime:%s\n",elem->NO,elem->Nombre,Stmp,elem->Edad, elem->Tel,elem->Inserttime);

Return OK;

}

void main() //encadena todas las funciones anteriores juntas

{

SqList TheList;

SqPointer ListP;

ElemType mylistelem,*elemtemp;

ElemPointer mylist; p>

int i;

char nombreT[20];

elemtemp=&mylistelem;//*ret

ListP=&TheList;

if( InitList(ListP)==OK) puts("InitList(TheList)==OK");

PrintListProperty(ListP);

if( ListEmpty( ListP)==TRUE) puts("ListEmpty == True");

else puts("ListEmpty==False");

ScanfList(ListP,1);

p>

PrintListProperty(ListP);

PrintOnScreen(ListP) ;

printf("ListElemCount devuelve %d.",ListElemCount(L

istP));

puts("/nGetElem index?");

scanf("%d",&i);

if( GetElem(ListP ,i,elemtemp)==OK) PrintElem(elemtemp);

puts("/nLocateElem nombre?");

scanf("%s",nameT); p>

printf("LocateElem return %d.",LocateElem(ListP,nameT));

puts("/nListDelete index?");

scanf (" %d",&i);

if(ListDelete( ListP,i,elemtemp)==OK) PrintElem(elemtemp);

puts("/nListInsert index?" );

scanf("%d",&i);

puts("\nListInsert NEWELEM?");

ListInsert(ListP,i,scanfElem); () );

PrintListProperty(ListP);

PrintOnScreen(ListP);

if(ClearList( ListP)==OK) puts("ClearList= =OK ");

if(ListEmpty(ListP)==TRUE) pone("ListEmpty==True");

if(DestroyList(ListP)==OK) pone (" DestroyList==OK");

getch();

}

/* Lista de funciones

Nombre del tipo descripción del parámetro

p>

int ErrorEXP (int i) Descriptor de error

Estado InitList (SqPointer L) Inicializa SqPointer L.

..Devuelve la base a través de L

Status IncrementarList (SqPointer L) Cuando L esté actualmente lleno, continúa solicitando espacio

Status DestroyList (SqPointer L) Destruye L

Status ClearList (SqPointer L) Establece L como vacío

Boolen ListEmpty (SqPointer L) Determina si L está vacío. Si está vacío, devuelve TRUE

int ListElemCount (SqPointer L). ) Devuelve el número de elementos registrados actualmente en L

Status GetElem (SqPointer L,int i,ElemType *ret) Devuelve el elemento i hasta *ret

int LocateElem (SqPointer L,char Locatename[]) busca la tabla en orden y devuelve la i del primer elemento coincidente, o 0 si no hay ninguno

Status ListInsert (SqPointer L,int i,ElemType newelem) inserta un nuevo elemento en la i posición del elemento L

Status ListDelete (SqPointer L,int i. ElemType *ret) inserta un elemento newelem en la posición i de L

Status ListDelete (SqPointer L,int i. ElemType *ret) en Insertar un elemento newelem en la posición i de L, ElemType *ret) eliminar el elemento i en L y devolver el elemento con *ret

Status KeyInList (SqPointer L,int i) Introduzca un único elemento del teclado y se inserta en la posición i

ElemType ScanfElem() Ingresa un solo elemento del teclado y devuelve un nodo de tipo ElemType

Estado ScanfList (SqPointer L, int i) en incrementos a partir de i Ingrese elementos en L secuencialmente hasta "ESC"

Estado PrintListProperty(SqPointer L) Imprime las propiedades de L en el formato (espacio usado/espacio solicitado huella de memoria de dirección base)

Propiedad Status PrintListProperty(SqPointer L), el formato es (espacio utilizado/dirección base de memoria ocupada por el espacio solicitado)

Status PrintOnScreen (SqPointer L) imprime la tabla L completa en la pantalla

Status PrintElem (ElemPointer elem) imprime un solo elemento del tipo ElemType

Debido a la prisa, hice un pequeño lío Los dos capítulos lineales dinámicos al comienzo del. El libro casi ha terminado las operaciones básicas de la tabla de secuencia.

No sé si te refieres a esto. La función principal es un poco confusa. Simplemente une todas las operaciones básicas.

puede cambiar la función principal según la situación durante el proceso de llamada. Será más claro cómo lograrlo. Puede presionar F10

para realizar un seguimiento de una sola pieza, presionar F11 para ingresar al proceso de llamada y simplemente seguir el programa paso a paso.

He escrito un artículo sobre listas enlazadas dinámicas antes, pero parece que todos lo han leído, así que lo adjuntaré aquí. El archivo LinkList.c

solo implementa la función de crear una lista vinculada e imprimirla.

*/