两个单链表,删除数据相同的元素,使得两个单链表每个元素都不相同(C语言版)
typedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;voiddel_same(LinkList*L,...
typedef struct LNode{
int data;
struct LNode* next;
}LNode,*LinkList;
void del_same(LinkList *L,LinkList *La)
{
LNode *p,*q,*pa,*qa;
p=*L;q=(*L)->next;
while(q)
{
pa=*La;qa=(*L)->next;
while(qa)
{
if(q->data==qa->data)
{
pa->next=qa->next;
free(qa);
qa=pa->next;
p->next=q->next;
free(q);
q=p;
}else{
pa=pa->next;
qa=qa->next;
}
}
if(p==q){
q=p->next;
}else{
q=q->next;
p=p->next;
}
}
}
这个函数在运行时老是出错,编译,链接时没有错误 展开
int data;
struct LNode* next;
}LNode,*LinkList;
void del_same(LinkList *L,LinkList *La)
{
LNode *p,*q,*pa,*qa;
p=*L;q=(*L)->next;
while(q)
{
pa=*La;qa=(*L)->next;
while(qa)
{
if(q->data==qa->data)
{
pa->next=qa->next;
free(qa);
qa=pa->next;
p->next=q->next;
free(q);
q=p;
}else{
pa=pa->next;
qa=qa->next;
}
}
if(p==q){
q=p->next;
}else{
q=q->next;
p=p->next;
}
}
}
这个函数在运行时老是出错,编译,链接时没有错误 展开
3个回答
展开全部
我目测你的想法是这样:
我写的是伪代码!
首先遍历链表每一个元素
然后遍历链表这个元素后面的元素看是否有相同的
有相同的就用p->next=q->next....删除之..
可是你想过没有破坏性太大了...你到底删除了多少元素啊!.....
举个例子 假如 1 2 3 4 1 5 你这样删除就是将2 3 4全干掉了...链表挂了.
我写的是伪代码!
首先遍历链表每一个元素
然后遍历链表这个元素后面的元素看是否有相同的
有相同的就用p->next=q->next....删除之..
可是你想过没有破坏性太大了...你到底删除了多少元素啊!.....
举个例子 假如 1 2 3 4 1 5 你这样删除就是将2 3 4全干掉了...链表挂了.
更多追问追答
追问
不是伪代码,是C语言,1234 15这个例子中,我的只是删除了1这个数字而已啊
追答
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node*next;
}NODE,*LinkList;
LinkList Create()
{
LinkList head ,p,temp;
int num=0;
head=(LinkList)malloc(sizeof(NODE));
head->next=NULL;
temp=head;
scanf("%d",&num);
while(num!=-1)
{
p=(LinkList)malloc(sizeof(NODE));
temp->next=p;
p->data=num;
temp=p;
scanf("%d",&num);
}
p->next=NULL;
return head;
}
void ShowList(LinkList head)
{
LinkList p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void DelSame(LinkList head)
{
LinkList p=head->next;
LinkList q,q_prenode;
while(p)
{
q_prenode=p;
q=p->next;
while(q!=NULL)
{
if(p->data==q->data)
{
q_prenode->next=q->next;
free(q);
}
else
{
q_prenode=q;
}
q=q_prenode->next;
}
p=p->next;
}
}
void DestroyList(LinkList head)
{
LinkList p=head->next,q;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
int main()
{
LinkList p;
p=Create();
if(p)
ShowList(p);
DelSame(p);
ShowList(p);
DestroyList(p);
return 0;
}
刚刚自己手写了一份..我刚刚说你写的代码是有逻辑漏洞的...你只删除了元素却没有想到这样删除会破坏链表的整个结构。。所以你的代码逻辑错误了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询