数据结构——顺序表

顺序表静态存储
数组空间由编译器固定分配,程序执行结后此空间自动释放,可按照数组元素的下标(位置)存取任一元素的值,所化费时间相同。一旦数据空间占满,再加入新的数据就将产生
溢出,此时存储空间不能扩充,就会导致程序停止工作
1 //顺序表静态存储
  2 #define maxSize 100
  3 typedef int DataType;
  4 typedef struct
  5 {
  6     DataType data[maxSize];
  7     int n;
  8 }SeqList;
  9 
 10 


顺序表动态存储
通过动态存储分配的语句malloc或new动态分配的,一旦数据空间占满,可以另外再分配一块更大的空间,用以代换原来的存储空间,而达到扩充存储数组空间的目的
 11 //顺序表动态存储
 12 #define initSize 100
 13 typedef int DataType;
 14 typedef struct
 15 {
 16     DataType *data;
 17     int maxSize, n;
 18 }SeqList;
 19 //顺序表主要操作实现
 20 //顺序表的动态存储表示的初始化处理
 21 void initList(SeqList &L)
 22 {
 23     L.data = new DataType[initList];
 24     if(!L.data)
 25     {
 26         cerr<<"存储分配错误!\n";
 27         exit(1);
 28     }
 29     L.maxSize = initSize;
 30     L.n = 0;
 31 }
 32 //清空顺序表
 33 void clearList(SeqList& L)
 34 {
 35     L.n = 0;//顺序表当前长度置为0
 36 }
37 //计算顺序表长度
 38 void Length(SeqList)
 39 {
 40     return L.n;//返回顺序表的当前长度
 41 }
 42 //判表空否
 43 int ieEmpty(SeqList& L)
 44 {
 45     return (L.n == 0)?1:0;
 46 }
 47 //判表满否
 48 int is Full(SeqList)
 49 {
 50     return (L.n == L.maxSize)?1:0;
 51 }
 52 //顺序表查找算法
 53 int Search(SeqList& L, int i)//   在顺序表查找与值x匹配的位置,查找成功则函数返回该元素的位置,否则函数返回0
 54 {
 55     for(i = 1; i<=L.n; i++)
 56     {
 57         if(L.data[i-1] == x)//顺序查找
 58             return i;
 59     }
 60     return 0;//查找失败
 61 }
 62 //顺序表定位算法
 63 int Locate(SeqList& L, int i)//函数返回第i个元素的位置
 64 {
 65     if(i>1 && i<L.n)
 66         return i;
 67     else
 68         return 0;
 69 }
70 //顺序表复制算法
 71 int Copy(SeqList& L1, SeqList& L2)//L1,L2存在且L1为空,将L2复制到L1中
 72 {
 73     L1.maxSize = L2.maxSize;
 74     L1.n = L2.n;
 75     if(!L1.data)
 76     {
 77         L1.data = new DataType[L1.maxSize];//创建顺序表存储数组
 78         if(!L1.data)//链接stdlib.h和iostream.h
 79         {
 80             cout<<"内存分配错误!"<<endl;
 81             exit(1);
 82         }
 83     }
 84     for(int i=1; i<=L; i++)
 85     {
 86         L1.data[i-1] = L2.data[i-1];
 87     }
 88 }
 89 //顺序表插入算法
 90 int Insert(SeqList& L, int i;, DataType& x)
 91 {
 92     //将新元素插入到表中第i个位置,若插入成功函数返回1,否则返回0
 93     if(L.n == L.maxSize)//表满,不能插
 94         return 0;
 95     if(i<0 || i>L.n+1)//参数i不合理,不能插入
 96         return 0;
 97     for(int j=L.n; j>=i; j--)//依次后移,空出第i号位置
 98     {
 99         L.data[j] = L.data[j-1];
100     }
101     L.data[i-1] = x;//插入
102     L.n++;       //表长度加1
103     return 1;    //插入成功
104 }
105 //顺序表删除算法
106 int Remove(SeqList& L, int i, DataType& x)
107 {
108     //删除顺序表第i个元素,通过引用型参数x返回删除元素的值
109     //若删除成功则函数返回1,否则返回0
110     if(!L.n)//表空,不能删除
111         return 0;
112     if(i<0 || i>L.n)//参数i不合理,不能删除
113         return 0;
114     x = L.sata[i-1];//存被删元素的值
115     for(int j = i; j<L.n; j++)//依次前移,填补
116         L.data[j-1] = L.data[j];
117     L.n--;  //表长度减1
118     return 1;//删除成功
119 }
120 
121 
122 
123 
124 //举例
125 //集合的并运算的实现
126 void Merge(SeqList& LA, SeqList& LB)
127 {
128     //合并顺序表LA和LB,结果存于LA,重复元素只留一个
129     int n=Length(LA), m=Length(LB), i, k, x;
130     for(i=1; i<=m; i++)
131     {
132         x = LB.data[i-1];//在LB中取一元素
133         k = Search(LA, x);//在LA中查找它
134         if(k == 0)//若在LA中未找到则将它插入到LA中
135         {
136             Insert(LA, n+1, x);//插入到第n个元素后
137             n++;
138         }
139     }
140 }
141 //集合的交运算的实现
142 void Intersection(SeqList& LA, SeqList& LB)
143 {
144     //求顺序表LA和LB中的共有元素,结果存于LA
145     int n=Length(LA), m=Length(LB), i=1, k, x;
146     while(i <= n)
147     {
148         x = LA.data[i-1]; //在LA取一元素
149         k = Search(LB, x);//在LB中查找它
150         if(k == 0)//若在LB中未找到则从LA中删除它
151         {
152             Remove(LA, i, x);//在LA中删除它
153             n--;
154         }
155         else
156             i++;
157     }
158 }


猜你喜欢

转载自blog.csdn.net/csdn_wanziooo/article/details/77892940