关于顺序表和链表,该怎么处理

关于顺序表和链表
2. 实验内容
在有序表中实现如下操作:
1) 插入一个新元素到第i 个位置。
2) 删除第i 个位置的元素。
3) 存一个新元素到第i 个位置。
4) 显示有序表中所有元素的值。
5)检索表中第i 个元素。
6)求表的长度。
3. 要求
分别用顺序表和链表实现

------解决方案--------------------
http://topic.****.net/u/20111203/22/80e57f27-88e6-47a6-8aea-0fb35415623a.html
回复最下面那个可能就是你要的答案
------解决方案--------------------
下面代码,楼主参考下:

C/C++ code


/*
 *  ccListEx.h
 *  c++_mac_proj
 *
 *  Created by xichen on 12-2-10.
 *  Copyright 2012 cc_team. All rights reserved.
 *
 */
#ifndef    CC_LIST_EX_H
#define    CC_LIST_EX_H

#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

typedef struct CCListNode
{
    int data;
    struct CCListNode *next;
}CCListNode, *PCCListNode, **PPCCListNode;

class CCListEx 
{
public:
    explicit CCListEx(PCCListNode head = NULL);
    ~CCListEx();
    
public:
    int count() const;
    PCCListNode head() const;
    PCCListNode getNodeAt(int index) const;    // start from 0
    int            getIndexByNode(PCCListNode node) const;
    int            getDataAt(int index) const;    // start from 0
    void        setDataAt(int index, int data);        // start from 0
    void        setNodeAt(int index, PCCListNode newNode);        // start from 0
    
public:
    bool insert(int index, PCCListNode node);
    bool insert(PCCListNode node, int index);
    void insertArr(int index, PPCCListNode pNode, int cnt);
    void insertArr(PPCCListNode pNode, int index, int cnt);
    
    void deleteNode(int index);
    void deleteNode(PCCListNode node);
    void deleteNode(int start, int cnt);
    
    void removeAll();
    
    void resetDataToZero();
    void resetDataTo(int newData);
    void resetToHead();
    
public:
    friend bool operator==(const CCListEx &leftList, const CCListEx &rightList);
    friend bool operator!=(const CCListEx &leftList, const CCListEx &rightList);
    friend bool operator<(const CCListEx &leftList, const CCListEx &rightList);
    friend bool operator>(const CCListEx &leftList, const CCListEx &rightList);

public:
    void reverse();
    void mergeWithList(const CCListEx &anotherList);
    CCListEx constMergeWithList(const CCListEx &anotherList) const;

public:
    void sort();
    void sortDataArr(int arr[], int cnt) const;
    void sortByDescend();
    
private:
    CCListEx(const CCListEx &list);
    CCListEx &operator=(const CCListEx &list);
    
private:
    PCCListNode    _head;
    int            _cnt;
};

#endif

------解决方案--------------------
C/C++ code


/*
 *  ccListEx.cpp
 *  c++_mac_proj
 *
 *  Created by xichen on 12-2-10.
 *  Copyright 2012 cc_team. All rights reserved.
 *
 */

#include "ccListEx.h"

CCListEx::CCListEx(PCCListNode head)
{
    _head = NULL;
    _cnt = 0;
    
    if(head == NULL)
        return;
    
    PCCListNode node = (PCCListNode)malloc(sizeof(CCListNode));
    if(node)
    {
        node->data = head->data;
        node->next = NULL;
        _head = node;
        ++_cnt;
    }
    else
        throw std::bad_alloc();
}

CCListEx::~CCListEx()
{
    PCCListNode temp = _head;
    PCCListNode next;
    while(temp)
    {
        next = temp->next;
        free(temp);
        temp = next;
    }
}

int CCListEx::count() const
{
    return _cnt;
}

PCCListNode CCListEx::head() const
{
    return _head;
}

PCCListNode CCListEx::getNodeAt(int index) const    // start from 0
{
    PCCListNode node = _head;
    while(index-- > 0)
        node = node->next;
    return node;
}

int            CCListEx::getIndexByNode(PCCListNode node) const
{
    PCCListNode temp = _head;
    int i = 0;
    while (temp)
    {
        if(temp == node)
            break;
        temp = temp->next;
        ++i;
    }
    return i;
}

void        CCListEx::setNodeAt(int index, PCCListNode newNode)        // start from 0
{
    PCCListNode node = getNodeAt(index);
    PCCListNode newNodeCopy = (PCCListNode)malloc(sizeof(CCListNode));
    newNodeCopy->data = newNode->data;
    PCCListNode prev;
    PCCListNode next;
    if(index == 0)
    {
        next = node->next;
        free(node);
        _head = newNode;
        _head->next = next;
    }
    else if(index == _cnt)
    {
        prev = getNodeAt(index - 1);
        free(node);
        prev->next = newNode;
        newNode->next = NULL;
    }
    else
    {
        prev = getNodeAt(index - 1);
        next = getNodeAt(index + 1);
        free(node);
        prev->next = newNode;
        newNode->next = next;
    }
}

int            CCListEx::getDataAt(int index) const    // start from 0
{
    return ((PCCListNode)getNodeAt(index))->data;
}

void        CCListEx::setDataAt(int index, int newData)        // start from 0
{
    ((PCCListNode)getNodeAt(index))->data = newData;
}


