主题:我这个删除链表A和B与C中的相同元素.为什么最后一个总有点问题呢?其他的都可以^^
[color=FF0000]我这个删除链表A和B与C中的相同元素.为什么最后一个总有点问题呢?其他的都可以^^[/color]
我的几个研究生老师,找了半天也没有找出点什么来,我也不知道为什么>明明算法是对的,貌似也没有错误**
这是头文件
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LEN sizeof(LNode)
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
//1.构造新的单链表L
LinkList CreateList(LinkList L,int n)
{
int i;
LinkList p,q,head;
L=(LinkList) malloc(LEN);
head=L;
q=L;
for(i=1;i<=n;i++)
{
p=(LinkList) malloc(LEN);
q->next=p;
q=p;
printf("\n请输入单链表的第%d数据:\n",i);
scanf("%d",&p->data);
printf("\n你刚才输入的数据为%d\n",p->data );
}
p->next = NULL;
return L;
}
//5.求单链表的长度
int ListLength(LinkList L)
{
int count=0;
LinkList p=L;
while(p->next)
{
count++;
p=p->next;
}
return count;
}
//2.打印单链表A
LinkList PrintList(LinkList L)
{
int i;
LinkList pt;
pt=L->next;
for(i=1;i<=ListLength(L);i++)
{
printf("%d ",pt->data);
pt=pt->next;
}
return L;
}
//3.在单链表中的第i位上插入一个项
LinkList InsertList(LinkList L, int i,int e)
{
LinkList p,s_insert;
s_insert=(LinkList)malloc(LEN);
int j=0;
p=L;
s_insert->data=e;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i-1)
{
return ERROR;
}
s_insert->next=p->next;
p->next=s_insert;
return L;
}
//4.在单链表的第i位上删除一个项,并释放它所占用的空间
LinkList DeleteList(LinkList L, int i)
{
int j=0;
int e;
LinkList p,cur_pt;
p=L;
while(p && j<i-1) //找到要删除元素的“前驱”
{
p=p->next;
j++;
}
if(!p || j>i-1)
{
return ERROR;
}
cur_pt=p->next; //找到要删除的元素
e=cur_pt->data;
printf("你刚删除的数值是:%d\n",e);
cur_pt->next=p->next;
free(cur_pt);
return L;
}
下面的就是使用的算法了,
#include <stdio.h>
#include "交集.h"
void main()
{
LinkList A= NULL;
LinkList B= NULL;
LinkList C= NULL;
int an,bn,cn;
LinkList pa;
LinkList pb;
LinkList pc;
LinkList cur_pt;
printf("请问A是几元链表:\n");
scanf("%d",&an);
printf("请问B是几元链表:\n");
scanf("%d",&bn);
printf("请问C是几元链表:\n");
scanf("%d",&cn);
printf("请输入A链表的元素:\n");
A=CreateList(A,an);
printf("\n请输入B链表的元素:\n");
B=CreateList(B,bn);
printf("/n请输入C链表的元素:\n");
C=CreateList(C,cn);
printf("\n**********************链表的输出*******************************\n");
printf("链表A为:\n");
PrintList(A);
printf("\n链表B为:\n");
PrintList(B);
printf("\n链表C为:\n");
PrintList(C);
printf("\n**********************链表的输出*******************************\n");
for(pa=A;pa->next!=NULL;)
{
for(pb=B->next;pb!=NULL;pb=pb->next)
{
for(pc=C->next;pc!=NULL;pc=pc->next)
{
if(pa->next->data==pb->data && pa->next->data==pc->data)
{
cur_pt=pa->next;
pa->next=pa->next->next;
free(cur_pt);
if(pa->next!=NULL)//由于pa->next=pa->next->next;
pa=pa->next;
}
}
}
}
printf("完成操作后的链表为:\n");
for(pa=A->next;pa!=NULL;pa=pa->next)
{
printf("%d ",pa->data);
}
printf("\n");
}
我的几个研究生老师,找了半天也没有找出点什么来,我也不知道为什么>明明算法是对的,貌似也没有错误**
这是头文件
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define NULL 0
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LEN sizeof(LNode)
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
//1.构造新的单链表L
LinkList CreateList(LinkList L,int n)
{
int i;
LinkList p,q,head;
L=(LinkList) malloc(LEN);
head=L;
q=L;
for(i=1;i<=n;i++)
{
p=(LinkList) malloc(LEN);
q->next=p;
q=p;
printf("\n请输入单链表的第%d数据:\n",i);
scanf("%d",&p->data);
printf("\n你刚才输入的数据为%d\n",p->data );
}
p->next = NULL;
return L;
}
//5.求单链表的长度
int ListLength(LinkList L)
{
int count=0;
LinkList p=L;
while(p->next)
{
count++;
p=p->next;
}
return count;
}
//2.打印单链表A
LinkList PrintList(LinkList L)
{
int i;
LinkList pt;
pt=L->next;
for(i=1;i<=ListLength(L);i++)
{
printf("%d ",pt->data);
pt=pt->next;
}
return L;
}
//3.在单链表中的第i位上插入一个项
LinkList InsertList(LinkList L, int i,int e)
{
LinkList p,s_insert;
s_insert=(LinkList)malloc(LEN);
int j=0;
p=L;
s_insert->data=e;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i-1)
{
return ERROR;
}
s_insert->next=p->next;
p->next=s_insert;
return L;
}
//4.在单链表的第i位上删除一个项,并释放它所占用的空间
LinkList DeleteList(LinkList L, int i)
{
int j=0;
int e;
LinkList p,cur_pt;
p=L;
while(p && j<i-1) //找到要删除元素的“前驱”
{
p=p->next;
j++;
}
if(!p || j>i-1)
{
return ERROR;
}
cur_pt=p->next; //找到要删除的元素
e=cur_pt->data;
printf("你刚删除的数值是:%d\n",e);
cur_pt->next=p->next;
free(cur_pt);
return L;
}
下面的就是使用的算法了,
#include <stdio.h>
#include "交集.h"
void main()
{
LinkList A= NULL;
LinkList B= NULL;
LinkList C= NULL;
int an,bn,cn;
LinkList pa;
LinkList pb;
LinkList pc;
LinkList cur_pt;
printf("请问A是几元链表:\n");
scanf("%d",&an);
printf("请问B是几元链表:\n");
scanf("%d",&bn);
printf("请问C是几元链表:\n");
scanf("%d",&cn);
printf("请输入A链表的元素:\n");
A=CreateList(A,an);
printf("\n请输入B链表的元素:\n");
B=CreateList(B,bn);
printf("/n请输入C链表的元素:\n");
C=CreateList(C,cn);
printf("\n**********************链表的输出*******************************\n");
printf("链表A为:\n");
PrintList(A);
printf("\n链表B为:\n");
PrintList(B);
printf("\n链表C为:\n");
PrintList(C);
printf("\n**********************链表的输出*******************************\n");
for(pa=A;pa->next!=NULL;)
{
for(pb=B->next;pb!=NULL;pb=pb->next)
{
for(pc=C->next;pc!=NULL;pc=pc->next)
{
if(pa->next->data==pb->data && pa->next->data==pc->data)
{
cur_pt=pa->next;
pa->next=pa->next->next;
free(cur_pt);
if(pa->next!=NULL)//由于pa->next=pa->next->next;
pa=pa->next;
}
}
}
}
printf("完成操作后的链表为:\n");
for(pa=A->next;pa!=NULL;pa=pa->next)
{
printf("%d ",pa->data);
}
printf("\n");
}