程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 順序表相關操作

順序表相關操作

編輯:C++入門知識

[cpp]
// SequenceList.h: interface for the CSequenceList class.  
//  
//////////////////////////////////////////////////////////////////////  
 
#if !defined(AFX_SEQUENCELIST_H__ECAED4FD_189E_4994_9843_BC7E9134CAF8__INCLUDED_)  
#define AFX_SEQUENCELIST_H__ECAED4FD_189E_4994_9843_BC7E9134CAF8__INCLUDED_  
 
#if _MSC_VER > 1000  
#pragma once  
#endif // _MSC_VER > 1000  
 
#define MAXSIZE 100  
#define LIST_INIT_SIZE 100  
#define LIST_INCREMENT 100  
typedef int DataType; 
 
typedef struct 

    DataType *data; 
    int iLength; 
    int iAllocatedSpace; 
}SqList; 
 
class CSequenceList   

public: 
    SqList sqList; 
    CSequenceList(); 
    virtual ~CSequenceList(); 
    void operator = (const CSequenceList listSeq) 
    { 
        sqList.data = listSeq.sqList.data; 
        sqList.iLength = listSeq.sqList.iLength; 
        sqList.iAllocatedSpace = listSeq.sqList.iAllocatedSpace; 
    } 
    BOOL InitList(); 
    BOOL Insert(int index, DataType elem); 
    BOOL Delete(int index); 
    DataType GetAt(int index); 
    BOOL DestroyList(); 
    BOOL IsEmpty(); 
    int GetLength(); 
    int Find(int from, DataType& elem); 
    void Unique(); 
    CSequenceList MergeList(CSequenceList& listA); 
    void Reverse(); 
}; 
 
#endif // !defined(AFX_SEQUENCELIST_H__ECAED4FD_189E_4994_9843_BC7E9134CAF8__INCLUDED_)  
 
 
 
// SequenceList.cpp: implementation of the CSequenceList class.  
//  
//////////////////////////////////////////////////////////////////////  
 
#include "stdafx.h"  
#include "DataStruct.h"  
#include "SequenceList.h"  
 
#ifdef _DEBUG  
#undef THIS_FILE  
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW  
#endif  
 
//////////////////////////////////////////////////////////////////////  
// Construction/Destruction  
//////////////////////////////////////////////////////////////////////  
 
CSequenceList::CSequenceList() 

 

 
CSequenceList::~CSequenceList() 

 

 
/************************************************************************
函數名:  InitList
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  初始化順序表,為為順序表動態分配空間
形參數:  
返回值:  成功:true  失敗: false                                          
************************************************************************/ 
BOOL CSequenceList::InitList() 

    sqList.data = (DataType*)malloc(LIST_INIT_SIZE * sizeof(DataType)); 
    //sqList.data = new DataType[LIST_INIT_SIZE];  
    if (sqList.data == NULL) 
    { 
        return false; 
    } 
    sqList.iLength = 0; 
    sqList.iAllocatedSpace = LIST_INIT_SIZE; 
 
    return true; 

 
/************************************************************************
函數名:  Insert
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  往順序表中index之前插入插入元素
形參數:  index 從0開始的索引
         elem 要插入的元素
返回值:  成功:true  失敗: false                                             
************************************************************************/ 
BOOL CSequenceList::Insert(int index, DataType elem) 

    int i; 
    DataType *newBase; 
 
    if (index < 0 || index > sqList.iLength) 
    { 
        return false; 
    } 
 
    if (sqList.iLength >= sqList.iAllocatedSpace) 
    { 
        newBase = (DataType*)realloc(sqList.data, (sqList.iAllocatedSpace + LIST_INCREMENT) * sizeof(DataType)); 
        if (!newBase) 
        { 
            return false; 
        } 
        sqList.data = newBase; 
        sqList.iAllocatedSpace += LIST_INCREMENT; 
    } 
 
    for(i = sqList.iLength; i > index; i--) 
    { 
        sqList.data[i] = sqList.data[i - 1]; 
    } 
    sqList.data[index] = elem; 
    sqList.iLength++; 
 
    return true; 

 
