当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

单链表的创建、插入、删除、倒置操作

    /*---------------------------------------------------*/
    /*--------------单链表的创建、插入、删除、倒置操作-----------*/
    /*--------------Written by redfire250-----2005.5.10----*/
    /*-----------------------------------------------------*/

 

    #include<malloc.h>
    #include<stdio.h>
    #define null 0
    struct student
    {
     long Number;
     char Name[20];
     long Score;
     struct student *Next;
    };

    int n=0;/*n为全局变量,用来计算链表的结点个数*/

 

    /*-----------------------------------------*/
    /*--------------创建结点函数Creat()--------*/
    /*-----------------------------------------*/
    struct student *Creat()
    {

      struct student *p1;
      struct student *p2;
      struct student *head=null;
      p1=p2=(struct student *)malloc(sizeof(struct student));/*开辟一段可用内存单元*/
      printf("please input the student's Number Name and the Score:\n");
      scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);

      while(p2->Number!=0)
      {
          n++;

          if(n==1)            /*是否开辟的是第一个结点*/
          head=p2;
          else
          p1->Next=p2;

          p1=p2;
          p2=(struct student *)malloc(sizeof(struct student));
          printf("Input the  Number the Name and the Score:\n");
          scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);
      }
      p1->Next=null;
      return(head);
    }


    /*------------------------------------------*/
    /*--------------查看链表内容函数View()------*/
    /*------------------------------------------*/
     View(struct student *head)
     {
      struct student *p;
      p=head;
      while(p->Next!=null)
      {
           printf("%ld  %s  %ld\n",p->Number,p->Name,p->Score);
           p=p->Next;
      }
      printf("%ld  %s  %ld\n",p->Number,p->Name,p->Score);
     }

 

    /*-------------------------------------------------*/
    /*--------------插入结点函数(前插)Insert()-------*/
    /*-------------------------------------------------*/
     Insert(struct student *head,int Num)       /*head为链表头指针,Num插入链表位置*/
    {
     int t=1;
     struct student *p1,*p2;
     p1=head;
     if (Num>n||Num<0)
     {
         printf("input error!!!\n");
         return 0;
     }

     while(t<Num-1)                  /*找到要插入结点的前一个结点*/
     {
         p1=p1->Next;
         t++;
     }
     p2=(struct student *)malloc(sizeof(struct student));
     printf("Input the  Number the Name and the Score:\n");
     scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);
     p2->Next=p1->Next;
     p1->Next=p2;
     n++;

    }


    /*------------------------------------------*/
    /*------------ 删除结点函数Delnode()--------*/
    /*-----------------------------------------*/
     Delnode(struct student *head,int node)
    {
     int t=1;
     struct student *p1,*p2;
     p2=head;
     if (node>n||node<1)
     {
         printf("error!!! The node is not exist!");
         return 0;
     }
     while(t<node-1)       /*找到要删除结点的前一个结点*/
     {
         p2=p2->Next;
         t++;
     }
     p1=p2->Next->Next;     /*找到要删除结点的后一个结点*/
     free(p2->Next);        /*释放要删除的结点空间(删除)*/
     p2->Next=p1;           /*前一结点指向后一结点*/
     n--;
    }

    /*-------------------------------------------------*/
    /*--------------逆序重组链表Invert()-------*/
    /*-------------------------------------------------*/
     struct student *Invert(struct student *head)
    {
      struct student *p1,*p2;
      p1=head;
      p2=p1->Next;
      head=p2->Next;
      p1->Next=null;
      while(head->Next!=null)
      {
       p2->Next=p1;
       p1=p2;
       p2=head;
       head=head->Next;
      }
      head->Next=p2;
      p2->Next=p1;
      return head;
    }

    main()
    {
     int number1,number2;
     struct student *head;
     head=Creat();
     View(head);

     printf("the n that you want to insert:\n");
     scanf("%d",&number1);
     Insert(head,number1);
     View(head);

     printf("the node that you want to DELETE:\n");
     scanf("%d",&number2);
     Delnode(head,number2);
     View(head);

     printf("Inverte the list:\n");
     View(Invert(head));

     getch();
    }

相关内容
赞助商链接