TC2.0代码在VC++6.0及VS2017中正常运行

版权声明:原创的东西,转载时留个标记。 https://blog.csdn.net/laguoqing/article/details/83443169

       最近在复习数据结构,用的书是清华学严蔚敏老师的经典教材,书上的代码需要自己全敲一遍方便记忆,然后想偷懒,就从网上找了好几个别人的代码,想对照着来打,结果代码在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家的人,所以传承上是没问题的,只是在头文件结构发生了很大变化,只要因时而动,都能顺利解决掉!

猜你喜欢

转载自blog.csdn.net/laguoqing/article/details/83443169