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

    技术2022-05-11  79

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

    #include<malloc.h>#include<stdio.h>#define null 0struct 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();}


    最新回复(0)