链表的简单操作

 #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;
struct student * creat(void)
{
 struct student * head;
 struct student *p1,*p2;
 n=0;
 p1=p2=(struct student *)malloc(LEN);
 scanf("%ld,%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("%d,%f",&p1->num,&p1->score);
 }
 p2->next=NULL;
 return(head);
}

void print(struct student *head)
{
 struct student *p;
 printf("\nNow,These %d records are:\n",n);
 p=head;
 if(head!=NULL)
 {
  do
  {
   printf("%ld,%5.1f\n",p->num,p->score);
   p=p->next;
  }
  while(p!=NULL);
 }
}
struct student * del(struct student *head,long num)
{
 struct student *p1,*p2;
 if(head==NULL)
 {
  printf("\nlist null! \n"); goto end;
 }
 p1=head;
 while(num!=p1->num&&p1->next!=NULL)
 {
  p2=p1;p1=p1->next;
 }
 if(num==p1->num)
 {
  if(p1==head) head=p1->next;
  else p2->next=p1->next;
  printf("delete:%d\n",num);
  n=n-1;
 }
 else printf("%ld not been found! \n",num);
end:
return (head);
}

struct student * insert(struct student * head,struct student * stud)
{
 struct student *p0,*p1,*p2;
 p1=head;
 p0=stud;
 if(head==NULL)
 {
  head=p0;p0->next=NULL;
 }
 else
 {
  while((p0->num>p1->num)&&(p1->next!=NULL))
  {
   p2=p1;
   p1=p1->next;
  }
  if(p0->num<=p1->num)
  {
   if(head==p1)head=p0;
   else p2->next=p0;
   p0->next=p1;
  }
  else
  {
   p1->next=p0;p0->next=NULL;
  }
  n=n+1;
  return(head);
 }
}

void main()
{
 struct student p;long n;\
  int d;
 struct student *st1=creat();
 print(st1);
 printf("2:del,3:insert,4:stop:");
  while(scanf("%d",&d)!=NULL)
  {
   if(d==2)
   {
    scanf("%d",&n);
    print(del(st1,n));
   }
   if(d==3)
   {
    scanf("%ld,%f",&p.num,&p.score);
    print(insert(st1,&p));
   }
   if(d==4)
   {
    break;
   }
   printf("2:del,3:insert,4:stop:");
  }

}

posted @ 2009-07-24 16:34  Roader  阅读(261)  评论(0编辑  收藏  举报