链表问题(C语言描述)

lj860603 2006-06-25 04:41:58
请教大家个问题。有单链表A、B、C,要在A中删除那些既在B又在C中出现的元素。我写的下面的代码运行时候出错,不知道原因。希望大家抽出点时间帮我看看。十分感谢!
-------------------------------
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int data;
struct node *next;

}Node, *LinkList;

/*---------------------创建链表------------------------*/
struct node *CreatList(void)
{
int n = 1;
LinkList head = NULL;
LinkList L1 = NULL;
LinkList L2 = NULL;

L1 = L2 =(LinkList)malloc(sizeof(Node));
if (NULL == L1)
{
printf("Faile to get values.\n");
exit (1);
}

printf("Please input the List Data:\n");
scanf("%d", &L1->data);

while (L1->data != -1)//当输入的数据是-1时表示结束
{
if (n == 1)
{
head = L1;
}
else
{
L2->next = L1;
}
L2 = L1;

L1 = (LinkList)malloc(sizeof(Node));
scanf("%d", &L1->data);

n++;
}
L2->next = NULL;

return (head);
}
/*--------------------删除链表A中的数据------------------------*/
void SqList_Intersect_Delete(LinkList A, LinkList B, LinkList C)
{
LinkList pa = A;
LinkList pb = B;
LinkList pc = C;
LinkList s;
LinkList t;
int u;

while (pa && pb && pc)
{
if (pb->data < pc->data)
{
pb = pb->next;
}
else if (pb->data > pc->data)
{
pc = pc->next;
}
else
{
u = pb->data; //保存要删除的数据
while (pa->next->data < u)
{
pa = pa->next;
}
if (pa->data == u)//假如A中存在和u的值一样的数据则进行删除
{
s = pa->next;
while (s->data == u)
{
t = s;
s = s->next;
free(t);
}
pa->next = s;
}
while (pb->data == u)//如果链表B后一个结点的数据还等于u则移动指针
{
pb = pb->next;
}
while (pc->data == u)
{
pc = pc->next;
}
}
}
}
/*---------------------打印链表数据--------------------------*/
void PrintListData(LinkList L)
{
while (L)
{
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
/*-----------------------------------------------------------*/
int main(void)
{
LinkList A, B, C;

printf("The A_List :\n");
A = CreatList();
printf("The List A data are:\n");
PrintListData(A);

printf("The B_List :\n");
B = CreatList();
printf("The List B data are:\n");
PrintListData(B);

printf("The C_List :\n");
C = CreatList();
printf("The List C data are:\n");
PrintListData(C);

SqList_Intersect_Delete(A, B, C);

printf("Now, the A_List is:\n");
PrintListData(A);

system("Pause");
return 0;
}
...全文
389 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysc918 2006-10-29
  • 打赏
  • 举报
回复
把你的部分代码局部改了一下,如下(有点乱):
----------------------------
u = pb->data; //保存要删除的数据
//while (pa->next->data < u)
while (pa->next!=NULL && pa->next->data !=u)
{
pa = pa->next;
}
if (pa->next!=NULL && pa->next->data == u)//假如A中存在和u的值一样的数据则进行删除
{
s = pa->next;
pa->next=pa->next->next;
free(s);
s=NULL;
/*
while (s->data == u)
{
t = s;
s = s->next;
free(t);
}
pa->next = s;
*/
}
while (pb!=NULL && pb->data == u)//如果链表B后一个结点的数据还等于u则移动指针
{
pb = pb->next;
}
while (pc!=NULL && pc->data == u)
{
pc = pc->next;
}

--------------------------
另外,你的程序好像要求链表有序
shelliu 2006-10-27
  • 打赏
  • 举报
回复
太长了,没时间看了,个人觉得这个NULL == L1看着不是太舒服,呵呵,虽然也不错,不过我还是比较喜欢L1==NULL;,呵呵
fengzar1984 2006-10-27
  • 打赏
  • 举报
回复
功力不够,想了我1个小时,越想觉得这个void SqList_Intersect_Delete(LinkList A, LinkList B, LinkList C)就越错.
整个都不顺.
fengzar1984 2006-10-27
  • 打赏
  • 举报
回复

if (pa->data == u)//假如A中存在和u的值一样的数据则进行删除
{
s = pa->next;
while (s->data == u)
{
t = s;
s = s->next;
free(t);
}
pa->next = s;
}

刚学习的人
如果A的第一个节点等于u时,不该如上面的处理.

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