线性表

来源:互联网 发布:单纯的js做动态网站 编辑:程序博客网 时间:2024/06/06 01:18

引言

多项式的表示

[例] 一元多项式及其运算

一元多项式 :

主要运算:多项式相加、相减、相乘等

【分析】如何表示多项式?

方法1:顺序存储结构直接表示

数组各分量对应多项式各项:

a[i]: 项xi的系数ai

\

这种表示方法虽然方便,但是如果零项太多,比如x+3x^2000,就会造成空间的浪费(同时还要循环2000多次,操作效率不高),所以这种做法并不明智

方法2:顺序存储结构表示非零项

用结构数组表示:数组分量是由系数ai、指数i组成的结构,对应一个非零项

 按指数大小来进行有序存储!


相加过程:从头开始,比较两个多项式当前对应项的指数

方法3:链表结构存储非零项

链表中每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域

typedef struct PolyNode *Polynomial;typedef struct PolyNode {int coef;int expon;Polynomial link;}

线性表

“线性表(Linear List)”:由同类型数据元素构成有限序列的线性结构

1.表中元素个数称为线性表的长度

2.线性表没有元素时,称为空表

3.表起始位置称表头,表结束位置称表尾

线性表的抽象数据类型描述

类型名称:线性表(List)

数据对象集:线性表是 n (≥0)个元素构成的有限序列( a1, a2, ...,an )

操作集:线性表L ∈List,整数i表示位置,元素X∈ ElementType,

线性表基本操作主要有:

1、List MakeEmpty():初始化一个空线性表L;

2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;

3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;

4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X;

5、void Delete( int i, List L ):删除指定位序i的元素;

6、int Length( List L ):返回线性表L的长度n。

线性表的顺序存储实现

利用数组的连续存储空间顺序存放线性表的各元素

typedef struct{ElementType Data[MAXSIZE];int Last;} List;List L, *PtrL;
访问下标为 i 的元素:L.Data[i] 或 PtrL->Data[i]
线性表的长度:L.Last+1 或 PtrL->Last+1

主要操作的实现

    typedef int Position;    typedef struct LNode *List;    struct LNode {        ElementType Data[MAXSIZE];        Position Last;    };     /* 初始化 */    List MakeEmpty()    {        List L;        L = (List)malloc(sizeof(struct LNode));        L->Last = -1;             return L;    }         /* 查找 */    #define ERROR -1     Position Find( List L, ElementType X )    {        Position i = 0;        while( i <= L->Last && L->Data[i]!= X )            i++;        if ( i > L->Last )  return ERROR; /* 如果没找到,返回错误信息 */        else  return i;  /* 找到后返回的是存储位置 */    }         /* 插入 */    /*注意:这里P是存储下标位置(从0开始),合法的P∈[0,n]*/    void Insert( List L, ElementType X, Position P )   /* 在L的指定位置P前插入一个新元素X */    {         Position i;             if ( L->Last == MAXSIZE-1) {            printf("表满"); /* 表空间已满,不能插入 */        }          if ( P<0 || P>L->Last+1 ) { /* 检查插入位置的合法性 */            printf("位置不合法");        }         for( i=L->Last; i>=P; i-- )            L->Data[i+1] = L->Data[i];     /* 将位置P及以后的元素顺序向后移动 */        L->Data[P] = X;                 /* 新元素插入 */        L->Last++;           }          /* 删除 */    /*注意:这里P是存储下标位置(从0开始),合法的P∈[0,n-1]*/    void Delete( List L, Position P )    { /* 从L中删除指定位置P的元素 */        Position i;             if( P<0 || P>L->Last ) { /* 检查空表及删除位置的合法性 */            printf("位置%d不存在元素", P );         }        for( i=P+1; i<=L->Last; i++ )            L->Data[i-1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */        L->Last--; /* Last仍指向最后元素 */     }

线性表的链式存储实现

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

 相对于顺序存储的优点:插入、删除不需要移动数据元素,只需要修改“链”。

 主要操作的实现

    typedef struct LNode *List;    struct LNode {        ElementType Data[MAXSIZE];        List Next;    };    /*求表长*/      int Length ( List PtrL )    {       List p = PtrL; /* p指向表的第一个结点*/      int j = 0;      while ( p ) {        p = p->Next;        j++; /* 当前p指向的是第 j 个结点*/         }      return j;    }        /* 查找 */    #define ERROR -1    /*按序号查找: FindKth*/    List FindKth( int K, List PtrL ) /*K∈[0,n-1]*/    {            List p = PtrL;        int i = 0;        while (p !=NULL && i < K ){           p = p->Next;           i++;        }        if ( i == K ) return p; /* 找到第K个,返回指针 */        else return NULL; /* 否则返回空 */    }     /*按值查找: Find*/    List Find( ElementType X, List PtrL )    {        List p = PtrL;        while ( p!=NULL && p->Data != X )             p = p->Next;        return p;    }    /* 插入 */    List Insert( ElementType X, int i, List PtrL ) /*在第i个结点前插入一个值为X的新结点*/     {       List p,s;       if ( i == 0 ) { /* 新结点插入在表头 */            s = (List)malloc(sizeof(struct LNode)); /*申请、填装结点*/            s->Data = X;            s->Next = PtrL;            return s; /*返回新表头指针*/       }       p = FindKth(i-1, PtrL ); /* 查找第i-1个结点 */       if ( p == NULL ) { /* 第i-1个不存在,不能插入 */             printf("参数i错");             return NULL;        }       else {            s = (List)malloc(sizeof(struct LNode)); /*申请、填装结点*/            s->Data = X;            s->Next = p->Next; /*新结点插入在第i-1个结点的后面*/            p->Next = s;            return PtrL;        }    }    /* 删除 */    List Delete( int i, List PtrL )    {       List p, s;      if ( i == 0 ) { /* 若要删除的是表的首结点 */            s = PtrL;             if (PtrL!=NULL)      PtrL = PtrL->Next; /*从链表中删除*/            else return NULL;            free(s); /*释放被删除结点 */            return PtrL;      }      p = FindKth( i-1, PtrL ); /*查找第i-1个结点*/      if ( p == NULL ) {         printf(“第%d个结点不存在”, i-1); return NULL;      }       else if ( p->Next == NULL ){         printf(“第%d个结点不存在”, i); return NULL;      }       else {           s = p->Next; /*s指向第i个结点*/           p->Next = s->Next; /*从链表中删除*/           free(s); /*释放被删除结点 */           return PtrL;      }    }



1 0
原创粉丝点击