数据结构笔记——线性表

思考:怎么编程解决多项式相加问题?

1.线性表概念

由同类型数据元素构成的有序序列的线性结构
1. 表中元素个数称为线性表的长度;
2. 线性表中没有元素时称为空表;
3. 表的起始位置称为表头,结束位置称为表尾。

2.线性表的ADT描述

  • 类型名:线性表
  • 数据对象集:线性表是n(>=0)个元素构成的有序序列(a1,a2…,an)
  • 操作集:
    1.SeqList():构造函数,初始化一个空线性表;
    2.~SeqList():析构函数,释放线性表空间;
    3.T FindKth(int K,SeqList L):根据位序K,返回相应元素;
    4.int Find(T X,SeqList L):在线性表L中查找X第一次出现的位置;
    5.void Insert(T X,inT i,SeqList L):在位序i前插入一个新元素X;
    6.void Delete(int i,SeqList L):删除指定位序i的元素;
    7.int Length(SeqList L):返回线性表L的长度n;

3.线性表的顺序存储实现

//代码未测试
#include <iostream>
using namespace std;

template <class T>
class SeqList{
public:
    SeqList(maxSize);
    ~SeqList();
    T FindKth(int K,SeqList s);
    int Find(T x,SeqList s);
    bool Insert(T X,int i,SeqList s);//插入时把元素放在下标i的位置上
    bool Delete(int i,SeqList s);
    int Length(SeqList s){return n;};

private:
    int n;
    int maxSize;
    T *s; //二维数组用于存储线性表
};

template <class T>
SeqList :: SeqList(maxSize){
    T *s = new s[maxSize];
    n = 0;
}

template <class T>
SeqList :: ~SeqList(){
    delete s[];
}

template <class T>
T SeqLIst::FindKth(int K,SeqList L){
    int i=0;
    for(i=0;i<n;i++){
        if(i==K) return s[i];
    }
    return -1;
}

template <class T>
int SeqList::Find(T x,SeqList s){
    int i;
    for(i=0;i<n;i++){
        if(s[i]==x) return i;
    }
    return -1;
}

template <class T>
bool SeList::Insert(T X,inT i,SeqList L){ 
    if(n==maxSize) return false;
    if(i<0||i>n) return false; //检测位置的合法性
    int j;
    for(j=n-1;j>=i;j++){
        s[j+1] = s[j];
    }
    s[i] = X;
    n++;
    return true;
}


bool SeqList::Delete(int i,SeqList L){
    if(n==0) return false;
    if(i<0||i>n-1) return false; //检测位置合法性
    int j=0;
    for(j=i+1;j<n;j++){
        s[j-1] = s[j];
    }
    n--;
    return true;
}

4.线性表的链式存储实现

特点:不要求逻辑上相邻的两个元素物理上也相邻,通过链建立起数据元素之间的逻辑关系。

//代码未测试可能有小错误
#include <iostream>
using namespace std;

template <class T>
class TNode{
public:
    TNode(T X){
        data = X;
        next = NULL;
    };
private:
    T data;
    TNode *next; 
};


class List{
public:
    List();
    ~List();
    int length(List* head);
    TNode* FindKth(int K,List* head);//查找链表中的第K个元素
    TNode* Find(T X,List *head);
    TNode* Insert(T X,int i,List* head);
    TNode* Delete(int i,List* head);

private:
    TNode *head;
};

template <class T>
int List::length(List* head){
    TNode *p = head;
    int j = 0
    while(p){
        p = p->next;
        j++;
    }
    return j;
}

template <class T>
TNode* List::FindKth(int K,List* head){ //返回一个TNode型的指针
    TNode *p = head;
    int i = 1;
    while(p && i<K){
        p = p->next;
        i++;
    }
    if(i==K) return p;
    else return NULL;
}

template <class T>
TNode* List::Find(T X,List* head){
    TNode *p = head;
    while(p && p->data!=X){
        p = p->next;
    }
    // if(p->data==X) return p;
    // else return NULL; 这两句合起来就是return p;
    return p;
}

template <class T>
TNode* List::Insert(T X,int i,List* head){ //插入在第i个元素前面,第i-1个元素后面
    TNode *p = head;
    TNode *q = new TNode(X);
    if(i==1){ //插入在头节点之前
        q->next = head;
        return q;
    }
    int j=1;
    while(p && j<i-1){
        p = p->next;
        j++;
    }
    q->next = p->next;
    p->next = q;
    return head;
}

template <class T>
TNode* List::Delete(int i,List* head){ //删除第i个元素
    TNode *p = head;
    TNode *s = NULL;
    if(i==1) { //删除头节点
        s = head;
        if(head) head = head->next;
        delete s;
        return head;
    }

    //删除非头节点
    int j=1;
    while(j<i-1){
        p = p->next;
        j++;
    }
    if(p && p->next){ //p和p->next均存在
        s = p->next;
        p->next = s->next;
        delete s;
        return head;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值