废话不多说,也没时间说。今年6月前着重数据结构。

详细看代码,方便。

代码个人敲的,若有错误,敬请指正。

 

  1. #include<iostream>  
  2. #define MaxSize 10  
  3. #define Increasment 5  
  4. using namespace std;  
  5.  
  6. typedef struct{        //动态顺序表结构  
  7. int *elem;  
  8. int length;  
  9. int ListSize;  
  10. }SqList;    
  11.  
  12. void InitList(SqList *L);                        //初始化一个顺序表  
  13. void InsertList(SqList *L,int Pos,int elem);    //在顺序表L中的位置Pos插入元素elem  
  14. void Print(SqList *L);                          //打印顺序表L中的元素,全打印  
  15. void VirValue(SqList *L, int sPos, int ePos);   //把顺序表L中位置StartPos到EndPos位置的元素置0  
  16. void Delete(SqList *L,int Pos);                 //删除顺序表L中pos位置的元素  
  17.  
  18. int main()  
  19. {  
  20.     int iPos,iElem;  
  21.     int Confirm;  
  22.     SqList L;                                     
  23.     /*postfix-expression . identifier  
  24.       postfix-expression represents a value of struct or union type,   
  25.      postfix-expression –> identifier  
  26.      postfix-expression represents a pointer to a structure or union,  
  27.      */ 
  28.     InitList( &L );   
  29.     cout << "Try to insert or delete an element?" << endl  
  30.          << "1 for insert an element" << endl  
  31.          << "2 for delete an element" << endl  
  32.          << "CTRL+D for quit " << endl;  
  33.     while(  cin >> Confirm )                            //ctrl + d 结束输入,跳出整个while循环  
  34.     {  
  35.         switch(Confirm)  
  36.         {  
  37.         case 1: {  
  38.                 cout << "Input Position and Element" << endl;  
  39.                 cin >> iPos >> iElem;  
  40.                 InsertList(&L, iPos, iElem);  
  41.                 cout << "Sequence\tMEM_addr\t\tSize\t\tElement" << endl;     
  42.                 Print( &L );  
  43.                 }  
  44.                 break;  
  45.         case 2: {  
  46.                 cout << "Input Position" << endl;  
  47.                 cin >> iPos;  
  48.                 Delete(&L,iPos);  
  49.                 cout << "Sequence\tMEM_addr\t\tSize\t\tElement" << endl;     
  50.                 Print( &L );  
  51.                 }  
  52.                 break;  
  53.         default:  
  54.             cout << "Non-existed options!" << endl;  
  55.                 break;  
  56.         }  
  57.      }  
  58.     cout << "Cancel,Current Sequence is bellow" << endl;    
  59.     cout << "Sequence\tMEM_addr\t\tSize\t\tElement" << endl;     
  60.     Print( &L );  
  61.     return 0;    
  62. }  
  63.  
  64. void InitList(SqList *L)  
  65. {  
  66.      L -> elem = (int *)malloc(MaxSize * sizeof(int));//分配内存空间,把空间首地址赋给L的成员elem  
  67.                                                       //分配成功则返回自己指定的类型(int *),若无指定则返回void指针  
  68.                                                       //分配失败则返回NULL  
  69.      if(!L -> elem)  
  70.      {   
  71.            cout << "Initialized failed" << endl;  
  72.            exit(0);  
  73.      }  
  74.      else   
  75.            cout << "Initialized successfully" << endl;  
  76.      cout << "Sequence\tMEM_addr\t\tSize\t\tElement" << endl;  
  77.      L -> length = 0;  
  78.      L -> ListSize = MaxSize;  
  79.      VirValue( L, 0, L->ListSize);                   //原函数声明为void VirValue(SqList *L, int sPos, int ePos);  
  80.                                                      //而此处赋给的参数却是 L 而非 *L 是因为这里的参数不是从main中传来的,而是从InitList中传的  
  81.      Print( L );  
  82. }  
  83.  
  84. void InsertList(SqList *L,int Pos,int elem)  
  85. {  
  86.     int *base, *insertPtr, *p;  
  87.     if (Pos < 1 || Pos > L -> length + 1)   
  88.        {  
  89.        cout << "Error:Position is illegal!" << endl;  
  90.       // exit(0);                                        //和return区别见末尾,搞笑,这里如果exit了,那程序就结束了  
  91.                                                          //根本就脱离了main中while循环的目的。disgusting  
  92.        }  
  93.     if (L->length >= L->ListSize)  
  94.     {  
  95.         base = (int *)realloc( L->elem,(L->ListSize + Increasment) * sizeof(int) );  //realloc malloc 见末尾  
  96.         L->elem = base;  
  97.         L->ListSize += Increasment;  
  98.     }  
  99.     VirValue( L, L->length, L->ListSize);             //把刚多分配的内存地址数据赋零  
  100.     insertPtr = &(L->elem[Pos-1]);  
  101.     for (p = &( L->elem[L->length-1] ); p >= insertPtr; p--)  //把插入点以后的数据向后移动一个位置,给要插入的元素腾出空间来  
  102.     {  
  103.         *(p + 1) = *p;  
  104.     }     
  105.     *insertPtr = elem;  
  106.     L -> length++;  
  107. }  
  108.  
  109. void Delete(SqList *L,int Pos)  
  110. {  
  111.      if(Pos < 1 || Pos > L->length)   
  112.      {  
  113.          cout << "Error:Position is illegal!" << endl;  
  114.      }  
  115.      for (Pos; Pos < L->length; ++Pos)  
  116.      {  
  117.          L->elem[Pos-1] = L->elem[Pos];             //把要删除点后面的元素朝前移动一个单元。循环完成后最末元素与倒数第二个元素一样  
  118.      }    
  119.      L->elem[Pos] = 0;                              //把最末元素赋0处理   
  120.      L->length--;  
  121. }  
  122.  
  123. void Print(SqList *L)  
  124. {  
  125.      for (int i = 0; i < L -> ListSize; i++)  
  126.      {  
  127.          cout << i+1 << "\t\t" << &(L -> elem[i]) << "\t\t" //L -> elem指向顺序表元素的首地址,存储的是顺序表第一个元素  
  128.                                                           //而 L -> elem[i]则指向第i个元素的地址, &(L -> elem[i])则代表这个地址中所存的数据  
  129.               << sizeof(L -> elem[i]) << "\t\t"         //这行有点多余,都是一样的大小,int型(和编译器有关)   
  130.               << L -> elem[i] << endl;  
  131.      }  
  132. }  
  133.  
  134. void VirValue(SqList *L, int sPos, int ePos)   
  135. {  
  136.     for (int i = sPos; i < ePos; i++)  
  137.     {  
  138.         L->elem[i] = 0;  
  139.     }  
  140. }  
  141.  
  142. /*  
  143. 1.return exit  
  144.     exit()子程序终止函数与return()函数的差别  
  145.  
  146.   在main函数中我们通常使用return (0);这样的方式返回一个值。   
  147.  
  148.   但这是限定在非void情况下的也就是void main()这样的形式。   
  149.  
  150.   exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统。   
  151.  
  152.   但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且exit不需要考虑类型,exit(1)等价于return (1)   
  153.  
  154. #include <iostream>    
  155. #include <string>    
  156. using namespace std;    
  157.     
  158. int main()      
  159. {    
  160.     exit (1);//等价于return (1);    
  161.  
  162. 2.realloc malloc  
  163.  
  164. C语言的标准内存分配函数:malloc,calloc,realloc,free等。   
  165. malloc与calloc的区别为1块与n块的区别:   
  166. malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。   
  167. calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。   
  168. realloc调用形式为(类型*)realloc(*ptr,size):将ptr内存大小增大到size。   
  169. free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。   
  170. C++中为new/delete函数。   
  171.  
  172. realloc详解  
  173.     1. realloc失败的时候,返回NULL  
  174.   2. realloc失败的时候,原来的内存不改变,不会释放也不会移动  
  175.   3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址  
  176.   4. 如果size为0,效果等同于free()  
  177.   5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的  
  178.   6.传递给realloc的指针可以为空,等同于malloc。  
  179. */