每天一算法(一)——用链表实现加减乘运算

用链表实现加减乘运算

// resultW.cpp : 定义控制台应用程序的入口点。
#include "F:\HU\resultW\resultW\stdafx.h"
#include <assert.h>
#include <stdlib.h>
#include <cstring>
#include <iostream>

using namespace std;
#define MAXSIZE_T 256

typedef struct operand //运算数
{
	int data;
	struct operand *next;
}NodeNum;

typedef struct operation//运算符
{
	char operate;
	struct operation *next;
}NodeSign;

NodeNum  *HeadNum, *preNum,*CurNum, *addNum;
NodeSign  *HeadSign,*preSign,*CurSign, *addSign;

int GetResult(char *input)
{
	char substr[10];
	assert(input);
	int k = 0,sum = 0;
	memset(substr,0,10);

	HeadNum = (NodeNum*)malloc(sizeof(NodeNum)); //number list head
	HeadSign = (NodeSign*)malloc(sizeof(NodeSign));//sign list head
	CurNum = HeadNum;
	CurSign = HeadSign;

	while (*input != '\0')
	{
		if (*input == '+' || *input == '-'|| *input == '='||*input == '*')
		{
			int cc = atoi(substr);//char convert to number

			addNum = (NodeNum *)malloc(sizeof(NodeNum));
			addNum->data = cc;
			CurNum->next = addNum;
			CurNum = addNum;
			
			addSign = (NodeSign *)malloc(sizeof(NodeSign));
			addSign->operate = *input;
			CurSign->next = addSign;
			CurSign = addSign;

			memset(substr,0,10);	
			input++;
			k = 0;
		}
		else if(*input >= '0' && *input <= '9')
		{
			substr[k++] = *input;//get 
			input++;
		}	
		else
		{
			cout<<"input wrong data!"<<endl;
			return 0;
		}			
	}
	/**/
	preNum = HeadNum->next;
	CurNum = preNum->next;
	preSign = HeadSign;
	CurSign = preSign->next;
	while(CurSign->operate != '=')//operate multiplication first
	{
       if (CurSign->operate == '*')
       {
		   preNum->data = preNum->data * CurNum->data;
		   preNum->next = CurNum->next;
		   free(CurNum);
		   CurNum = preNum->next;//
		   preSign->next = CurSign->next;
		   free(CurSign);
		   CurSign = preSign->next;//
       }
	   else
	   {	
		   preSign = CurSign;
		   CurSign = CurSign->next;
		   preNum = CurNum;
		   CurNum = CurNum->next;
	   }
	}
	/**/
	preNum = HeadNum->next;
	CurNum = preNum->next;
	preSign = HeadSign;
	CurSign = preSign->next;
	if (CurSign->operate == '=')
	{
		sum = preNum->data;
		free(preNum);
	}else
	{
		while(CurSign->operate != '=')//operate plus minus second
		{
			if(CurSign->operate == '+')
			{
				CurNum->data = preNum->data + CurNum->data;
			
			}else/* operation '-'*/
			{
				CurNum->data = preNum->data - CurNum->data;
			}
			sum = CurNum->data;
			free(preNum);
			preNum = CurNum;
			CurNum = CurNum->next;

			//preSign = CurSign;
			preSign->next = CurSign->next;
			free(CurSign);
			CurSign = preSign->next;		
		}
	}
	
	free(CurSign);
	//free(CurNum);
	free(HeadNum);
	free(HeadSign);
	return sum;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int count = 0, k = 0;
	char cc;
	char input[MAXSIZE_T];
	memset(input, 0, MAXSIZE_T);

	while((cc = getchar()) != 'a' )//program exits when get char 'a'
	{
		if (cc != '=')
		{
			input[k++] = cc;
		} 
		else
		{
			input[k] = '=';
			count = GetResult(input);
			cout<<"result is:"<<count<<endl;
			memset(input,0,MAXSIZE_T);
			k = 0;
			cout<<"please put expression:"<<endl;
			cc = getchar();
		}
	}

	return 0;
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值