结构体指针当作函数形参的问题?

新手上路,请多包涵
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode{
    int data;
    struct Lnode *next;
}Lnode,*LinkList;

LinkList InitList(int n);//建链表
void ListDelete(LinkList q,LinkList p);//删除元素
void LocateElem(LinkList head, int k, LinkList p);//遍历链表
void ShowLnode(LinkList head);//展示链表

int main()
{
    int n,m;
    LinkList head, p;
    scanf("%d", &m);
    while(m--){
        scanf("%d", &n);
        head=InitList(n);
        p=head->next;
        while(p!=NULL){
            LocateElem(head,p->data,p);
            p=p->next;
        }
        ShowLnode(head);
    }
    return 0;
}
LinkList InitList(int n){
    LinkList head, p, tail;
    int m;
    head=(LinkList)malloc(sizeof(Lnode));
    head->next=NULL;
    tail=head;
    while(n--){
        p=(LinkList)malloc(sizeof(Lnode));
        scanf("%d", &m);
        p->next=tail->next;
        tail->next=p;
        tail=p;
        p->data=m;
    }
    return head;
}


void LocateElem(LinkList head, int k,LinkList p){
        LinkList  q,m;
        m=p;
        q=p;
        p=p->next;
        while(p!=NULL){
            if(p->data==k){
            //问题出在这里,这里这样写是没问题的,
            //但是如果写成ListDelete(q,p)程序就运行不了
                q->next=p->next;
                free(p);
                p=q->next;
            }
            else{
                q=p;
                p=p->next;
            }
        }
        p=m;
    }

void ShowLnode(LinkList head){
    LinkList p;
    p=head->next;
    while(p!=NULL){
        if(p->next==NULL){
            printf("%d\n", p->data);
        }
        else{
            printf("%d ",p->data);
        }
        p=p->next;
    }
}

void ListDelete(LinkList q,LinkList p){
    q->next=p->next;
    free(p);
    p=q->next;
}

这我传的确实是地址,但貌似不能在原来的链表进行修改?
我在网上查的是把ListDelte改成这样:

void ListDelete(LinkList *q,LinkList *p){
    (*q)->next=(*p)->next;
    free(*p);
    (*p)=(*q)->next;
}

然后直接ListDelete(&p,&q)就可以了。
但是我头指针也是直接传的啊(LocateElem(Linklist head...)) 在这里删元素确实也把主函数里的链表给修改了啊,这是为啥啊

阅读 2.2k
1 个回答
✓ 已被采纳新手上路,请多包涵

第一次发帖,审核了将近12个小时,这个问题在别的论坛上有dalao帮我解答了
问题出在ListDelete函数里的p=q->next上,这个是形参地址的赋值,根本修改不了locateElem函数中的p指向,可以通过形参指针修改其指向的地址的值,而不能直接修改形参指针的值。
如果有dalao能帮忙分析下二级指针如何解决这个问题的就更好了!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题