常见的链表操作

来源:互联网 发布:制作手持身份证软件 编辑:程序博客网 时间:2024/06/05 19:28
#include <stdio.h>  #include<malloc.h>  #define LEN sizeof(struct student )  #define NULL 0  struct student   {      int num;      float score;      struct student *next;  };  int n;  //建立链表  struct student *create(void)  {      struct student *head, *p1,*p2;      n=0;      p1=p2=(struct student *)malloc(LEN);      scanf("%d %f",&p1->next,&p1->score);      head=NULL;      while(p1->num!=0)      {          n=n+1;          if(n==1) head=p1;    //p1是指向新开辟的结点          else p2->next=p1;          p2=p1;    //p2指向链表中的最后一个基点          p1=(struct student *)malloc(LEN); //开辟新的结点,并且使p1指向他          scanf("%d %f",&p1->num,&p1->score);      }      p2->next=NULL;      return (head);  }  //删除结点  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)   //p1指向不是所要找的结点,并且后面还有结点      {          p2=p1;          p1=p1->next;      //p1后移一个及诶单      }       //p1后移一个结点      if(num==p1->num)     //找到了      {          if(p1==head)  head=p1->next;    //若p1指向的是首结点,把第二个结点的地址head            else p2->next=p1->next;      //or 将下一个结点的地址赋给前一个结点地址          printf("delete:%d\n",num);          n=n-1;          free(p1);      }      else  printf("%dnot been found !\n",num);      end:      return(head);      }  //插入学生信息   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 ((p1->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 print(struct student *head)  {      struct student *p;      p=head;      if(head!=NULL)          do      {          printf("%d %f\n",p->num,p->score);          p=p->next;        }      while(p!=NULL);  }  //main函数   void main()  {      struct student *head,stu;      long del_num;      printf("Input records:\n");      head=create();        //建立链表,返回头指针      print(head);          //输出全部结点        printf("\nInput the deleted number:\n");      scanf("%ld",&del_num);       //输入要删除的学号      while(del_num!=0)      {      head=del(head,del_num);      //删除后链表的头指针      print(head);                       //输出全部结点      printf("Input the deleted number:\n");      scanf("%ld",&del_num);       }        printf("\nInput the inserted record:\n");      stu=(struct student *)malloc(LEN);      scanf("%d %f",&stu->num,&stu->score);     //输入要插入的结点      {      head=insert(head,&stu);                 //插入一个结点,返回头指针的      print(head);                                     //输出全部结点      printf("\nInput the inserted record:\n");      stu=(struct student *)malloc(LEN);      scanf("%d %f",&stu->num,&stu->score);      }  }  

3 0
原创粉丝点击