链表

来源:互联网 发布:js作用域和this关键字 编辑:程序博客网 时间:2024/06/03 18:31

#include <stdlib.h>
#include <string>
#include "oj.h"

/******************************************************************************/
#define ARRAY_LENGTH        1000
S16 gNodeNum = 0;
Node *gstrList = NULL;
S8 aData[ARRAY_LENGTH];
S8 aResult[ARRAY_LENGTH];

/*****************************************************************************
函 数 名      : U32 DataRead(Node* pList,char *aData)
功能描述 : 完成从字符数组aData[]中读取所有数据并保存在链表中的功能
输入参数 :
输出参数 :
函数返回 : 读取数据成功返回PROC_OK,失败返回ERROR
修改日期 : 2010-08-11
修改人员 : 考生
修改内容 : 创建
*****************************************************************************/
U32 DataRead(Node* pList,char *aData)
{
    S16 i = 0;
    Node* pNodeTmp = pList;

    /*入参检查*/
    if ((NULL == pList)||(NULL == aData))
    {
        return (U32)ERROR;
    }

    if (0 == aData[0])
    {
        return (U32)ERROR;
    }

    /*创建初始化链表*/
    for (i=0; i<ARRAY_LENGTH; i++)
    {       
        /* 将从字符数组aData[]中获取的所有数据保存在链表中 */
        pNodeTmp->Data = aData[i];

        if (0 == aData[i+1])
        {
            pNodeTmp->next = NULL;
            break;  /*查询到字符结束*/
        }
       
        /*申请下个节点的存储空间*/
        pNodeTmp->next = (Node*)malloc(sizeof(Node));

        if (NULL == pNodeTmp->next)
        {
            return (U32)ERROR;
        }
       
        /*指向下一个节点*/
        pNodeTmp = pNodeTmp->next;
    }
      
    /*获取链表节点数*/
    gNodeNum = i + 1;
   
    return (U32)PROC_OK;
}

/*****************************************************************************
函 数 名      : U32 DataSort(Node* pList)
功能描述 : 根据题目提供的规则完成对字符串数据进行排序处理,
           并将处理后的结果重新保存在原字符串链表中
           数据处理规则:从字符串中间一分为二,左边按照ASCII码值升序排列,
           右边按照降序排列,如果是奇数,中间的字符位置保持不动即不参与排序
输入参数 : pList 存放待处理数据的链表
输出参数 :
函数返回 : 数据处理成功返回PROC_OK,失败返回ERROR
修改日期 : 2010-08-11
修改人员 : 考生
修改内容 : 创建
*****************************************************************************/
U32 DataSort(Node* pList)
{
    U8  Temp = 0;
    S16 i = 0;
    S16 j = 0;
    S16 LoopNum = 0;
    Node* pNodeTmp = pList;
    Node* pNodeNext = NULL;

    /*入参检查*/
    if (NULL == pList)
    {
        return (U32)ERROR;
    }

    /*根据规则进行数据的排序处理*/
    /*将处理后的数据保存在原链表中*/
    /*左侧升序排列,冒泡法*/
    LoopNum = gNodeNum/2;

    if (LoopNum < 2)
    {
        return (U32)PROC_OK;
    }

    for (i=0; i<LoopNum-1; i++)
    {
        pNodeNext = pNodeTmp->next;
        for (j=0; j<LoopNum-i-1; j++)
        {
            if (pNodeTmp->Data > pNodeNext->Data)
            {
                Temp = pNodeTmp->Data;
                pNodeTmp->Data = pNodeNext->Data;
                pNodeNext->Data = Temp;
            }
            pNodeNext = pNodeNext->next;
        }
        pNodeTmp = pNodeTmp->next;
    }

    pNodeTmp = pNodeTmp->next;
   
    /*区分奇偶数*/
    if (0 != gNodeNum%2)
    {
        pNodeTmp = pNodeTmp->next;
    }

    /*右侧降序排列,冒泡法*/
    for (i=0; i<LoopNum-1; i++)
    {
        pNodeNext = pNodeTmp->next;
        for (j=0; j<LoopNum-i-1; j++)
        {
            if (pNodeTmp->Data < pNodeNext->Data)
            {
                Temp = pNodeTmp->Data;
                pNodeTmp->Data = pNodeNext->Data;
                pNodeNext->Data = Temp;
            }
            pNodeNext = pNodeNext->next;
        }
        pNodeTmp = pNodeTmp->next;
    }

    return (U32)PROC_OK;
}


/*****************************************************************************
函 数 名 : U32 DataSave(Node* pList,char *aResult)
功能描述 : 完成最终结果输出到字符数组aResult[]中
输入参数 :
输出参数 :
函数返回 : 读取数据成功返回PROC_OK,失败返回ERROR
修改日期 : 2010-08-11
修改人员 : 考生
修改内容 : 创建
*****************************************************************************/
U32 DataSave(Node* pList,char *aResult)
{
    S16 i = 0;
    Node* pNodeTmp = NULL;
    Node* pNodeNext = NULL;

    /*入参检查*/
    if ((NULL == pList)||(NULL == aResult))
    {
        return (U32)ERROR;
    }

    /*将最终结果用字符类型保存数组aResult[]中*/
    pNodeTmp = pList;
    for (i=0; i<gNodeNum; i++)
    {
        aResult[i] = pNodeTmp->Data;
        pNodeTmp = pNodeTmp->next;
    }
      
    /* 字符结束 */
    aResult[gNodeNum] = 0;

    /* 删除链表 */
    pNodeNext = pList->next;
    pList->next = NULL;
    pList->Data = 0;

    while (NULL != pNodeNext)
    {
        pNodeTmp = pNodeNext->next;
        pNodeNext->next = NULL;
        pNodeNext->Data = 0;
        free(pNodeNext);
        pNodeNext = pNodeTmp;
    }

    return (U32)PROC_OK;
}

 

 

