#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...)) 在这里删元素确实也把主函数里的链表给修改了啊,这是为啥啊
第一次发帖,审核了将近12个小时,这个问题在别的论坛上有dalao帮我解答了
问题出在ListDelete函数里的p=q->next上,这个是形参地址的赋值,根本修改不了locateElem函数中的p指向,可以通过形参指针修改其指向的地址的值,而不能直接修改形参指针的值。
如果有dalao能帮忙分析下二级指针如何解决这个问题的就更好了!