Cómo agregar, eliminar, cambiar e inspeccionar detalles internos usando lenguaje C
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]; 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) { p> 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
{
int i=0;
ElemType *temp;
if(!L->base) return ErrorEXP(3 ); //L no existe, devuelve
while(i
{
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 p>
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> 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> 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) p>
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.
*/