顺序线性表实现(SqList)

数据结构第一次作业...

顺序表的实现( C  and  C++):

C语言版:

 

  1  #include < stdio.h >
  2  #include < malloc.h >
  3  #include < stdlib.h >
  4 
  5  #define  LIST_INIT_SIZE 10
  6  #define  LISTINCREMENT 2
  7  #define  OVERFLOW -2
  8  #define  OK 1
  9  #define  ERROR 0
 10 
 11  typedef  int  Status;
 12  typedef  int  ElemType;
 13 
 14  typedef  struct {
 15       int   * elem;
 16       int  length;
 17       int  listsize;
 18  }SqList;
 19 
 20  Status InitList_Sq(SqList *  L);                  // 初始化顺序表
 21  Status ListInsert_Sq(SqList *  L, int  i,ElemType e);     // 顺序表中插入元素
 22  Status MergeList_Sq(SqList La,SqList Lb,SqList *  Lc);   // 顺序表的合并
 23  Status ListPrint_Sq(SqList *  L);          // 顺序表元素的输出
 24 
 25  int  main()
 26  {
 27      SqList La,Lb,Lc;
 28       int  i  =   1 ;
 29      ElemType num  =   0 ;
 30      InitList_Sq( & La);
 31      InitList_Sq( & Lb);
 32 
 33      printf( " Please input the number(end by -1):\n " );
 34       while ( 1 )
 35      {
 36          scanf( " %d " , & num);
 37           if (num  ==   - 1 )
 38               break ;
 39          ListInsert_Sq( & La,i,num);
 40          i ++ ;
 41      }
 42      ListPrint_Sq( & La);
 43 
 44      i  =   1 ;
 45      printf( " Please input the number(end by -1):\n " );
 46       while ( true )
 47      {
 48          scanf( " %d " , & num);
 49           if (num  ==   - 1 )
 50               break ;
 51          ListInsert_Sq( & Lb,i,num);
 52          i ++ ;
 53      }
 54      ListPrint_Sq( & Lb);
 55 
 56      MergeList_Sq(La,Lb, & Lc);    // 顺序表合并的算法函数
 57 
 58      printf( " MergeList OK\n " );
 59      ListPrint_Sq( & Lc);
 60  }
 61 
 62  Status MergeList_Sq(SqList La,SqList Lb,SqList *  Lc)
 63  {
 64      ElemType  * pa = La.elem, * pb = Lb.elem, * pc;
 65      ElemType  * pa_last, * pb_last;
 66      Lc -> listsize  =  Lc -> length  =  La.length + Lb.length;
 67      pc =  Lc -> elem  =  (ElemType * )malloc(Lc -> listsize * sizeof (ElemType));
 68       if ( ! Lc -> elem)
 69          exit(OVERFLOW);
 70      pa_last  =  La.elem  +  La.length  -   1 ;
 71      pb_last  =  Lb.elem  +  Lb.length  -   1 ;
 72       while (pa <= pa_last && pb <= pb_last)
 73           * pc ++   =  ( * pa <=* pb  ?   * pa ++  :  * pb ++ );  //  return a value,but not a good style;(<C++ Programming Style> Tom Cargill )    
 74       /* {
 75          if(*pa<=*pb)
 76              *pc++ = *pa++;
 77          else
 78              *pc++ = *pb++;
 79      } */
 80       while (pa <= pa_last)  * pc ++   =   * pa ++ ;
 81       while (pb <= pb_last)  * pc ++   =   * pb ++ ;
 82      
 83       return  OK;
 84  }
 85 
 86 
 87 
 88      
 89 
 90  Status InitList_Sq(SqList *  L)
 91  {
 92      L -> elem  =  (ElemType * )malloc(LIST_INIT_SIZE * sizeof (ElemType));
 93       if ( ! L -> elem)
 94          exit(OVERFLOW);
 95      L -> length  =   0 ;
 96      L -> listsize  =  LIST_INIT_SIZE;
 97       return  OK;
 98  }
 99 
