大话数据结构-顺序线性表

大话数据结构书中的顺序线性表

  1 #include  
  2 
  3 #define MAXSIZE 20 //存储空间 
  4 #define OK 1
  5 #define ERROR 0
  6 #define TRUE 1
  7 #define FALSE 0
  8 
  9 typedef int Status;        //函数返回的状态码 
 10 typedef int ElemType;     //线路表的数据类型
 11 
 12 typedef struct {
 13     ElemType data[MAXSIZE];        //数组,线性表中的数据 
 14     int length;                    //
 15 } SqList;
 16 
 17  //初始化线性表
 18  Status InitList(SqList *L){
 19      L->length = 0;
 20      return OK;
 21  } 
 22  
 23  //若线性表为空 返回TRue,否则返回False 
 24 Status ListEmpty(SqList L){
 25     if(L.length == 0){
 26         return TRUE;
 27     }else{
 28         return FALSE;
 29     }
 30 }
 31 /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
 32 Status ClearList(SqList *L){
 33     L->length = 0;
 34     return OK;
 35 }
 36 /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
 37 int ListLength(SqList L){
 38     return L.length;
 39 }
 40 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
 41 /* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
 42 Status GetElem(SqList L,int i,ElemType *e){
 43     if(ListLength(L) == 0 || i < 1 || i > ListLength(L)){
 44         return ERROR;
 45     }
 46     *e = L.data[i-1];
 47     return OK;
 48 }
 49 /* 初始条件:顺序线性表L已存在 */
 50 /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
 51 /* 若这样的数据元素不存在,则返回值为0 */
 52 int LocateElem(SqList L,ElemType e){
 53     int i;
 54     if(L.length == 0) return 0;
 55     for(i=0;i){
 56         if(L.data[i] == e){
 57             return i+1;
 58         }
 59     }
 60     return 0;    
 61 }
 62 /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
 63 /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
 64 Status ListInsert(SqList *L,int i,ElemType e)
 65 {
 66     //i在1到Length+1之间 
 67     if(i < 1 || i > L->length + 1) return ERROR; 
 68     //如果Length已经是MAXSIZE了则不能插入 
 69     if(L->length == MAXSIZE) return ERROR;
 70     //如果是length+1则直接附加到后面
 71     if(i == L->length + 1){
 72         L->data[i-1] = e;
 73         L->length++;
 74         return OK; 
 75     }
 76     //在现有的线性表的中间插入,插入位置后的元素要向后移一位 
 77     int j;
 78     for(j=L->length-1;j>=i-1;j--){
 79         L->data[j+1] = L->data[j];
 80     }
 81     L->data[i-1] = e;
 82     L->length++;
 83     return OK;
 84 }
 85  Status ListDelete(SqList *L,int i,ElemType *e) {
 86      if(L->length == 0 || i < 1 || i > L->length) return ERROR;
 87      *e = L->data[i-1];
 88      //如果不是最后的位置则其之后的所有记录需要前进一个元素 
 89     if( i < L->length){
 90          int j;
 91         for(j=i;jlength;j++){
 92             L->data[j-1] = L->data[j];
 93         } 
 94     }
 95      L->length--;
 96      return OK;
 97  }
 98  //打印 
 99  void Print(ElemType e){
100      printf("%d\n",e);
101  }
102  //打印线性表 
103  Status ListTraverse(SqList L){
104  int i;
105  for(i=0;i){
106      Print(L.data[i]);
107  }
108  return OK;
109 }
110 //两个线性表取交集
111 void UnionL(SqList *a,SqList b){
112     int i;
113     int aLen = a->length;
114     ElemType e;
115     for(i=0;i){
116         e = b.data[i];
117         if(!LocateElem(*a,e)){
118             ListInsert(a,++aLen,e);
119         }
120     }
121 } 
122  int main(void)
123  {
124      SqList L;
125     SqList Lb;
126     
127     ElemType e;
128     Status i;
129     int j,k;
130     i=InitList(&L);
131     printf("初始化L后:L.length=%d\n",L.length);
132     for(j=1;j<=5;j++)
133             i=ListInsert(&L,1,j);
134     printf("在L的表头依次插入1~5后:L.data=");
135     ListTraverse(L); 
136 
137     printf("L.length=%d \n",L.length);
138     i=ListEmpty(L);
139     printf("L是否空:i=%d(1:是 0:否)\n",i);
140 
141     i=ClearList(&L);
142     printf("清空L后:L.length=%d\n",L.length);
143     i=ListEmpty(L);
144     printf("L是否空:i=%d(1:是 0:否)\n",i);
145 
146     for(j=1;j<=10;j++)
147             ListInsert(&L,j,j);
148     printf("在L的表尾依次插入1~10后:L.data=");
149     ListTraverse(L); 
150 
151     printf("L.length=%d \n",L.length);
152 
153     ListInsert(&L,1,0);
154     printf("在L的表头插入0后:L.data=");
155     ListTraverse(L); 
156     printf("L.length=%d \n",L.length);
157 
158     GetElem(L,5,&e);
159     printf("第5个元素的值为:%d\n",e);
160     for(j=3;j<=4;j++)
161     {
162             k=LocateElem(L,j);
163             if(k)
164                     printf("第%d个元素的值为%d\n",k,j);
165             else
166                     printf("没有值为%d的元素\n",j);
167     }
168     
169 
170     k=ListLength(L); /* k为表长 */
171     for(j=k+1;j>=k;j--)
172     {
173             i=ListDelete(&L,j,&e); /* 删除第j个数据 */
174             if(i==ERROR)
175                     printf("删除第%d个数据失败\n",j);
176             else
177                     printf("删除第%d个的元素值为:%d\n",j,e);
178     }
179     printf("依次输出L的元素:");
180     ListTraverse(L); 
181 
182     j=5;
183     ListDelete(&L,j,&e); /* 删除第5个数据 */
184     printf("删除第%d个的元素值为:%d\n",j,e);
185 
186     printf("依次输出L的元素:");
187     ListTraverse(L); 
188 
189     //构造一个有10个数的Lb
190     i=InitList(&Lb);
191     for(j=6;j<=15;j++)
192             i=ListInsert(&Lb,1,j);
193 
194     UnionL(&L,Lb);
195 
196     printf("依次输出合并了Lb的L的元素:");
197     ListTraverse(L); 
198 
199     return 0;
200      return 0;
201  }

 

转载于:https://www.cnblogs.com/xxyxpy/p/5374139.html

你可能感兴趣的:(大话数据结构-顺序线性表)