链表算法问题恶心
第一,破坏原链表是什么意思?理论上,这并没有改变原来链表的特性,只是少了一些节点。
第二,删除重复节点L时,其前任节点的下一个并不指向被删除节点的下一个,这样你就会打破链表。不能形成链表。所以这样做是不对的。
第三,。void del same node(linklist * &;l)为什么要在l前面加&呢?,这个问题“&”没必要补充了。
下面是调试好的代码:
# include & ltwindows.h & gt
# include & ltstring.h & gt
# include & ltmalloc.h & gt
# include & ltstdio.h & gt
结构链表
{
int x;
结构链表* next
};
int flag = 0;//定义一个标志,并将其声明为全局变量。至于是否存在相同的号码
结构链表*q,* h;//q作为移动指针,h作为返回的头指针。
int in(int x,struct linklist *l)
{
结构链表*p,* t;
p = l;
而(p!= NULL & amp& ampp->;x!=x)
{
p = p-& gt;接下来;
}
if (p==NULL)
{
返回0;
}
其他
{
返回1;
}
}
结构链表*del(结构链表*l)
{
结构链表* p;
if(l = = NULL | | l-& gt;next==NULL)
{
返回h;
}
如果(在(l-& gt;x,l-& gt;下一个))
{
p = l;
If (flag) //如果前面有一个数,后面没有相同数的数,
那么要删除的这个号码的前一个号码的指针指向它的后一个号码。
{
q->;next = p-& gt;接下来;
l = l-& gt;接下来;
}
Else //如果这样的数字不存在,将L下移。
{
l = l-& gt;接下来;
}
免费(p);
del(l);
}
其他
{
++标志;
If (flag==1) //一旦一个数后面不存在,H就指向这个数。
//和h作为头指针,只有一次。
{
h = l;
}
q = l;//q仍然指向L进行下一次指针移动。
del(l-& gt;下一个);
}
}
int main()
{
结构链表*l,*p,* t;
int I;
t = p = l =(struct linklist *)malloc(sizeof(struct linklist));
for(I = 0;我& lt6;i++)
{
如果(i==0)
{
scanf("%d ",& amp(t->;x));
}
其他
{
t =(struct linklist *)malloc(sizeof(struct linklist));
scanf("%d ",& amp(t->;x));
p->;next = t;
p = t;
}
}
p->;next = NULL
l = del(l);
而(l!=空)
{
printf("%d ",l-& gt;x);
l = l-& gt;接下来;
}
系统(“暂停”);
}
我进行了三种可能的输入测试,没有问题:
第一种:1 2 3 4 5 6,输出还是1 2 3 4 5 6。
第二种:3 0 3 1 0 3,输出为1 0 3。
第三种:1 2 3 4 6 4,输出为1 2 3 6 4。
如果你有任何其他问题,打电话给我!