鱼C论坛

 找回密码
 立即注册
查看: 2209|回复: 2

关于单向链表中删除结点的问题—————————来几个帅哥帮看看——————谢谢—

[复制链接]
发表于 2014-3-10 19:04:27 | 显示全部楼层 |阅读模式
3鱼币
经单步调试发现,问题出在了如下删除结点的函数里,比如我输入学号5,成绩90,学号4,成绩80,学号3,成绩80这样,删除的学号输入4,下面函数中  if(p1=head)  总是为真,因为if(p1->num==a)判断是成立的,就是说此时的p1已经是下个结点了,而不是head,但是  if(p1=head)  却是真的,在运行的结果就是,无论输入5,4,3,最后都会删除第一个人的成绩与学号,小弟百思不得其解,来几位朋友帮帮忙,谢谢!!!!!!!!!!!!!!!!!!!!
        p1=head;
        while( p1->num != a  && p1->next != NULL )
        {
                p2=p1;
                p1=p1->next;
        }
        if(p1->num==a)
        {
                if(p1=head)
                {
                head=p1->next;
                return head;
                }
                else
                        p2->next=p1->next;
                        return head;
                }
        else
                {
                        printf("找不到学号\n");
                        return head;
                }



————————————————————————————————————————————————
————————————————————————————————————————————-———
以下是全程序:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define CD sizeof(struct student)
struct student
{
      long num;  
      float score;
      struct student *next;
};
int n;

void main()
{
        struct student *creat();
        struct student *del();
        void print(struct student *head);
        struct student *stu;
        stu=creat();
        print(stu);
        stu=del(stu);
        print(stu);
}
struct student *creat()
{
         struct student *p1,*p2, *head;
         p1=p2=(struct student*)malloc(CD);
         printf("输入学号:");
         scanf("%d",&p1->num);
         printf("输入成绩:");
         scanf("%f",&p1->score);
         head=NULL;
         n=0;
         while(p1->num != 0)
         {
                 n=n+1;
                 if(n==1)
                 {
                         head=p1;
                 }
                 else
                 {
                        p2->next=p1;
                 }
                 p2=p1;
                 p1=(struct student*)malloc(CD);
                 printf("输入学号:");
                 scanf("%d",&p1->num);
                 printf("输入成绩:");
                 scanf("%f",&p1->score);
         }
         p2->next=NULL;
         return head;
}
struct student *del(struct student *head)
{       
        long a;
        struct student *p1,*p2;
        printf("请输入你要删除的学号:\n");
        scanf("%d",&a);
        if(head==NULL)
        {
                printf("这个是空表\n");
                return head;
        }
        p1=head;
        while( p1->num != a  && p1->next != NULL )
        {
                p2=p1;
                p1=p1->next;
        }
        if(p1->num==a)
        {
                if(p1=head)
                {
                head=p1->next;
                return head;
                }
                else
                        p2->next=p1->next;
                        return head;
                }
        else
                {
                        printf("找不到学号思密达\n");
                        return head;
                }
}
       

               
void print(struct student *head)
{
          struct student *p;
      printf("\nThere are %d records!\n\n", n);

      p = head;
      if( head )
      {
            do
            {
                  printf("学号为 %d 的成绩是: %f\n", p->num, p->score);
                  p = p->next;
            }while( p );
      }
}
       

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-10 20:25:19 | 显示全部楼层
有人吗~~~~~~~~~~~~~~~~~~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-10 20:37:55 | 显示全部楼层
少写了个=。。傻逼了下=。=
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 21:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表