回 帖 发 新 帖 刷新版面

主题:对链表的综合操作  问题

/*  lianbiao.C -- 对链表的综合操作 */

/*建立链表函数如下*/
#include <stdio.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct student)

struct student
{ long num;
  float score;
  struct student * next;
};
int n;                           /*N为全局变量,本文件模块中各函数均可使用它*/

struct student * creat(void)     /*定义函数,此函数带回一个指向链表的指针*/
{ struct student * head;
  struct student * p1,* p2;
  n=0;
  p1=p2=(struct student *)malloc(LEN); /*开辟一个新单元*/
  scanf("%1d,%f",&p1->num,&p1->score);
  head=NULL;
  while(p1->num!=0)
     { n=n+1;
       if(n==1)
         head=p1;
       else
         p2->next=p1;
       p2=p1;
       p1=(struct student *)malloc(LEN);
       scanf("%1d,%f",&p1->num,&p1->score);
     }
  p2->next=NULL;
  return(head);
}

/*输出链表的函数print*/                          
void print(struct student * head)
{ struct student * p;
  printf("\nnow,these %d records are:\n",n);
  p=head;
  if(head!=NULL)
    do
      { printf("%1d %5.1f\n",p->num,p->score);
        p=p->next;
      }while(p!=NULL);
}

/*删除结点的函数del如下*/
struct student * del(struct student * head,long num)
{ struct student * p1,* p2;
  if(head==NULL)
  { printf("\nlist null! \n");
    goto stop1;
  }
  p1=head;
  while(num!=p1->num&&p1->next!=NULL)
         /*p1指向的不是所要找的结点,并且后面还有结点*/
    { p2=p1;p1=p1->next;} /*p1后移一个结点*/
  if(num==p1->num) /*找到了*/
    { if(p1==head) head=p1->next;/*若p1指向的是首结点,
                                     把第二个结点地址赋予head*/
      else p2->next=p1->next;    /*否则将下一个结点地址赋予给前一个结点地址*/
      printf("delete:%d\n",num);
      n=n-1;

    }
  else
    printf("%1d not been found ! \n",num);/*找不到该节点*/
  stop1: return(head);
}

/*插入结点的函数insert如下*/

struct student * insert(struct student * head,struct student * stud)
{ struct student * p0,* p1,* p2;
  p1=head;                  /*使p1指向第一个结点*/
  p0=stud;                    /*p0指向要插入的结点*/
  if(head==NULL)                /*原来的链表是空表*/
   { head=p0;
     p0->next=NULL;}     /*使p0指向的结点作为头结点*/
  else
   { while((p0->num>p1->num)&&(p1->next!=NULL))
      {  p2=p1;                 /*使p2指向刚才p1指向的结点*/
         p1=p1->next;
      }                        /*p1后移一个结点*/
     if(p0->num <= p1->num)
       { if(head==p1)
           head=p0; /*插到原来第一个结点之前*/
         else
           p2->next=p0;        /*插到p2指向的结点之后*/
           p0->next=p1;
       }
     else
       {
         p1->next=p0;
         p0->next=NULL; /*插到最后的结点之后*/
       }

   }
   n=n+1;                    /*结点数加1*/
   return(head);
}

void main()
{ struct student * head,* stu;
  long del_num;
  printf("input records:\n");
  head=creat();
  print(head);
  printf("\ninput the deleted number:\n");
  scanf("%1d",&del_num);
  while(del_num!=0)
   { head=del(head,del_num);
     print(head);
     printf("input the deleted number:");
     scanf("%1d",&del_num);
   }
     printf("\ninput the inserted number:");
     stu=(struct student * )malloc(LEN);
     scanf("%1d,%f",&stu->num,&stu->score);
     while(stu->num!=0)
      { head=insert(head,stu);
        print(head);
        printf("input the inserted record:");
        stu=(struct student * )malloc(LEN);
        scanf("%1d,%f",&stu->num,&stu->score);
      }
}

以上是对链表的综合操作的源代码,我用Win-Tc试了好几遍 编译没错,死循环...我输入的是10101,90 10103,98 10105,76 0,0  检查不出来了,有路过的大侠指点指点啊![em10]

回复列表 (共1个回复)

沙发


深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。

我来回复

您尚未登录,请登录后再回复。点此登录或注册