P74_75.cpp
上传用户:chaiyuqiu
上传日期:2022-08-03
资源大小:27k
文件大小:3k
源码类别:

数据结构

开发平台:

C/C++

  1. //Test is T74_75.cpp
  2. #include <stdio.h>
  3. #include <iostream.h>
  4. class List; //List类的前视声明
  5. class ListNode { //结点类定义
  6. friend class List;
  7. friend ostream & operator << ( ostream&, List & ); //声明List类为友元类
  8. public:
  9.    //ListNode() { data = 0; link = NULL; );
  10.    ListNode( int x, ListNode * p ) { data = x; link = p; }
  11. private:
  12.    int data; //数据元素域
  13.    ListNode *link; //链指针域
  14. };
  15. class List { //List类定义
  16. friend ostream & operator << ( ostream&, List & ); //声明List类为友元类
  17. public:
  18.    List(): first( NULL ) {};
  19.    //链表公共操作
  20.    //………
  21.    int Insert ( const int x, const int i );
  22.    int Remove ( int i );
  23. private:
  24.    ListNode *first, *last; //指向链表表头的指针
  25. };
  26. #include <iostream.h>
  27. int List::Insert ( const int x, const int i ) {
  28. //将新元素x插入到第i结点之前。i是结点号,从0开始。
  29.    ListNode *p = first;  int k = 0;
  30.    while ( p != NULL && k< i-1 ) { p = p->link;  k++; } //循链找第i-1个结点
  31.    if ( p == NULL && first != NULL ) { //非空表而且链短,找不到第i-1个结点
  32.  cout << "Invalid position for Insertation!n";  return 0; //终止插入, 函数返回0
  33.    }
  34.    ListNode *newnode= new ListNode( x, NULL ); //建立一个newnode指示的新结点, 数据为x
  35.    if ( first == NULL || i == 0 ) { //插入空表或非空表第一个结点之前
  36.   newnode->link = first; //新结点成为第一个结点
  37.   if ( first == NULL ) last = newnode; //原为空表时,表尾指针指向这个新结点
  38.   first = newnode;
  39.    }
  40.    else { //插入在链表的中间或尾部
  41.   newnode->link = p->link;
  42.   if ( p->link == NULL ) last = newnode;
  43.   p->link = newnode;
  44. }
  45.    return 1; //正常插入,函数返回1
  46. }
  47. int List::Remove ( int i ) {
  48. //将链表中的第i个元素删去, 通过函数返回该元素。若i不合理, 则返回NULL。
  49.    if ( i < 0 ) { cout << "Invalid position for Deletion!n";  return 0;} //不能删除, 函数返回0
  50.    ListNode *p = first, *q;  int k = 0;
  51.    while ( p != NULL && k< i-1 ) { p = p->link; k++; } //循链找第i-1个结点
  52.    if ( p == NULL || p->link == NULL ) { //空表或者链短,找不到第i-1个结点
  53.   cout << "Invalid position for Deletion!n";  return 0; //不能删除, 函数返回0
  54.    }
  55.    if ( i == 0 ) { q = first;  p = first = first->link; }  //删第一个结点时,重新拉链
  56.    else { q = p->link;  p->link = q->link; } //删中间一个结点或尾结点时
  57.    if ( q == last ) last = p; //删表尾结点时, 表尾指针修改
  58.    k = q->data;  delete q;  return k; //取出被删结点中的数据值
  59. }
  60. ostream & operator << ( ostream& os , List & onelist) {
  61.     ListNode * p = onelist.first;
  62.     if ( p == NULL ) os << "It is empty";
  63.     else while ( p != NULL ) {
  64.      os << p->data << " " ;
  65.      p = p->link;
  66.  }
  67.     return os;
  68. }