/************************************************************************
函數名:  Delete
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  刪除順序表中指定位置的元素
形參數:  index 從0開始的索引
返回值:  成功:true  失敗: false                                            
************************************************************************/ 
BOOL CSequenceList::Delete(int index) 

    int i; 
 
    if (index < 0 || index > sqList.iLength - 1 || sqList.iLength == 0) 
    { 
        return false; 
    } 
 
    for(i = index; i < sqList.iLength - 1; i++) 
    { 
        sqList.data[i] = sqList.data[i + 1]; 
    } 
    sqList.data[sqList.iLength - 1] = '\0'; 
    sqList.iLength--; 
 
    return true; 

 
/************************************************************************
函數名:  GetAt
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  返回順序表中指定位置的元素
形參數:  index 從0開始的索引
返回值:                                             
************************************************************************/ 
DataType CSequenceList::GetAt(int index) 

    if (index < 0 || index > sqList.iLength - 1) 
    { 
        return false; 
    } 
 
    return sqList.data[index]; 

 
/************************************************************************
函數名:  DestroyList
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  摧毀順序表
形參數:  
返回值:                                             
************************************************************************/ 
BOOL CSequenceList::DestroyList() 

    if (sqList.data) 
    { 
        free(sqList.data); 
    } 
 
    sqList.iLength = 0; 
    sqList.iAllocatedSpace = 0; 
 
    return true; 

 
/************************************************************************
函數名:  IsEmpty
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  判斷順序表是否為空
形參數:  
返回值:                                             
************************************************************************/ 
BOOL CSequenceList::IsEmpty() 

    if (sqList.iLength == 0) 
    { 
        return false; 
    } 
 
    return true; 

 
/************************************************************************
函數名:  GetLength
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  返回順序表的實際長度
形參數:  
返回值:                                             
************************************************************************/ 
int CSequenceList::GetLength() 

    return sqList.iLength; 

 
 
/************************************************************************
函數名:  Find
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  在順序表中從from開始查找元素elem,找到則返回從0開始的元素索引
形參數:  from 開始查找位置
         elem 要查找的元素
返回值:  沒有找到則返回-1,找到則返回從0開始的元素索引                                            
************************************************************************/ 
int CSequenceList::Find(int from, DataType& elem) 

    int i; 
 
    if (from < 0 || from > sqList.iLength - 1) 
    { 
        return -1; 
    } 
 
    for (i = from; i < sqList.iLength; i++) 
    { 
        if (sqList.data[i] == elem) 
        { 
            return i; 
        } 
    } 
 
    return -1; 

 
/************************************************************************
函數名:  Unique
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  將順序表中的重復元素刪除
形參數:  
返回值:                                              
************************************************************************/ 
void CSequenceList::Unique() 

    int i, index; 
 
    for(i = 0; i < sqList.iLength - 1; i++) 
    { 
        index = i + 1; 
        while ((index = Find(index, sqList.data[i])) >= 0) 
        { 
            Delete(index); 
        } 
    } 

 
/************************************************************************
函數名:  MergeList
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  將兩個有序表合並
形參數:  
返回值:                                              
************************************************************************/ 
CSequenceList CSequenceList::MergeList(CSequenceList& listA) 

    int i, j, k; 
    CSequenceList listSeq; 
    listSeq.InitList(); 
 
    i = j = k = 0; 
    while(i < sqList.iLength && j < listA.sqList.iLength) 
    { 
        if (sqList.data[i] < listA.sqList.data[j]) 
        { 
            listSeq.Insert(listSeq.sqList.iLength, sqList.data[i++]); 
        } 
        else 
        { 
            listSeq.Insert(listSeq.sqList.iLength, listA.sqList.data[j++]); 
        } 
    } 
 
    while(i < sqList.iLength) 
    { 
        listSeq.Insert(listSeq.sqList.iLength, sqList.data[i++]); 
    } 
 
    while(j < listA.sqList.iLength) 
    { 
        listSeq.Insert(listSeq.sqList.iLength, listA.sqList.data[j++]); 
    } 
 
    return listSeq; 

 
/************************************************************************
函數名:  Reverse
作  者:    譚友亮(Charles Tan)
日  期:    2013-4-12
作  用:  逆轉順序表
形參數:  
返回值:                                              
************************************************************************/ 
void CSequenceList::Reverse() 

    int i; 
    DataType temp; 
 
    for(i = 0; i < sqList.iLength / 2 + sqList.iLength % 2; i++) 
    { 
        temp = sqList.data[i]; 
        sqList.data[i] = sqList.data[sqList.iLength - i - 1]; 
        sqList.data[sqList.iLength - i - 1] = temp; 
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved