C:二維數組常用操作

來源:互聯網
上載者:User

標籤:des   使用   os   io   for   ar   2014   代碼   

/*說明:程式實現二維數組中插入列、插入行、交換兩個指定位置的元素,並輸出指定位置元素的變化軌跡作者:socrates日期:2014-08-17*/#include "stdafx.h"#include <stdlib.h> #include <assert.h>/*二維數組最大行數和列數*/#define MAX_ROW_NUM (9)#define MAX_COL_NUM (9)/*二維數組中各元素位置資訊*/typedef struct _PathNode{    int x;  /*行*/    int y;  /*列*/}Node;/*各元素內容(表示位置軌跡的鏈表)*/typedef struct _PathNodeList{    Node node;    _PathNodeList *pNext;}PathNodeList;/*表示二維數組有效行列數*/typedef struct _CurRowColNum{    int iArrayRow;    int iArrayCol;}CurRowColNum;/*二維數組行列數*/static CurRowColNum g_stRowColNum = {0};/*二維數組定義*/PathNodeList* g_pGrid[MAX_ROW_NUM][MAX_COL_NUM];/*錯誤碼*/enum _RetCode{    ERR = -1, /*失敗*/    OK = 0    /*成功*/}RETCODE;/*設定當前數組行列數*/void SetRowAndColNum(int iRow, int iCol){    g_stRowColNum.iArrayRow = iRow;    g_stRowColNum.iArrayCol = iCol;}/*擷取數組行列數*/CurRowColNum getRowAndColNum(){    return g_stRowColNum;}/*建立軌跡鏈表,不帶頭結點*/int CreatePathNodelist(PathNodeList *&pList, Node *pPathNode){    if (NULL == pPathNode)    {        return ERR;    }        pList = (PathNodeList *)malloc(sizeof(PathNodeList));    if (NULL == pList)    {        return ERR;    }    pList->node.x = pPathNode->x;    pList->node.y = pPathNode->y;    pList->pNext = NULL;        return OK;}/*銷毀軌跡鏈表*/int DestoryPathNodelist(PathNodeList *pList){    if (NULL == pList)    {        return ERR;    }        PathNodeList *p = pList;    while (NULL != p->pNext)    {        p = p->pNext;        free(pList);        pList = p;    }        free(pList);    pList = NULL;    return OK;}/*向軌跡鏈表中插入當前結點所在位置*/int InsertPathNodeList(PathNodeList *pPathNodeList, Node *pPathNode){    if ((NULL == pPathNodeList)        || (NULL == pPathNode))    {        return ERR;    }        PathNodeList *pNewPathNode = (PathNodeList *)malloc(sizeof(PathNodeList));    if (NULL == pPathNode)    {        return ERR;    }        pNewPathNode->node.x = pPathNode->x;    pNewPathNode->node.y = pPathNode->y;    pNewPathNode->pNext = NULL;        PathNodeList *p = pPathNodeList;    while (NULL != p->pNext)    {        p = p->pNext;    }        p->pNext = pNewPathNode;        return OK;}/*初始化二維數組*/int InitGrid(int iXNum, int iYNum){      if ((iXNum < 0) || (iXNum > MAX_ROW_NUM))    {        return ERR;    }    if ((iYNum < 0) || (iYNum > MAX_COL_NUM))    {        return ERR;    }    /*儲存數組行列個數*/    SetRowAndColNum(iXNum, iYNum);    /*數組中的每個元素均建立一個以應的鏈表存放其運行軌跡,    沒有初始化元素預設為NULL*/    for (int i = 0; i < iXNum; i++)    {        for (int j = 0; j < iYNum; j++)        {            Node node = {0};            node.x = i;            node.y = j;                        if (OK != CreatePathNodelist(g_pGrid[i][j], &node))            {                return ERR;            }        }    }        return OK;}/*銷毀二維數組*/int DestoryGrid(){    CurRowColNum stcurRowColNum = getRowAndColNum();    for (int i = 0; i < stcurRowColNum.iArrayRow; i++)    {        for (int j = 0; j < stcurRowColNum.iArrayCol; j++)        {            if (OK != DestoryPathNodelist(g_pGrid[i][j]))            {                continue;            }        }    }    return OK;}/*擷取元素當前所在位置*/Node *GetCurPostion(PathNodeList *pPathList){    if (NULL == pPathList)    {        return NULL;    }    PathNodeList *p = pPathList;    /*鏈表的最後一個結點表示當前位置*/    while(NULL != p->pNext)    {        p = p->pNext;    }    return &(p->node);}/*交換兩個結點的位置*/int SwapNode(Node aNode, Node bNode){       Node *paNode = GetCurPostion(g_pGrid[aNode.x][aNode.y]);    Node *pbNode = GetCurPostion(g_pGrid[bNode.x][bNode.y]);    /*將b結點的當前位置插入到a結點鏈表中*/        if (OK != InsertPathNodeList(g_pGrid[aNode.x][aNode.y], pbNode))    {        return ERR;    }        /*將a結點的當前位置插入到b結點鏈表中*/      if (OK != InsertPathNodeList(g_pGrid[bNode.x][bNode.y], paNode))    {        return ERR;    }    /*交換a、b兩個結點*/    PathNodeList *pTmp = NULL;    pTmp = g_pGrid[aNode.x][aNode.y];    g_pGrid[aNode.x][aNode.y] = g_pGrid[bNode.x][bNode.y];    g_pGrid[bNode.x][bNode.y] = pTmp;    return OK;}/*向數組中沒有使用的行插入元素*/int insertToEmptyRow(int iRow){    CurRowColNum stcurRowColNum = getRowAndColNum();        for (int j = 0; j < stcurRowColNum.iArrayCol; j++)    {        Node node = {0};        node.x = iRow;        node.y = j;                     if (OK != CreatePathNodelist(g_pGrid[iRow][j], &node))        {            return ERR;        }    }          return OK;}/*向二維數組插入一行*/int insertRowtoGrid(int iInsertRow){    if (MAX_ROW_NUM <= iInsertRow)    {        return ERR;    }    CurRowColNum stcurRowColNum = getRowAndColNum();    /*插入數組中的無效行,直接插入,而向已有行中間插入,需要從前    向後兩兩交換行元素的位置*/    if (iInsertRow >= stcurRowColNum.iArrayRow)    {        if (OK != insertToEmptyRow(iInsertRow))        {            return ERR;        }    }    else    {        /*先將新行插入第一個無效行中*/        if (OK != insertToEmptyRow(stcurRowColNum.iArrayRow))        {            return ERR;        }          /*從剛插入的新行開始,按行兩兩交換,直到把插入的行        置換到參數指定的位置*/        for (int i = stcurRowColNum.iArrayRow; i > iInsertRow; i--)        {            for (int j = 0; j < stcurRowColNum.iArrayCol; j++)            {                Node curNode;                Node nextNode;                curNode.x = i - 1;                curNode.y = j;                nextNode.x = i;                nextNode.y = j;                                if (OK != SwapNode(curNode, nextNode))                {                    return ERR;                }                            }        }                }    /*數組有效行數加1*/    SetRowAndColNum(stcurRowColNum.iArrayRow + 1, stcurRowColNum.iArrayCol);        return OK;}/*擷取二維數組中指定結點的運動軌跡*/int GetNodePath(Node pathNode, PathNodeList **pPathList){        CurRowColNum stcurRowColNum = getRowAndColNum();    if ((pathNode.x < 0)         || (pathNode.x >= stcurRowColNum.iArrayRow))    {        *pPathList = NULL;        return ERR;    }    if ((pathNode.y < 0)         || (pathNode.y >= stcurRowColNum.iArrayCol))    {        *pPathList = NULL;        return ERR;    }    *pPathList = g_pGrid[pathNode.x][pathNode.y];    return OK;}/*向數組中沒有使用的列插入元素*/int insertToEmptyCol(int iCol){    CurRowColNum stcurRowColNum = getRowAndColNum();        for (int i = 0; i < stcurRowColNum.iArrayRow; i++)    {        Node node = {0};        node.x = i;        node.y = iCol;                     if (OK != CreatePathNodelist(g_pGrid[i][iCol], &node))        {            return ERR;        }    }         return OK;}/*向二維數組插入一列*/int insertColtoGrid(int iInsertCol){    if (MAX_COL_NUM <= iInsertCol)    {        return ERR;    }    CurRowColNum stcurRowColNum = getRowAndColNum();    /*插入數組中的無效列,直接插入,而向已有列中間插入,需要從前    向後兩兩交換列元素的位置*/    if (iInsertCol >= stcurRowColNum.iArrayCol)    {        if (OK != insertToEmptyCol(iInsertCol))        {            return ERR;        }    }    else    {        /*先將新行插入第一個無效列中*/        if (OK != insertToEmptyCol(stcurRowColNum.iArrayCol))        {            return ERR;        }          /*從剛插入的新列開始,按列兩兩交換,直到把插入的列        置換到參數指定的位置*/        for (int j = stcurRowColNum.iArrayCol; j > iInsertCol; j--)        {            for (int i = 0; i < stcurRowColNum.iArrayRow; i++)            {                Node curNode;                Node nextNode;                curNode.x = i;                curNode.y = j - 1;                nextNode.x = i;                nextNode.y = j;                                if (OK != SwapNode(curNode, nextNode))                {                    return ERR;                }                            }        }                }    /*數組有效列數加1*/    SetRowAndColNum(stcurRowColNum.iArrayRow, stcurRowColNum.iArrayCol + 1);        return OK;}/*測試代碼*/int main(int argc, char* argv[]){    assert(OK == InitGrid(5, 5));        PathNodeList *pList = NULL;    Node node;    node.x = 3;    node.y = 4;    Node node1;    node1.x = 1;    node1.y = 1;    Node node2;    node2.x = 4;    node2.y = 4;    assert(OK == SwapNode(node, node1));    assert(OK == insertRowtoGrid(1));    assert(OK == insertColtoGrid(3));        assert(OK == GetNodePath(node2, &pList));    PathNodeList *p = pList;    while (NULL != p)    {        printf("(%d\t%d)\n", p->node.x, p->node.y);        p = p->pNext;    }    assert(OK == DestoryGrid());    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.