bool CCListEx::insert(int index, PCCListNode newNode)
{
    PCCListNode newNodeCopy = (PCCListNode)malloc(sizeof(CCListNode));
    if(!newNodeCopy)
        return false;
    
    newNodeCopy->data = newNode->data;
    
    if(index == 0)
    {
        PCCListNode node = getNodeAt(index);
        _head = newNodeCopy;
        newNodeCopy->next = node;
    }
    else if(index == _cnt)
    {
        PCCListNode node = getNodeAt(index - 1);
        node->next = newNodeCopy;
        newNodeCopy->next = NULL;
    }
    else
    {
        PCCListNode node = getNodeAt(index);
        PCCListNode prevNode = getNodeAt(index - 1);
        PCCListNode nextNode = node->next;
        prevNode->next = newNodeCopy;
        newNodeCopy->next = nextNode;
    }
    ++_cnt;
    return true;
}

bool CCListEx::insert(PCCListNode node, int index)
{
    return insert(index, node);
}

void CCListEx::insertArr(int index, PPCCListNode pNode, int cnt)
{
    while(cnt--)
    {
        PCCListNode node = *(pNode + cnt);
        insert(node, index++);
    }
}

void CCListEx::insertArr(PPCCListNode pNode, int index, int cnt)
{
    insertArr(index, pNode, cnt);
}

void CCListEx::deleteNode(int index)
{
    PCCListNode node = getNodeAt(index);
    if(index == 0)
    {
        _head = node->next;
    }
    else if(index == _cnt - 1)
    {
        PCCListNode prev = getNodeAt(index - 1);
        prev->next = NULL;
    }
    else
    {
        PCCListNode prev = getNodeAt(index - 1);
        PCCListNode next = getNodeAt(index + 1);
        prev->next = next;
    }
    
    free(node);
    --_cnt;
}

void CCListEx::deleteNode(PCCListNode node)
{
    deleteNode(getIndexByNode(node));
}

void CCListEx::deleteNode(int start, int cnt)
{
    PCCListNode startNode = getNodeAt(start);
    PCCListNode startPrev;
    if(start != 0)
        startPrev = getNodeAt(start - 1);
    
    PCCListNode lastNode = getNodeAt(start + cnt - 1 >= _cnt ? _cnt - 1 : start + cnt - 1);
    PCCListNode lastNodeNext = lastNode->next;
    
    PCCListNode deleteNode = startNode;
    while(cnt--)
    {
        PCCListNode temp = deleteNode->next;
        free(deleteNode);
        deleteNode = temp;
    }
    
    if(start == 0)
    {
        _head = deleteNode;
    }
    else
    {
        startPrev->next = lastNodeNext;
    }
}


void CCListEx::removeAll()
{
    deleteNode(0, _cnt);
}

void CCListEx::resetDataToZero()
{
    resetDataTo(0);
}

void CCListEx::resetDataTo(int newData)
{
    PCCListNode node = _head;
    while (node)
    {
        node->data = newData;
        node = node->next;
    }
}

void CCListEx::resetToHead()
{
    PCCListNode node = _head->next;
    while (node)
    {
        PCCListNode temp = node->next;
        free(node);
        node = temp;
    }
    _head->next = NULL;
    _cnt = 1;
}

void CCListEx::reverse()
{
    if(_cnt <= 1)
    return;
    PCCListNode curr = _head;
    PCCListNode next = curr->next;
    if(_cnt == 2)
    {
    next->next = curr;
    curr->next = NULL;
    _head = next;
    return;
    }
    PCCListNode nextNext = next->next;
    while(next)
    {
    next->next = curr;
    if(nextNext)
        nextNext->next = next;
    else
    { 
        _head = next;
        break;
    }
    curr = next;
    next = nextNext;
    }
}

void CCListEx::mergeWithList( const CCListEx &anotherList )
{
    // not implement
}

CCListEx CCListEx::constMergeWithList( const CCListEx &anotherList ) const
{
    // not implement
    return CCListEx(NULL);
}

void CCListEx::sort()
{
    // not implement
}

void CCListEx::sortDataArr( int arr[], int cnt ) const
{
    // not implement
}

void CCListEx::sortByDescend()
{
    // not implement
}



bool operator==( const CCListEx &leftList, const CCListEx &rightList )
{
    if(leftList.count() != rightList.count())
    return false;
    if(leftList.count() == 0 && rightList.count() == 0)
    return true;
    PCCListNode left = leftList.getNodeAt(0);
    PCCListNode right = rightList.getNodeAt(0);
    while(left != NULL && left->data == right->data)
    {
    left = left->next;
    right = right->next;
    }
    return (left == NULL);
}

bool operator!=( const CCListEx &leftList, const CCListEx &rightList )
{
    return !(leftList == rightList);
}


bool operator<( const CCListEx &leftList, const CCListEx &rightList )
{
    int leftCount = leftList.count();
    int rightCount = rightList.count();
    if(leftCount > rightCount)
    return false;
    if(leftCount == 0 && rightCount == 0)
    return false;
    if(leftCount == 0 && rightCount > 0)
    return true;
    if(leftCount > 0 && rightCount == 0)
    return false;
    PCCListNode leftNode = leftList.getNodeAt(0);
    PCCListNode rightNode = rightList.getNodeAt(0);
    while(leftNode && rightNode)
    {
    if(leftNode->data >= rightNode->data)
        return false;
    }
    return true;
}


bool operator>( const CCListEx &leftList, const CCListEx &rightList )
{
    int leftCount = leftList.count();
    int rightCount = rightList.count();
    if(leftCount < rightCount)
    return false;
    if(leftCount == 0 && rightCount == 0)
    return false;
    if(leftCount == 0 && rightCount > 0)
    return false;
    if(leftCount > 0 && rightCount == 0)
    return true;
    PCCListNode leftNode = leftList.getNodeAt(0);
    PCCListNode rightNode = rightList.getNodeAt(0);
    while(leftNode && rightNode)
    {
    if(leftNode->data <= rightNode->data)
        return false;
    }
    return true;
}