账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    结构体指针当作函数形参的问题?
    32
    0
    #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...)) 在这里删元素确实也把主函数里的链表给修改了啊,这是为啥啊

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 在C++中,我们通常会将结构体指针作为函数形参。这主要是因为结构体指针是一种特殊类型的指针,它可以指向结构体变量的地址,而不是指针变量本身。

      当你创建一个结构体指针时,你需要为它分配内存空间,这个内存空间的大小等于结构体的大小。然后,你可以使用这个结构体指针来指向结构体变量的地址。

      例如:

      ```cpp struct Animal { std::string name; int age; };

      int main() { Animal animal("Tom", 10); Animal* ptr = &animal; std::cout << "Animal's name: " << ptr->name << std::endl; std::cout << "Animal's age: " << ptr->age << std::endl; return 0; } ```

      在这个例子中,我们创建了一个名为Animal的结构体,并为其分配了一个名为animal的变量的内存空间。然后,我们使用结构体指针ptr来指向这个变量的地址,我们可以使用ptr来访问Animal结构体的变量。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部