今天,我在某本书上看到链表的完整操作过程,小弟可能刚入门,有个非常大的疑惑,我先贴源代码:
/*单链表的各种操作*/

# define null 0

typedef char ElemType; /* 字符型数据*/

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
};
        
setnull(struct LNode **p);
int length (struct LNode **p);
ElemType get(struct LNode **p,int i);
void insert(struct LNode **p,ElemType x,int i);
int delete(struct LNode **p,int i);
void display(struct LNode **p);

main()
{
    struct LNode *head,*q;  /*定义静态变量*/
    int select,x1,x2,x3,x4;
    int i,n; 
    int m,g;
    char e,y; 
    
     head=setnull(&head);  /*建议链表并设置为空表*/
     printf("请输入数据长度: ");
     scanf("%d",&n);
     for(i=1;i<n;i++);
     {
         printf("将数据插入到单链表中: ");
         scanf("%d",&y);
         insert(&head,y,i);}  /*插入数据到链表*/
         display(&head);     /*显示链表所有数据*/
         
         printf("select 1 求长度 length()\n");
         printf("select 2 取结点 get()\n");
         printf("select 3 求值查找 locate()\n");
         printf("select 4 删除结点 delete()\n");
         printf("input your select: ");
         scanf("%d",&select);    
        switch(select)
        {
            case 1:
            {
                x1=length(&head);
                printf("输出单链表的长度%d ",x1);
                 display(&head);
             }break;
             
             case 2:
             {
                 printf("请输入要取得结点: ");
                     scanf("%d",&m);
                     x2=get(&head,m);
                     printf(x2);
                 display(&head);
             }break;
         
             case 3:
             {
                 printf("请输入要查找的数据: ");
                     scanf("%d",&e);
                     x3=locate(&head,e);
                     printf(x3);
                 display(&head);
             }break;
             
             case 4:
             {
                 printf("请输入要删除的结点: ");
                     scanf("%d",&g);
                     x4=delete(&head,g);
                     printf(x4);
                 display(&head);
             }break;
        }
    }
}


setnull(struct LNode **p)
{
    *p=null;
}

int length (struct LNode **p)
{
    int n=0;
     struct LNode *q=*p;
     while (q!=null)
     {
         n++;
          q=q->next;
     }
     return(n);
}

ElemType get(struct LNode **p,int i)
{
    int j=1;
    struct LNode *q=*p;
    while (j<i&&q!=null)
     {
         q=q->next;
          j++;
     }
     if(q!=null)
           return(q->data);
     else
         printf("位置参数不正确!\n");
}

int locate(struct LNode **p,ElemType x)
{
    int n=0;
     struct LNode *q=*p;
    while (q!=null&&q->data!=x)
     {
         q=q->next;
          n++;
     }
     if(q==null)
         return(-1);
     else
         return(n+1);
}

void insert(struct LNode **p,ElemType x,int i)
{
    int j=1;
     struct LNode *s,*q;
      s=(struct LNode *)malloc(sizeof(struct LNode));
      s->data=x;
      q=*p;
      if(i==1)
      {
          s->next=q;
           p=s;
      }
      else
      {
          while(j<i-1&&q->next!=null)
           {
               q=q->next;
                j++;
           }
           if(j==i-1)
            {
                s->next=q->next;
                 q->next=s;
            }
           else 
               printf("位置参数不正确!\n");
      }    
}

int delete(struct LNode **p,int i)
{
    int j=1;
     struct LNode *q=*p,*t;
     if(i==1)
      {
          t=q;
          *p=q->next;
      }
     else
      {
          while(j<i-1&&q->next!=null)
           {
               q=q->next;
                j++;
           }
            if(q->next!=null&&j==i-1)
             {
                 t=q->next;
                  q->next=t->next;
             }
            else 
                printf("位置参数不正确!\n");
      }
       if(t=null)    
           free(t);
}

void display(struct LNode **p)
{    
    struct LNode *q;
     q=*p;
     printf("单链表显示: ");
     if(q==null)
          printf("链表为空!");
     else if (q->next==null)
               printf("%c\n",q->data);
          else
          {
              while(q->next!=null)
            {
                printf("%c->",q->data);
                 q=q->next;
            }
           printf("%c",q->data);
    }
     printf("\n");
}

在这段代码中,每个函数中的参数都有struct LNode **p,比哪void display(struct LNode **p)这个函数,如果我将它改为void display(struct LNode *p),然后用q=p;进行赋值,结果还不是一样的吧,为什么要传指针的指针,我一直想不通-郁闷中,有没有谁帮我解答这个问题?