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