从链表a中找出与链表b相同的值并删除,谭浩强学习指导代码中有错误

#include<stdio.h>
#define N 5
#define M 6
struct student{		//建立结构体数组,成员和书上不一样,可以修改
 int no;
 double sco;
 struct student *next;
}cla1[N],cla2[M];  
void main(){
 struct student *head1,*head2,*p1,*p2,*p;
 int i;
 //在这里直接对结构体数组成员赋值,可以省去调试时输入数据时间
 struct student cla1[N] = {{2003,87.5},{2004,86.4},{2005,34.5},{2007,87.5},{2009,56.5}};
 struct student cla2[M] = {{2001,87.5},{2003,86.4},{2004,34.5},{2017,87.5},{2008,56.5},{2009,95.4}};
 head1 = cla1;
 head2 = cla2;
 printf("List 1:\n");
 //将结构体连接起来,链接成链表
 for(p1 = head1,i = 1;i <= N;i++){
  if(i == N)
   p1->next = NULL;
  else
   p1->next = cla1+i;
  printf("%d,%f\n",p1->no,p1->sco);	//输出链表
  p1 = p1->next;
 }
 printf("List 2:\n");
 for(p2 = head2,i = 1;i <= M;i++){
  if(i == M)
   p2->next = NULL;
  else
   p2->next = head2 + i;
  printf("%d,%f\n",p2->no,p2->sco);
  p2 = p2->next;
 }
 p1 = head1;
 while(p1 != NULL){ 
  p2 = head2;
  while((p1->no != p2->no) && (p2->next != NULL))
   p2 = p2->next;
  if(p1->no == p2->no){
   if(p1 == head1)
    head1 = head1->next;
   else
    p->next = p1->next;
    //原本这里有大括号,现在去掉大括号
    p1 = p1->next;   
  }
  else{
   p = p1;
   p1 = p1->next;
  }
 }
 printf("\nresult:\n");
 p1 = head1;
 while(p1 != NULL){
  printf("%d,%f\n",p1->no,p1->sco);
  p1 = p1->next;
 }
}
//这里是学习指导上的源代码,大家可以对比一下
#include<stdio.h>
#define N 5
#define M 6
struct student{
 int no;
 double sco;
 struct student *next;
}cla1[N],cla2[M];  
void main(){
 struct student *head1,*head2,*p1,*p2,*p;
 int i;
 struct student cla1[N] = {{2003,87.5},{2004,86.4},{2005,34.5},{2007,87.5},{2009,56.5}};
 struct student cla2[M] = {{2001,87.5},{2003,86.4},{2004,34.5},{2017,87.5},{2008,56.5},{2009,95.4}};
 head1 = cla1;
 head2 = cla2;
 printf("List 1:\n");
 for(p1 = head1,i = 1;i <= N;i++){
  if(i == N)
   p1->next = NULL;
  else
   p1->next = cla1+i;
  printf("%d,%f\n",p1->no,p1->sco);
  p1 = p1->next;
 }
 printf("List 2:\n");
 for(p2 = head2,i = 1;i <= M;i++){
  if(i == M)
   p2->next = NULL;
  else
   p2->next = head2 + i;
  printf("%d,%f\n",p2->no,p2->sco);
  p2 = p2->next;
 }
 p1 = head1;
 while(p1 != NULL){ 
  p2 = head2;
  while((p1->no != p2->no) && (p2->next != NULL))
   p2 = p2->next;
  if(p1->no == p2->no){
   if(p1 == head1)
    head1 = head1->next;
   else{
    p->next = p1->next;
    p1 = p1->next;
   }
  }
  else{
   p1 = p1->next;
   p = p1; 
  }
 }
 printf("\nresult:\n");
 p1 = head1;
 while(p1 != NULL){
  printf("%d,%f\n",p1->no,p1->sco);
  p1 = p1->next;
 }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值