#include <stdlib.h>
#include <string>
#include "oj.h"

/******************************************************************************

******************************************************************************/
#define ARRAY_LENGTH  1000
Node *gstrList = NULL;
S8 aData[ARRAY_LENGTH];
S8 aResult[ARRAY_LENGTH];

/*****************************************************************************
函 数 名   : U32 DataRead(Node* pList,char *aData)
功能描述 : 完成从字符数组aData[]中读取所有数据并保存在链表中的功能
输入参数 :
输出参数 :
函数返回 : 读取数据成功返回PROC_OK,失败返回ERROR
修改日期 : 2010-08-11
修改人员 : 考生
修改内容 : 创建
*****************************************************************************/
U32 DataRead(Node* pList, char *aData)
{
    
    /*创建初始化链表*/
 int length = 1;
 int i = 0;
 Node* pListTemp = NULL;

 pList->next = NULL;

 while ((aData[i] != '\0') && (i<ARRAY_LENGTH))
 {
  length++;
  i++;
 }

 if (length <= 1)
 {
  return ERROR;
 }

 pListTemp = pList;
 for (i = 0; i <length; i++)
 {
  pListTemp->next = (Node*)malloc(sizeof(Node));
  if (pListTemp->next != NULL)
  {
   pListTemp->next->Data = '\0';
      pListTemp->next->next = NULL;

   pListTemp = pListTemp->next;
  }
  else
  {
   return ERROR;
  }
 }
    
    /* 将从字符数组aData[]中获取的所有数据保存在链表中 */
 pListTemp = pList;
 for (i = 0; i < length; i++)
 {
  pListTemp->next->Data = aData[i];
  pListTemp = pListTemp->next;
 }

    return PROC_OK;
}

/*****************************************************************************
函 数 名   : U32 DataSort(Node* pList)
功能描述 : 根据题目提供的规则完成对字符串数据进行排序处理,
     并将处理后的结果重新保存在原字符串链表中
     数据处理规则:从字符串中间一分为二,左边按照ASCII码值升序排列,
     右边按照降序排列,如果是奇数,中间的字符位置保持不动即不参与排序
输入参数 : pList 存放待处理数据的链表
输出参数 :
函数返回 : 数据处理成功返回PROC_OK,失败返回ERROR
修改日期 : 2010-08-11
修改人员 : 考生
修改内容 : 创建
*****************************************************************************/
U32 DataSort(Node* pList)
{
 /*根据规则进行数据的排序处理*/
 /*将处理后的数据保存在原链表中*/
 int length = 0;
 int i = 0;
 int j = 0;
 Node* pListTemp = NULL;
 Node* pTemp = NULL;
 Node* pTempStart =NULL;

    // 计算链表长度
 pListTemp = pList;
 while (pListTemp->next != NULL)
 {
  length++;
  pListTemp = pListTemp->next;
 }

 if (0 == length)
 {
  return ERROR;
 }

 // 前半部分升序排列
 for(i = 0; i < ((length-1)/2-1); i++)
 {
  pListTemp = pList;
  for (j = 0; j < ((length-1)/2-1); j++)
  {
   if ((pListTemp->next ->Data) > (pListTemp->next ->next->Data))
   {
    pTemp = pListTemp->next;
    pListTemp->next = pTemp->next;
    pTemp->next = pListTemp->next->next;
    pListTemp->next->next = pTemp;
   }
   pListTemp = pListTemp->next;
  }
 }

 // 后半部分降序排列
 pTempStart = pList;
 for (i=0; i < ((length-1)/2 + (length-1)%2); i++)
 {
  pTempStart = pTempStart->next;
 }

 for(i = 0; i < ((length-1)/2-1); i++)
 {
  pListTemp = pTempStart;
  for (j = 0; j < ((length-1)/2-1); j++)
  {
   if ((pListTemp->next ->Data) < (pListTemp->next ->next->Data))
   {
    pTemp = pListTemp->next;
    pListTemp->next = pTemp->next;
    pTemp->next = pListTemp->next->next;
    pListTemp->next->next = pTemp;
   }
   pListTemp = pListTemp->next;
  }
 }

    return (U32)PROC_OK;
}

/*****************************************************************************
函 数 名 : U32 DataSave(Node* pList,char *aResult)
功能描述 : 完成最终结果输出到字符数组aResult[]中
输入参数 :
输出参数 :
函数返回 : 读取数据成功返回PROC_OK,失败返回ERROR
修改日期 : 2010-08-11
修改人员 : 考生
修改内容 : 创建
*****************************************************************************/
U32 DataSave(Node* pList,char *aResult)
{
    int i = 0;
 int length = 0;
 Node* pListTemp = NULL;
 Node* preNode = NULL;

    /*将最终结果用字符类型保存数组aResult[]中*/
 pListTemp = pList;
 i = 0;
 while (pListTemp->next != NULL)
 {
  aResult[i] = pListTemp->next->Data;
  i++;
  pListTemp = pListTemp->next;
 }    

 length = i;

 if (0 == i)
 {
  return ERROR;
 }

    /* 删除链表 */
 for (i = 0; i < length; i++)
 {
  pListTemp = pList;
  while (pListTemp->next != NULL)
  {
   preNode = pListTemp;
   pListTemp = pListTemp->next;
  }
  free(pListTemp);
  preNode->next = NULL;
 }

    return (U32)PROC_OK;
}

 

0 0
原创粉丝点击