练手
上代码
C语言
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
int InitList_Sq(SqList &L){
//构造线性表
L.elem = (ElemType *) malloc (LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(0);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return 1;
}
int ListLength(SqList L){
//返回表长
return L.length;
}
int ListSize(SqList L){
//返回容量
return L.listsize;
}
int GetElem(SqList L, int i, ElemType &e){
ElemType *p;
if(i<1 || i>ListLength(L)) return 0;//i不合法
p = &(L.elem[i-1]);
e = *p;//北山元素的值赋给e
return 0;
}
int LocateElem(SqList L, ElemType e){
//在顺序表中定位元素e
for(int i=0; i<ListLength(L); ++i){
if(L.elem[i] == e){
return ++i;
}
}
return 0;
}
int ListInsert_Sq(SqList &L, int i, ElemType e){
//在顺序表第i个元素前插入新元素e
//i的合法值为[1,length+1]
ElemType * newbase,*q,*p;
if(i<1 || i>ListLength(L)+1) return 0; //i不合法
if(L.length>=L.listsize){
//需要增加存储容量
newbase = (ElemType *) realloc (L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(0);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q = &(L.elem[i-1]);//q是插入位置
for(p=&L.elem[ListLength(L)-1]; p>=q; --p){
*(p+1) = *p; //插入位置以及之后元素右移
}
*q = e;//插入e
++L.length;//表长增1
return 1;
}
int ListDelete_Sq(SqList &L, int i, ElemType &e){
//在顺序表中删除第i个元素,并用e返回其值
//i的合法值为[1,length]
ElemType *p, *q;
if(i<1 || i>ListLength(L)) return 0;//i不合法
p = &(L.elem[i-1]);//p为被删除的位置
e = *p;//北山元素的值赋给e
q = L.elem+ListLength(L)-1; //表尾元素位置
for(++p; p<=q; ++p){
//被删元素后一个起一直到最后一个元素左移
*(p-1)=*p;
}
--L.length;
return 1;
}
int union_Sq(SqList &La, SqList Lb){
//将所有在Lb中但不在La中的数据元素插入到La中
int La_len,Lb_len;
ElemType e;
La_len = ListLength(La);
Lb_len = ListLength(Lb);
for(int i=1; i<=Lb_len; i++){
GetElem(Lb,i,e);
if(!LocateElem(La,e)) ListInsert_Sq(La, ++La_len, e);//L中不存在相同元素,则插入之
}
}
void Print_Sq(SqList L){
for(int i=0; i<ListLength(L); ++i){
printf("%d ",L.elem[i]);
}
}
int main(){
SqList La,Lb;
InitList_Sq(La);
InitList_Sq(Lb);
for(int i=1;i<=10;i++){
ListInsert_Sq(La,i,3*i+2);
}
for(int i=1;i<=10;i++){
ListInsert_Sq(Lb,i,2*i+3);
}
//测试 LocateElem(),定位La的每一个元素,输出1~10和10个0
for(int i=1;i<=20;i++){
printf("%d ",LocateElem(La,3*i+2));
}
//测试 union_Sq()
printf("\na:\n");
Print_Sq(La);
printf("\n");
printf("\nb:\n");
Print_Sq(Lb);
printf("\n");
union_Sq(La,Lb);
printf("\na:\n");
Print_Sq(La);
printf("\n");
//测试存储容量增加
printf("\nLb长度=%d , 容量=%d\n",ListLength(Lb),ListSize(Lb));
for(int i=ListLength(Lb)+1;i<=100;i++){
ListInsert_Sq(Lb,i,i);
}//此时正好满
printf("\nLb长度=%d , 容量=%d\n",ListLength(Lb),ListSize(Lb));
ListInsert_Sq(Lb,1,999);//此时容量加一个LISTINCREMENT
printf("\nLb长度=%d , 容量=%d\n",ListLength(Lb),ListSize(Lb));
}