100  Status ListInsert_Sq(SqList *  L, int  i,ElemType e)
101  {
102      ElemType  * newbase, * p, * q;
103       if (i < 1   ||  i >  L -> length + 1 )
104           return  ERROR;
105       if (L -> length  >=  L -> listsize)
106      {
107          newbase  =  (ElemType * )realloc(L -> elem,(L -> listsize  +  LISTINCREMENT) * sizeof (ElemType));
108           if ( ! newbase)
109              exit(OVERFLOW);
110          L -> elem  =  newbase;
111          L -> listsize  +=  LISTINCREMENT;
112      }
113      q  =   & (L -> elem[i - 1 ]);
114       for (p =& (L -> elem[L -> length - 1 ]);p >= q; -- p)
115      {
116           * (p + 1 =   * p;
117      }
118       * =  e;
119       ++ L -> length;
120      
121       return  OK;
122  }
123 
124  Status ListPrint_Sq(SqList *  L)
125  {
126       int  i  =   0 ;
127      ElemType num  =   0 ;
128       for (i = 0 ;i < L -> length;i ++ )
129      {
130          num  =  L -> elem[i];
131          printf( " No.%d\t%d\n " ,i,num);
132      }
133 
134       return  OK;
135  }

貌似我不该公开这个....随意了.....

 

 

C++描述:

 

  1  /*  status.h  预定义头文件  */
  2  #pragma  once
  3  #include < iostream >
  4  #include < malloc.h >
  5 
  6  #define  TRUE 1
  7  #define  FALSE 0
  8  #define  OK 1
  9  #define  ERROR 0
 10  #define  OVERFLOW -2
 11  #define  INFEASIBLE -1
 12  #define  LISTINCREMENT 2
 13  #define  LIST_INIT_SIZE 10
 14 
 15 
 16  typedef  int  Status;
 17  typedef  int  ElemType;
 18 
 19  struct  SqList{
 20      ElemType  * elem;
 21       int  length;
 22       int  listsize;
 23  };
 24  ----------------------------------------------
 25  /*  SqList.h  CSqList类的声明文件 */
 26  #pragma  once
 27  #include  " Status.h "
 28 
 29  class  CSqList
 30  {
 31  public :
 32 
 33      CSqList( void );
 34       ~ CSqList( void );
 35  public :
 36       //  顺序线性表结构体
 37      SqList L;
 38  public :
 39       //  含参数的构造函数
 40      CSqList( int  length,  int  listsize);
 41      Status ListInsert( int  i,ElemType e);
 42       //  合并两个非递减线性表
 43      Status ListUnion(CSqList &  La, CSqList &  Lb);
 44       //  输出顺序表里的元素
 45      Status ListPrint( void );
 46  private :
 47       //  用e返回L中的第i个元素的值
 48      Status GetElem( int  i, ElemType &  e);
 49  };
 50  /*  SqList.cpp CSqList类的定义文件 */
 51  #pragma  once
 52  #include  " Status.h "
 53  #include  " SqList.h "
 54  #include < iostream >
 55  using   namespace  std;
 56 
 57  CSqList::CSqList( void )
 58  {
 59       this -> L.elem  =  (ElemType * )malloc(LIST_INIT_SIZE * sizeof (ElemType));
 60       this -> L.length  =   0 ;
 61       this -> L.listsize  =  LIST_INIT_SIZE;
 62  }
 63 
 64  CSqList:: ~ CSqList( void )
 65  {
 66      free( this -> L.elem);
 67  }
 68 
 69  CSqList::CSqList( int  length,  int  listsize)
 70  {
 71       this -> L.elem  =  (ElemType * )malloc(listsize * sizeof (ElemType));
 72       this -> L.length  =  length;
 73       this -> L.listsize  =  listsize;
 74  }
 75 
 76  Status CSqList::ListInsert( int  i,ElemType e)
 77  {
 78       if (i < 1   ||  i > L.length  + 1 )
 79          exit(OVERFLOW);
 80       if (L.length  >=  L.listsize)
 81      {
 82          ElemType *  newbase  =  (ElemType * )realloc(L.elem,(L.listsize + LISTINCREMENT * sizeof (ElemType)));
 83           if ( ! newbase)
 84              exit(OVERFLOW);
 85          L.elem  =  newbase;
 86          L.listsize  +=  LISTINCREMENT;
 87      }
 88      ElemType  * =   & (L.elem[i - 1 ]);
 89       for (ElemType  * =   & (L.elem[L.length - 1 ]);p >= q; -- p)
 90           * (p + 1 =   * p;
 91       * =  e;
 92      L.length ++ ;
 93 
 94       return  OK;
 95  }
 96 
 97  //  合并两个非递减线性表
 98  Status CSqList::ListUnion(CSqList &  La, CSqList &  Lb)
 99  {
100      ElemType  * pa  =  La.L.elem, * pb  =  Lb.L.elem, * pc  =  L.elem;
101      ElemType *  pa_last  =  La.L.elem  +  La.L.length  - 1 ;
102      ElemType *  pb_last  =  Lb.L.elem  +  Lb.L.length  - 1 ;
103 
104       while (pa <= pa_last  &&  pb <= pb_last)
105      {
106           if ( * pa  <=   * pb)
107               * pc ++   =   * pa ++ ;
108           else
109               * pc ++   =   * pb ++ ;
110      }
111       while (pa  <=  pa_last)
112           * pc ++   =   * pa ++ ;
113       while (pb  <=  pb_last)
114           * pc ++   =   * pb ++ ;
115 
116       return  OK;
117  }
118 
119  //  输出顺序表里的元素
120  Status CSqList::ListPrint( void )
121  {
122      ElemType e;
123       for ( int  i = 0 ;i < L.length;i ++ )
124      {
125          GetElem(i,e);
126          cout << " NO. " << i << "     " << e << endl;
127      }
128 
129       return  OK;
130  }
131 
132      Status CSqList::GetElem( int  i, ElemType &  e)
133      {
134          e  =  L.elem[i];
135          
136           return  OK;
137      }
138  /*  
139  ///
140        Main.cpp 
141        main函数所在文件
142        NewSketcher
143        08.09.27
144        XP SP1 + VS2008 下编译通过.
145 
146  */
147  #pragma  once
148  #include < iostream >
149  #include  " SqList.h "
150  #include  " Status.h "
151  using   namespace  std;
152 
153  int  main()
154  {
155      CSqList La,Lb;
156      cout << " Please input the number(end by -1): " << endl;
157       int  i  =   1 ;
158       while ( true )
159      {
160          ElemType num  =   0 ;
161           // int i = 1;
162          cin >> num;
163           if (num  ==   - 1 )
164               break ;
165          La.ListInsert(i,num);
166          i ++ ;
167      }
168      La.ListPrint();
169 
170 
171      i  =   1 ;
172      cout << " Please input the number(end by -1): " << endl;
173       while ( true )
174      {
175          ElemType num  =   0 ;
176           // int i = 1;
177          cin >> num;
178           if (num  ==   - 1 )
179               break ;
180          Lb.ListInsert(i,num);
181          i ++ ;
182      }
183      Lb.ListPrint();
184      cout << endl;
185 
186       int  length  =  La.L.length  +  Lb.L.length;
187       int  listsize  =  length;
188      CSqList Lc(length,listsize);
189      Lc.ListUnion(La,Lb);  // 顺序表合并的算法都在这个函数里
190 
191      Lc.ListPrint();
192 
193       return   0 ;
194  }
195 
196 

 

故意不加析构函数...故意不用属性...其实还是有粗糙的地方,封装就有些不科学....

 

 

                                                                          ------------by   NewKetcher

                                                                               Time:   08.10.05     22:55

转载于:https://www.cnblogs.com/ns517/archive/2008/10/05/1304361.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 顺序存储结构中数据中数据元素之间逻辑关系是由( )示的,链接存储结构中的数据元素之间的逻辑关系是由( )示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链中删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链 B. 双链 C. 带头结点的双循环链 D. 单循环链 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序L中第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链中p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType示不确定的数据类型 int length; // length线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=&rsquo;#&rsquo;; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值