今天写一个简单的线性表时,用Mingw中的g++编译、调试、运行时发现一个奇怪的现象:程序的执行顺序与实际编写顺序不一致。
编译环境:代码编写 win7下 editplus + Mingw 4.3.3 + g++
代码片段如下:
1 //function: create a list 2 //time:2013-11-8 23:38 3 //filename:list_01.cpp 4 //author :alex 5 #include <stdio.h> 6 #define MAXSIZE 20 //存储空间初始大小 7 #define OK 1 //success 8 #define ERROR 0 // failed 9 #define TRUE 1 10 #define FALSE 0 11 typedef int Status;// 返回函数结果状态 12 typedef int ElemType;//int 型 ElemType 13 //定义线性表的结构体 14 typedef struct 15 { 16 ElemType data[MAXSIZE];//data[20] 17 int length;//线性表当前长度 18 }SqList; 19 //初始化链表0 20 Status InitList(SqList *L) 21 { 22 L->length=0;//指定长度为0 23 printf("初始化完成...\n"); 24 return OK; 25 } 26 //打印出链表的内容 27 Status PrintList(SqList *L) 28 { 29 if(L->length > 0) 30 { 31 printf("链表元素如下:\n"); 32 for(int i=0;i < L->length;i++) 33 printf("%d\t",L->data[i]); 34 return OK; 35 } 36 else 37 { 38 printf("L.length=%d",L->length); 39 return ERROR; 40 } 41 } 42 //取元素 O(1) 43 Status GetElem(SqList L,int i,ElemType *e) 44 { 45 if(L.length==0 || i<1 || i>L.length) 46 return ERROR; 47 *e=L.data[i-1];//直接取值data[i-1] 48 return OK; 49 } 50 //插入数据 为i第几个元素位置,从1开始 O(n) 51 Status ListInsert(SqList *L,int i,ElemType e) 52 { 53 int k; 54 if(L->length==MAXSIZE) //判断满否 55 return ERROR; 56 if(i<1 || i> L->length+1) //超出范围 57 return ERROR; 58 if(i< L->length) 59 { 60 for(k=L->length-1;k>=i-1;k--) 61 //将要插入位置后的数据元素向后移动一位 62 L->data[k+1]=L->data[k]; 63 } 64 L->data[i-1]=e;//插入新元素 65 L->length++; //线性表长度+1 66 return OK; 67 } 68 //删除数据 删除第i个位置元素,用e返回其值 O(n) 69 Status ListDelete(SqList *L,int i,ElemType *e) 70 { 71 int k; 72 if(L->length==0)//线性表为空 73 return ERROR; 74 if(i<1 || i> L->length)//删除位置超出 75 return ERROR; 76 *e=L->data[i-1]; //i位置元素取出 77 if(i< L->length) //位置适当 78 { 79 for(k=i;k < L->length;k++) 80 L->data[k-1]==L->data[k]; 81 } 82 L->length--; 83 return OK; 84 } 85 int main(int argc, char *argv[]) 86 { 87 int i,j,k; 88 printf("This is a list_demo:\n"); 89 SqList list; 90 //初始化链表list长度为5 91 InitList(&list); 92 //数组长度与链表长度的关系??? 93 //回显 94 printf("list.length=%d \n",list.length); 95 //插入元素 96 97 printf("插入5个元素\n"); 98 /* 99 for(i=0;i<5;i++) 100 { 101 scanf("%d",&k); 102 ListInsert(&list,i+1,k); 103 } 104 */ 105 i=0; 106 while (i<5) 107 { 108 scanf("%d",&k); 109 ListInsert(&list,i+1,k); 110 i++; 111 } 112 PrintList(&list); 113 return 0; 114 }
截图输出 需要先输入之后才执行main函数开始部分,奇怪哉???
然而在gdb调试输出时,却又是正确的,见下:
问题是怎样产生的尚不明确,猜测与Mingw下g++编译器有关,尚待调查中。。。。