最近在复习数据结构,用的书是清华学严蔚敏老师的经典教材,书上的代码需要自己全敲一遍方便记忆,然后想偷懒,就从网上找了好几个别人的代码,想对照着来打,结果代码在VS2017中老是报错,一直无法编译通过,觉得可能是编译器的问题,毕竟人家的代码是写给Turbo C2.0的,就换成VC++6.0,一跑还是报各种错误,最终只好用TC2.0跑,结果是代码是正常的,TC上跑的很欢畅,但是,中文是不支持的,所以,那就是输出一堆乱码。
本着发现问题,解决问题的正确人生态度,在牺牲掉一些本来就不多的脑细胞后,终于把问题解决掉,让C代码无压力的在VC60和VS上跑的无比欢畅,具体请看下面的操作:
0x01 先看C的代码
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define list_init_size 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
Status InitList_Sq(SqList &L){
//构造一个空的线性表L
L.elem =(ElemType * )malloc(list_init_size*sizeof(ElemType));
if(!L.elem )exit(OVERFLOW);//存储分配失败
L.length =0; //空表长度为0
L.listsize =list_init_size;//初始存储容量
return OK;
}//Initlist_Sq
Status ListInsert_Sq(SqList &L,int i,ElemType e){
//在顺序线性表L中第i个位置之前插入新的元素e,
//i的合法值为1<=i<=ListLength_Sq(L)+1
ElemType *p,*q,*newbase; //定义指针
if(i<1||i>L.length +1)
return ERROR; //i值不合法
if(L.length >=L.listsize ){ //当前存储空间已满,增加分配
newbase=(ElemType * )realloc(L.elem ,(L.listsize +LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW); //存储分配失败
L.elem =newbase; //新基址
L.listsize +=LISTINCREMENT; //增加存储容量
}
q=&(L.elem [i-1]); //q为插入位置
for(p=&(L.elem [L.length -1]);p>=q;--p)
*(p+1)=*p; //插入位置及之后的元素右移
*q=e; //插入e
++L.length ; //表长增1
return OK;
}//ListInsert_Sq
Status ListDelete_Sq(SqList &L,int i,ElemType &e){
//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1<=i<=ListLength_Sq(L)
ElemType *p,*q; //定义指针
if((i<1) || (i>L.length ))
return ERROR; //i值不合法
p=&(L.elem [i-1]); //p为被删除元素的位置
e=*p; //被删除元素的值赋给e
q=L.elem +L.length -1; //表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p; //被删除元素之后的元素左移
--L.length ; //表长减1
return OK;
}//ListDelete_sq
void display(SqList L)
{ //定义for循环函数
int i;
for(i=0;i<=L.length -1;i++)
printf("%d\n",L.elem [i]);
}
int LocateElem_Sq(SqList L,ElemType e)
{
//在顺序线性表L中查找第1个值与e满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回0
ElemType *p;
int i=1; //i的初值为第一个元素的位序
p=L.elem ; //p的初值为第一个元素的存储位置
while(i<=L.length && *p++!=e) ++i;
if(i<=L.length) return i;
else return 0;
}//LocateElem_Sq
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc ){
//已知顺序线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按非递减排列
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem ;
pb=Lb.elem ;
Lc.listsize =Lc.length =La.length +Lb.length ;
pc=Lc.elem =(ElemType *)malloc(Lc.listsize *sizeof(ElemType));
if(!Lc.elem )exit(OVERFLOW); //存储分配失败
pa_last=La.elem +La.length -1;
pb_last=Lb.elem +Lb.length -1;
while(pa<=pa_last && pb<=pb_last)
{
//归并
if(*pa<=*pb)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last) *pc++=*pa++; //插入La的剩余元素
while(pb<=pb_last) *pc++=*pb++; //插入Lb的剩余元素
}//MergeList_Sq
void main()
{
/*
SqList L;//定义线性表
InitList_Sq(L);//调用空表
//插入数据
ListInsert_Sq(L,1,10);
ListInsert_Sq(L,2,20);
ListInsert_Sq(L,1,30);
ListInsert_Sq(L,3,40);
printf("插入后:\n");
display(L);//调用循环函数
ListInsert_Sq(L,3,100);//在L表第三个位置插入100
printf("插入后:\n");
display(L);
ElemType e;//定义e
ListDelete_Sq(L,3,e);//删除L表的第三个元素,用e表示
printf("删除后:\n");
display(L);
printf("被删除元素:%d\n\n\n\n",e);
*/
SqList La,Lb,Lc;
InitList_Sq(La);
ListInsert_Sq(La,1,3);
ListInsert_Sq(La,2,5);
ListInsert_Sq(La,3,8);
ListInsert_Sq(La,4,11);
printf("La插入后:\n");
display(La);
InitList_Sq(Lb);
ListInsert_Sq(Lb,1,2);
ListInsert_Sq(Lb,2,6);
ListInsert_Sq(Lb,3,8);
ListInsert_Sq(Lb,4,9);
ListInsert_Sq(Lb,5,11);
ListInsert_Sq(Lb,6,15);
ListInsert_Sq(Lb,7,20);
printf("Lb插入后:\n");
display(Lb);
MergeList_Sq(La,Lb,Lc);
printf("归并后:\n");
display(Lc);
printf("\n");
int a=LocateElem_Sq( Lc, 5);
printf("%d\n",a);
}
这是关于线性表的的练习,在TC中跑的很好,有同学说TC在win764下没法安装,一会我给你个不安装可以直接运行的。
0x02 VC++6.0
创建一个标准的win32控制台程序:
代码直接复制到VC6中,会报下图的错误:
不期的文件末尾,直观感觉应该是包含文件有问题,那就在#include那里开始注释大法,果然,注释掉不报这个错误了,变成各种未定义,那就是说注释掉了没用的,但也没有引进有用的头文件,果断引入stdafx.h和iostream这两个基础头,好了,万事大吉,看下图。
0x03 VS2017
创建一个VS中的C++Hello程序:
代码直接复制到VS中,会报下图的错误(开始时还报本地函数非法):
根据VC中的经验修改包含的头文件为:
#include "pch.h"
#include <iostream>
然后就顺利生成,点运行,如下图:
0x04 总结
从C到C++来了两个加号,从C++到C#又多了两个加号,但本质上他们还是C家的人,所以传承上是没问题的,只是在头文件结构发生了很大变化,只要因时而动,都能顺利解决掉!