xt7-10-1.cpp
上传用户:liubin
上传日期:2022-06-13
资源大小:85k
文件大小:3k
源码类别:

书籍源码

开发平台:

Visual C++

  1. #include <iostream>
  2. using namespace std;
  3. #define NULL 0     
  4. struct student
  5. {long num;
  6.  float score;
  7.  student *next;
  8. };    
  9. int n; 
  10. int main()
  11. { student *creat(void);
  12.   student *del(student *,long);  
  13.   student *insert(student *,student *);
  14.   void print(student *);
  15.   student *head,stu;
  16.   long del_num;
  17.   cout<<"input records:"<<endl;
  18.   head=creat();                        //返回头指针
  19.   print(head);                          //输出全部结点
  20.   cout<<endl<<"input the deleted number:";
  21.   cin>>del_num;                        //输入要删除的学号
  22.   head=del(head,del_num);              //删除后链表的头地址
  23.   print(head);                         //输出全部结点
  24.   cout<<endl<<"input the inserted record:";  //输入要插入的结点
  25.   cin>>stu.num>>stu.score;
  26.   head=insert(head,&stu);              //返回地址
  27.   print(head);                         //输出全部结点
  28.   cout<<endl<<"input the inserted record:";  //输入要插入的结点
  29.   cin>>stu.num>>stu.score;
  30.   head=insert(head,&stu);              //返回地址
  31.   print(head); 
  32.   return 0;
  33. }
  34. student *creat(void)       //建立链表的函数
  35. {student *head;
  36.  student *p1,*p2;
  37.  n=0;
  38.  p1=p2=new student;       //开辟一个新单元,并使p1,p2指向它
  39.  cin>>p1->num>>p1->score;
  40.  head=NULL;
  41.  while(p1->num!=0)
  42. {n=n+1;
  43.  if(n==1) head=p1;
  44.  else p2->next=p1;
  45.  p2=p1;
  46.  p1=new student;
  47.  cin>>p1->num>>p1->score;
  48. }
  49. p2->next=NULL;
  50. return(head);
  51. }    
  52. student *del(student *head,long num)   //删除结的函数
  53. {student *p1,*p2;
  54.  if (head==NULL)                    //是空表
  55.  {cout<<"list null!"<<endl; return(head);}
  56.  p1=head;                          //使p1指向第一个结点
  57.  while(num!=p1->num && p1->next!=NULL) //p1指向的不是所要找的结点且后面还有结点
  58.  {p2=p1; p1=p1->next;}                 //p1后移一个结点
  59.  if(num==p1->num)                        //找到了
  60.  {if(p1==head) head=p1->next;   //若p1指向的是首结点,把第二个结点地址赋予head
  61.   else p2->next=p1->next;    //否则将下一结点地址赋给前一结点地址
  62.   cout<<"delete:"<<num<<endl;
  63.   n=n-1;
  64.  }
  65.  else cout<<"cannot find "<<num;     //找不到该结点
  66.  return(head);
  67. }
  68.     
  69. student *insert(student *head,student *stud)  //插入结点的函数
  70. {student *p0,*p1,*p2;
  71.  p1=head;                          //使p1指向第一个结点
  72.  p0=stud;                          //指向要插入的结点
  73.  if(head==NULL)                    //原来的链表是空表
  74.  {head=p0;p0->next=NULL;}          //使p0指向的结点作为头结点
  75.  else
  76.  {while((p0->num>p1->num) && (p1->next!=NULL))
  77.  {p2=p1;                       //使p2指向刚才p1指向的结点
  78.   p1=p1->next;}                //p1后移一个结点
  79.   if(p0->num<=p1->num)
  80.   {if(head==p1) head=p0;        //插到原来第一个结点之前
  81.    else p2->next=p0;            //插到p2指向的结点之后*/
  82.    p0->next=p1;}
  83.   else
  84.   {p1->next=p0; p0->next=NULL;}}  //插到最后的结点之后
  85.    n=n+1;                         //结点数加1
  86.    return (head);
  87. }
  88.                
  89. void print(student *head)         //输出链表的函数
  90.  {student *p;
  91.   cout<<"Now,These "<<n<<" records are:"<<endl;
  92.   p=head;
  93.   if(head!=NULL)
  94.   do
  95.     {cout<<p->num<<"  "<<p->score<<endl;
  96.      p=p->next;
  97. }while(p!=NULL);
  98. }