线性顺序表————回调————结构体指针的理解————Debug

#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>

#define INIT_LIST_SIZE 100
#define OVERFLOW 1
typedef int elemtype;
typedef struct sqlist{
    elemtype *elem;
    int length;
    int list_size;
}seqlist,*pseqlist;

void Inital_list(pseqlist l)
{
    l->elem=(elemtype *)malloc(INIT_LIST_SIZE*sizeof(elemtype));
    if(!l->elem)exit(OVERFLOW);
    l->length=0;
    l->list_size=INIT_LIST_SIZE;
}
void Creat_list(pseqlist l,pseqlist p)
{
     scanf("%d",&l->length);
     scanf("%d",&p->length);
     for(int i=0;i<l->length;i++)
     {
         scanf("%d",&l->elem[i]);
     }
     for(int j=0;j<p->length;j++)
     {
         scanf("%d",&p->elem[j]);
     }
}
void prit_list(pseqlist l)
{
    for(int i=0;i<l->length;i++)
    {
       printf("%d ",l->elem[i]);
    }
}
void Delete_list(pseqlist la,pseqlist lb,void(*D)(pseqlist l,int i))
{

    for(int i=0;i<la->length;i++)
    {
        for(int j=0;j<lb->length;j++)
        {
            if(la->elem[i]==lb->elem[j])
            {
             (*D)(la,i);
            }
        }
    }
}
void Delete_member(pseqlist l,int i)
{
    for (;i<=l->length;i++)
    {
        l->elem[i-1]=l->elem[i];
    }
    l->length--;
}
int Empty(pseqlist l)
{
    if(l->length==0)
    {
        return NULL;
    }
    return 0;
}
int main()
{
    seqlist a;
    seqlist b;
    Inital_list(&a);
    Inital_list(&b);
    Creat_list(&a,&b);
    Delete_list(&a,&b,Delete_member);
    prit_list(&a);
    return 0;
}

注意这段代码中的void Delete_list(pseqlist la,pseqlist lb,void(*D)(pseqlist l,int i))与void Delete_member(pseqlist l,int i)

因为刚开始的时候有定义自定义结构体类型

typedef struct sqlist{
    elemtype *elem;
    int length;
    int list_size;
}seqlist,*pseqlist;

la是pseqlist类型,所以la就是一个地址;

所以回调void Delete_member(pseqlist l,int i)(即(*D)(la,i);)的时候

绝对不能用(*D)(&la,i);

这样的话就只是形参是一个指针类型的地值的数值,而不是整个结构体的指针;

猜你喜欢

转载自blog.csdn.net/qq_40634072/article/details/81234999