//test.h
#ifndef _TEST_H #define _TEST_H #include <stdlib.h> #define MAXSIZE 50 struct DoubleList { int sqlist[MAXSIZE]; int key; int size; int data; } DLIST_S; typedef struct Node { int data; struct Node *plast; struct Node *pnext; } DNODE_S; #if 1 /* 双链表相关操作 */ /***************************************************************************** Description : 遍历打印链表的所有节点 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void PrintNode(DNODE_S **ppLinkList); /***************************************************************************** Description : 创建双链表,并把第一个节点的数值初始化为data Input Param : Output Param : 无 Return Value : 成功返回0,失败返回-1 *****************************************************************************/ int CreateDoubleLinkList(DNODE_S **ppLinkList, int data); /*获取链表中节点个数*/ /***************************************************************************** Description : 获取链表中节点个数 Input Param : Output Param : 无 Return Value : 返回节点个数 *****************************************************************************/ int GetListLength(DNODE_S **ppLinkList); /***************************************************************************** Description : 初始化一个新结点 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void InitNewNode(DNODE_S **ppNewNode, int data); /***************************************************************************** Description : 获取链表中的最后一个节点 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void GetLastNode(DNODE_S **ppLinkList, DNODE_S **pLastNode); /***************************************************************************** Description : 在链表第pos个位置插入数据等于data的节点 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void InsertNode(DNODE_S **ppLinkList, int pos, int data); /***************************************************************************** Description : 删除链表中第pos个节点 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void MoveNode(DNODE_S **ppLinkList, int pos); #endif #if 1 /* 数组和链表转换 */ /***************************************************************************** Description : 将数组写入链表中,链表中的数据的先后顺序和数组中的顺序要保持一致 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void IntToList(DNODE_S **ppLinkList, int *paiArray, int size); /***************************************************************************** Description : 将链表写入数组中,数组中的数据的先后顺序和链表中的顺序要保持一致 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void ListToInt(DNODE_S *pLinkList, int *paiArray); /***************************************************************************** Description : 将字符数组写入链表中,链表中的数据的先后顺序和数组中的顺序要保持一致 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void StringToList(DNODE_S **ppLinkList, const char *pcString); /***************************************************************************** Description : 将链表写入字符数组中,数组中的数据的先后顺序和链表中的顺序要保持一致 Input Param : Output Param : 无 Return Value : *****************************************************************************/ void ListToString(DNODE_S *pLinkList, char *pcString); #endif #if 1 /***************************************************************************** Description : 获取小数的位数,如果是整数返回0 Input Param : Output Param : 无 Return Value : *****************************************************************************/ int GetDecimalLength(const char *pcNum); /***************************************************************************** Description : 判断字符是否为合法数字 Input Param : Output Param : 无 Return Value : *****************************************************************************/ bool IsValidNum(char c); #endif #endif
//test.cpp
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <string.h> #include <string> #include "test.h" using namespace std; #define ERR -1 #define OK 0 #define TEST 1 #define POSITIVE_NUMBER 0 #define NEGATIVE_NUMBER 1 #if 1 void PrintNode(DNODE_S **ppLinkList) { DNODE_S *node = *ppLinkList; printf(" "); printf("%d ", node->data); while (node->pnext != NULL) { node = node->pnext; printf("%d ", node->data); } } int CreateDoubleLinkList(DNODE_S **ppLinkList, int data) { DNODE_S *pHeadNode; pHeadNode = (DNODE_S *)malloc(sizeof(DNODE_S)); if (NULL == pHeadNode) { return ERR; } pHeadNode->data = data; pHeadNode->plast = NULL; pHeadNode->pnext = NULL; *ppLinkList = pHeadNode; return OK; } int GetListLength(DNODE_S **ppLinkList) { int count = 1; DNODE_S *node = *ppLinkList; if (NULL == node) { return 0; } while (node->pnext != NULL) { node = node->pnext; count++; } return count; } void GetLastNode(DNODE_S **ppLinkList, DNODE_S **pLastNode) { DNODE_S *pTmpNode = *ppLinkList; *pLastNode = NULL; while (pTmpNode->pnext != NULL) { pTmpNode = pTmpNode->pnext; } *pLastNode = pTmpNode; } void InitNewNode(DNODE_S **ppNewNode, int data) { DNODE_S *pNewNode = NULL; /* 初始化新结点 */ pNewNode = (DNODE_S *)malloc(sizeof(DNODE_S)); if (NULL == pNewNode) { return; } pNewNode->data = data; pNewNode->plast = NULL; pNewNode->pnext = NULL; *ppNewNode = pNewNode; } void InsertNode(DNODE_S **ppLinkList, int pos, int data) { int index = 1; int iNodeNum = GetListLength(ppLinkList); DNODE_S *pPrevNode = *ppLinkList; DNODE_S *pNextNode = NULL; DNODE_S *pNewNode = NULL; if (pos > iNodeNum || pos < 0) { return; } /* 初始化新结点 */ InitNewNode(&pNewNode, data); /* 1、插入头部 */ if (0 == pos) { pPrevNode->plast = pNewNode; pNewNode->pnext = pPrevNode; *ppLinkList = pNewNode; return; } /* 找到插入位置 */ while (index != pos) { pPrevNode = pPrevNode->pnext; index++; } pNextNode = pPrevNode->pnext; /* 2、插入尾部 */ if (iNodeNum == pos) { pPrevNode->pnext = pNewNode; pNewNode->plast = pPrevNode; return; } /* 3、插入中间位置 */ pNewNode->pnext = pNextNode; pNewNode->plast = pPrevNode; pPrevNode->pnext = pNewNode; pNextNode->plast = pNewNode; } void MoveNode(DNODE_S **ppLinkList, int pos) { DNODE_S *node = *ppLinkList; DNODE_S *pPrevNode = NULL; DNODE_S *pNextNode = NULL; while(pos--) { node = node->pnext; } pPrevNode = node->plast; pNextNode = node->pnext; pPrevNode->pnext = pNextNode; pNextNode->plast = pPrevNode; free(node); } #endif #if 1 /* 数组和链表转换 */ void IntToList(DNODE_S **ppLinkList, int *paiArray, int size) { int j = 0; int data = 0; DNODE_S *s = *ppLinkList; s->data = *(paiArray + (size-1)); for(j = 2; j < (size+1); j++) { data = *(paiArray + (size-j)); InsertNode(ppLinkList, 0, data); } return; } void ListToInt(DNODE_S *pLinkList, int *paiArray) { int j = 0; DNODE_S *s = pLinkList; while(s != NULL) { *(paiArray + j) = s->data; s = s->pnext; j++; } return; } bool IsValidNum(char c) { if ('0' <= c && c <= '9') { return true; } return false; } void StringToList(DNODE_S **ppLinkList, const char *pcString) { int i = 0; int j = 0; int data = 0; int len = (int)strlen(pcString); DNODE_S *s = *ppLinkList; s->data = pcString[0] - '0'; for(i = 1, j = 1; i < len; i++) { if (IsValidNum(pcString[i])) { data = pcString[i] - '0'; InsertNode(ppLinkList, j, data); j++; } } return; } void ListToString(DNODE_S *pLinkList, char *pcString) { int j = 0; DNODE_S *s = pLinkList; while(s != NULL) { *(pcString + j) = s->data + '0'; s = s->pnext; j++; } return; } #endif #if 1 int CompareNum(char *pcNumA, char *pcNumB) { int lenA = (int)strlen(pcNumA); int lenB = (int)strlen(pcNumB); if (lenA > lenB) { return 1; } else if (lenA < lenB) { return -1; } else { return strcmp(pcNumA, pcNumB); } } int GetDecimalLength(const char *pcNum) { int i = 0; int len = (int)strlen(pcNum); while (pcNum[i] != '