链表的基本操作

来源:互联网 发布:犀牛软件模型 编辑:程序博客网 时间:2024/06/10 01:53

  链表可以进行创建、插入、删除、查找、改变等操作,不过这个程序存在一个很大的问题——就是在插入的时候不可以第二次插入,如果有谁能帮我完善一下那就再好不过了。有缺陷的涵数是struct student *insert(struct student *head, struct student *stud)

/*win-tc*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define Esc 27       /*定义键盘退出键Esc*/
#include"ctype.h"
#define NULL 0
#define LEN sizeof(struct student)
  struct student
  {  long num;
      float score;     
      struct student *next;
  };
  int n;


  /*创建链表*/
  struct student *creat()
  {
    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("%ld,%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);
       printf("/npress a key to continue.");
       getch();
     }


    /*删除链表元素*/
    struct student *del(struct student *head,long num)
    {
       struct student *p1,*p2;
       if (head==NULL)
         {
           printf("/nlist null!/n");
           return(head);
         }
       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:%ld/n",num);    
               n=n-1;
             }
          else
             printf("%ld not been found!/n",num);
        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);
     }

     /*查找链表元素*/
     struct student *find(struct student *head, long num)
     {
          struct student *p1,*p2;

          p1=head;

          if(head==NULL)
          {
                printf("/nlist null!/n");
                return(head);
          }
          else
          {
                while(num!=p1->num && p1->next!=NULL)
                {
                    p2=p1;
                    p1=p1->next;
                }
                if(num==p1->num)
                {
                    printf("have fond the number is:/n%ld %5.1f/n",p1->num,p1->score);
                    return(head);
                }
                else
                {
                    printf("the find number is not in the list!/n");
                    return(head);
                }
          }
       }


       /*改变链表元素的成绩*/
       struct student *change(struct student *head, long num)
       {
          struct student *p1,*p2;
          struct student stu;
          if(head==NULL)
          {
                printf("/nlist null!/n");
                return(head);
          }
          else
          {
                while(num!=p1->num && p1->next!=NULL)
                {
                    p2=p1;
                    p1=p1->next;
                }
                if(num==p1->num)
                {
                    printf("the before score is:%5.1f/n",p1->score);
                    printf("please input the change score!/n");
                    scanf ("%f",&stu.score) ;
                    p1->score=stu.score ;
                    return(head);
                }
                else
                {
                    printf("the find number is not in the list!/n");
                    return(head);
                }
          }  
       }

/*主涵数*/
void main()
     {     
     struct student *head,stu;
     long  del_num;
     long  find_num;
     long  change_num;
     char ckey='a';
     int istate=0;
     do
     {
        clrscr();
        printf("1:intput records:/n");
        printf ("2:intput the  deleted number:/n");
        printf ("3:intput the inserted number:/n");
        printf("4:please input the finding number:/n");
        printf("5:please input the change number:/n");
        printf("6:output records:/n");
        printf("Esc:exit/n");
        printf("please input your choose(1-4)/n/n");
        ckey=getch();
        if(ckey=='1')    /*创建*/
        {
        printf("please input records(num,score),by the end of 0:/n/n");
        head=creat();
        print(head);
        istate=1;
        }
        else if((istate==0)&&(ckey!=Esc))
        {
            printf("/nERROR:you must input records first!");
            printf("/npress a key to continue.");
            getch();
        }
        else if(ckey=='2')   /*删除*/
        {
        printf ("/nplease intput the  deleted number:/n/n");
        scanf ("%ld",&del_num);
        head=del(head,del_num);
        print(head);
        }
        else if(ckey=='3')   /*插入*/
        {
        printf (" /nplease intput the inserted number(num,score):/n/n");
        scanf ("%ld,%f",&stu.num,&stu.score) ;
        head=insert(head,&stu);
        print(head);
        }
        else if(ckey=='4')   /*查找*/
        {
        printf("  /nplease input the finding number:/n/n");
        scanf ("%ld,",&find_num) ;
        head=find(head,find_num);
        print(head);
        }
        else if(ckey=='5')    /*改变*/
        {
        printf("  /nplease input the change number:/n/n");
        scanf ("%ld,",&change_num) ;
        head=change(head,change_num);
        print(head);
        }
        else if(ckey=='6')    /*打印*/
        {
            print(head);   
        }
     }
     while(ckey!=Esc);       /*按键盘上的Esc键退出*/
}

原创粉丝点击