线性表的顺序表示和实现

  1 #include<bits/stdc++.h>//c++万能头文件,写了这个其他头文件不用写 
  2 using namespace std;//使用名字空间,你不用管 
  3 
  4 #define List_Init_Size 100
  5 #define List_Inrement 10
  6 #define pr printf
  7 
  8 struct List{
  9     int *elem;//表的基地址 
 10     int length;//当前表长 
 11     int listsize;//当前表的容量 
 12 };
 13 
 14 //初始化线性表 
 15 bool InitList(List &L)
 16 {
 17     L.elem = (int *)malloc(List_Init_Size*sizeof(int));
 18     if(L.elem == NULL) exit(-1); //如果分配内存失败,就退出程序
 19     
 20     L.length = 0;
 21     L.listsize = 100; 
 22     return 1;
 23 } 
 24 
 25 //线性表插入元素 
 26 bool ListInsert(List &L,int i,int e)
 27 {
 28     if(i < 1 || i > L.length + 1) 
 29     {
 30         puts("Oh! Baby! The insertion position is invalid. Please re-enter the insertion position!");
 31         return 0;
 32     } 
 33     //需要清楚,下标是从0开始,
 34     //该函数实现的是在第i个元素前面插入一个元素,所有必须判断插入位置的合法性 
 35     //除了插在最后的元素后面外其他都需要把后面的元素往后移动
 36     
 37     if(L.length >= L.listsize)
 38     {
 39         //表的容量不够,因为插入的会增加一个元素所以有等号 。
 40         //增加容量
 41         int *newbase = (int *)realloc(L.elem,(List_Init_Size + List_Inrement)*sizeof(int));
 42         //realloc函数用来为ptr重新分配大小为size的一块内存,看似很简单,
 43         //在使用过程中却会发生各种错误。
 44         //函数形式为:
 45         //void * realloc ( void * ptr, size_t new_size ); 
 46         
 47         if(newbase == NULL)
 48         {
 49             //意味着重新分配内存失败
 50             puts("Sorry Baby! Reassigning memory failed!");
 51             exit(-1);//退出程序 
 52         }
 53         L.elem = newbase;
 54         L.listsize += List_Inrement;
 55     } 
 56     
 57     int *q = L.elem + (i-1);//获取第i个元素的地址 
 58     
 59     //第i的后面元素往后移动 
 60     for(int *p = L.elem + (L.length-1); p >= q; p--) 
 61     *(p+1) = *p;
 62     
 63     *q = e;
 64     ++L.length;//添加一个元素,长度加一 
 65     return 1;
 66 }
 67 
 68 //线性表删除元素 
 69 bool List_Delete(List &L,int i,int &e)
 70 {
 71     //先判断位置是否合法
 72     if(i < 1 || i > L.length) 
 73     {
 74         puts("Oh baby! The deletion location is illegal, please re-enter!");
 75         return 0;
 76     }
 77     int *q = L.elem + (L.length - 1);
 78     int *p = L.elem + (i-1); 
 79     e = *p;
 80     ++p;//这里是为了把第I后面的元素往前移动,此时的p为第i+1个元素的位置 
 81     for(p; p <= q; p++)
 82     *(p-1) = *p;
 83     --L.length;//删除一个元素,长度减一
 84     return 1; 
 85 } 
 86 
 87 //获取线性表当前的元素个数
 88 int getListLength(List &L)
 89 {
 90     return L.length;
 91 } 
 92 
 93 //获取线性表元素 
 94 bool getElem(List &L,int q,int &e)
 95 {
 96     if(q < 1 || q > L.length)
 97     {
 98         puts("Oh! Baby! The  position is invalid. Please re-enter the position!");
 99         return 0;
100     }
101     int *p = L.elem;
102     e = *(p + (q - 1)); 
103     return 1;
104 }
105 
106 //遍历线性表 
107 void List_Traver(List &L)
108 {
109     puts("Let's do it! Traver! Traver_List!"); 
110     int *p = L.elem;
111     for(p; p <= L.elem + (L.length - 1); p++)
112     cout << *p << " ";
113     puts("");
114 }
115  
116 //获取要查找的第一个满足某个比较关系的元素位置,我就判断大于,小于,等于吧 
117 int LocateElem(List &L,int e,string s)
118 {
119     int *p = L.elem;
120     int len = L.length;
121     int now = 1;
122        if(s == ">")
123     {
124            for(p ;p <= L.elem + (len - 1);p++)
125            {
126                if(*p > e)
127                {
128                    return  now;
129             }
130             now++;
131         }
132         puts("Oh baby! Sorry, there is no such number!");
133         return 0;
134     } 
135     else if(s == "<")
136     {
137         for(p ;p <= L.elem + (len - 1);p++)
138            {
139                if(*p < e)
140                {
141                    return  now;
142             }
143             now++;
144         }
145         puts("Oh baby! Sorry, there is no such number!");
146         return 0;
147     }
148     else{
149         for(p ;p <= L.elem + (len - 1);p++)
150            {
151                if(*p == e)
152                {
153                    return  now;
154             }
155             now++;
156         }
157         puts("Oh baby! Sorry, there is no such number!");
158         return 0;
159     }
160 } 
161 //销毁线性表,清除堆内存。防止内存泄露 
162 void List_Destroed(List &L)
163 {
164     int *p;
165     //只能从后面销毁 
166     for(p = L.elem + (L.length - 1); p >= L.elem; p--)
167     {
168         free(p); 
169     }
170 }
171 
172 
173 int main()
174 {
175     List L;
176     int ok = InitList(L);
177     if(ok)
178     {
179         puts("Oh Yes! Linear table created successfully!");
180         cout << "base address = " << L.elem << endl;
181         cout << "L.length =  " << L.length << endl;
182         cout << "L.listsize = "<< L.listsize << endl;
183     } 
184     
185     for(int i = 1;i <= 10;i++)
186     {
187         if(ListInsert(L,i,i))
188         {
189             puts("GO");
190         }
191         else {
192             puts("Something Wrong!");
193             exit(-1);
194         }
195     }
196     
197     puts("Check the creation of a linear table");
198     cout << "base address = " << L.elem << endl;
199     cout << "L.length =  " << L.length << endl;
200     cout << "L.listsize = "<< L.listsize << endl;
201     
202     List_Traver(L);
203     
204     int selem;
205     bool flag = getElem(L,7,selem);
206     if(flag)
207     {
208         cout << "7th number is equal to " << selem << endl;
209     }
210     int pos = LocateElem(L,5,"<");
211     if(pos) {
212         cout << pos << endl;
213     }
214     
215     pos = LocateElem(L,5,"=");
216     if(pos) {
217         cout << pos << endl;
218     }
219     
220     pos = LocateElem(L,5,">");
221     if(pos) {
222         cout << pos << endl;
223     }
224     
225     cout << "sizeof(L) = " << sizeof(L) << endl;
226     List_Destroed(L);//销毁 
227     cout << "sizeof(L) = " << sizeof(L) << endl;//检查是否销毁成功,如果成功,
228     //下面的语句就不执行 ,因为销毁之后不可用了。 
229     List_Traver(L); 
230     return 0;
231 }
原文地址:https://www.cnblogs.com/mch5201314/p/11612207.html