数据结构_线性结构

数据结构与算法学习笔记

第二章 线性结构

  • 使用数组表示多项式(下标表示多项式的指数,下标的值表示多项式的系数,有点操作方便,缺点浪费空间)

  • 使用结构体数组表示多项式(数组元素按照指数递减的规则存储,数组元素为结构体)!
    在这里插入图片描述

    struct PolynomialElement {
        int coef;
        int expon;
    }
    
  • 使用链表表示多项式

在这里插入图片描述

typedef struct PolynomialElement *Polynomial;
struct PolynomialElement {
    int coef;
    int expon;
    Polynomial next;
}
线性表的抽象数据类型

线性表的顺序存储

  • 基本操作

    // 定义
    typedef int ElementType;
    typedef struct LNode* List;
    struct LNode {
        ElementType Data[MAXSIZE];
        int Last;	// 末尾元素的下标
    };
    struct LNode L;
    List PtrL;
    
    // 创建一个空表
    List MakeEmpty()
    {
        List PtrL;
        PtrL = (List)malloc(sizeof(LNode));
        PtrL->Last = -1;
        retrun PtrL;
    }
    
    // 查找
    int Find( ElementType X, List PtrL )
    {
        int i = 0;
        while ( i < PtrL->Last && PtrL->Data[i] != X )
        {
            i++
        }
        if ( i > PtrL->Last ) 
            return -1;
        return i;
    }
    
    // 插入, i表示数组中第i个元素
    int Insert( ElementType X, int i, List PtrL )
    {
        int j;
        if ( PtrL->Last = MAXSIZE-1 )
        {
            printf("表满\n");
            return -1}
        
        if ( i < 1 || i > PtrL->Last+2 )
        {
            printf("位置不合法\n");
            return -1;
        }
        
        for ( j = PtrL->Last; j > i-1; j-- )
        {
            PtrL->Data[j+1] = PtrL->Data[j];
        }
        PtrL->Data[i-1] = X;
        PtrL->Last++;
        return 0
    }
    
    // 删除(删除表的第 i (1≤i≤n)个位置上的元素) 
    int Delete( int i, List PtrL )
    {
        
        int j;
        // 判断位置合法性
        if ( i < 1 || i > PtrL->Last+1 )
        {
            printf("位置不合法");
            return -1;
        }
        
        temp = Ptrl->Data[i-1];
        for ( j = i; j <= Ptrl->Last; j++ )
        {
            Ptrl->Data[j-1] = Ptrl->Data[j];
        }
        Ptrl->Last--;
        return temp;
    }
    
  • 线性表链式存储(链表)

    // 定义
    typedef int ElementType;
    typedef struct LNode *List;
    struct LNode{
        ElementType Data;
        List Next;
    };
    struct LNode L;
    List Ptrl;
    
    // 求表长
    int GetLen( List Ptrl )
    {
        int len = 0;
        while ( Ptrl )
        {
            Ptrl = Ptrl->Next;
            len++;
        }
        return len;
    }
    
    // 查找元素
    List Find( ElementType X, List Ptrl )
    {
        while ( Ptrl && Ptrl->Data != X )
        {
            Ptrl = Ptrl->Next;
        }
        
        return Ptrl;
    }
    
    // 查找第K个元素
    List  FindKth( int K, List PtrL ) {      
        List  p = PtrL;         
        int  i = 1;         
        while (p !=NULL && i < K )
        {               
            p = p->Next;                
            i++;           
        }        
        if ( i == K ) return p;                      
        /* 找到第K个,返回指针 */        
        else  return NULL;                                 
        /* 否则返回空 */ 
    }
    
    // 新增节点
    List Insert( ElementType X, int i, List Ptrl )
    {
        LNode *node, *tmp;
        if ( 1 == i )
        {
            s = (LNode*)malloc(sizeof(struct LNode));
            s->Data = X;
            s->Next = Ptrl;
            return s;
        }
        
        tmp = FindKth( i-1, Ptrl )
        if ( NULL == tmp )
        {
            printf("位置不对");
            return NULL;
        } else {
            s = (List)malloc(sizeof(struct LNode));
            s->Data = X;
            s->Next = tmp->Next;
            tmp->Next = s;
            return Ptrl;
        }
    }
    
    // 删除元素
    List Delete( int i, List Ptrl )
    {
        int data;
        LNode *node, *tmp;
        if ( Ptrl == NULL )
        {
            printf("表空了");
            return NULL
        }
        
        if ( 1 == i )
        {
            tmp = Ptrl;
            printf( "data = %d", Ptrl->Data );
            Ptrl = Ptrl->Next;
            free(tmp);
            return Ptrl;
        }
        
        node = FindKth( i-1, Ptrl )
        if ( NULL == node || NULL == node->Next )
        {
            printf("节点不存在\n");
            return NULL;
        } else {
            tmp = node->Next;	// 待删除结点
            node->Next = tmp->Next;
            printf( "删除的结点值:%d", tmp->Data );
            free( tmp );
            return Ptrl;
        }
    }
    
广义表(难点)
  • 广义表的元素表示

    typedef struct GNode *PtrToGNode;
    typedef PtrToGNode GList;
    strcut GNode {
        int Tag;	// 标志域:0表示该结点是单元素;1表示该节点是广义表
        union {
            // 子表指针域 Sublist 与单元素数据域 Data 复用,即公用存储空间
            ElementType Data;
            Glist Sublist;
        } URegion;
        PtrToGNode Next;	// 指向后继结点
    };
    
堆栈(LIFO)
  • 顺序存储

    #define MaxSize
    typedef int ElementType
    typedef  struct SNode *Stack; 
    struct SNode{  
        ElementType Data[MaxSize];  
        int Top; 
    };
    
    void Push( Stack PtrS, ElementType item ) 
    {     
        if ( PtrS->Top == MaxSize-1 ) 
        {
            printf(“堆栈满”);  
            return;  
        } else {
            PtrS->Data[++(PtrS->Top)] = item;       
            return;     
        }
    } 
    
    ElementType Pop( Stack PtrS ) 
    {     
        if ( PtrS->Top == -1 ) 
        {            
            printf(“堆栈空”);            
            return ERROR;           /* ERROR是ElementType的特殊值,标志错误 */     
        } else             
            return ( PtrS->Data[(PtrS->Top)--] ); 
    } 
    
  • 链式存储

    typedef int ElementType;
    typedef struct SNode *Stack;
    struct SNode {
        ElementType Data;
        struct SNode *Next;
    };
    
    Stack CreateStack()  
    {  /* 构建一个堆栈的头结点,返回指针 */   
        Stack S;   
        S =(Stack)malloc(sizeof(struct SNode));   
        S->Next = NULL;   
        return S; 
    } 
     
    int IsEmpty(Stack S)   
    {  /*判断堆栈S是否为空,若为空函数返回整数1,否 则返回0*/  
        return ( S->Next == NULL ); 
    }
    
    // 第一个结点没有存数据
    void Push( ElementType item, Stack S)     
    {  /* 将元素item压入堆栈S  */ 
        struct SNode *TmpCell; 
        TmpCell=(struct SNode *)malloc(sizeof(struct SNode)); 
        TmpCell->Element = item; 
        TmpCell->Next = S->Next; 
        S->Next = TmpCell; 
    }
    
    ElementType Pop(Stack S) {  /* 删除并返回堆栈S的栈顶元素 */    
        struct SNode *FirstCell; 
        ElementType TopElem; 
        if( IsEmpty( S ) ) { 
            printf(“堆栈空”);  
            return NULL; 
        } else { 
            FirstCell = S->Next;  
            S->Next = FirstCell->Next; 
            TopElem = FirstCell ->Element; 
            free(FirstCell); 
            return TopElem; 
        } 
    }
    
队列(FIFO)
  • 顺序存储

    #define MaxSize  <储存数据元素的最大个数> 
    typedef int ElementType;
    struct  QNode {  
        ElementType  Data[ MaxSize ];  
        int  rear;  // front, rear 初始值为-1,使用MaxSize-1个空间
        int  front; 
    };  
    typedef struct QNode *Queue;
    
    void AddQ( Queue PtrQ, ElementType item) {          
        if ( (PtrQ->rear+1) % MaxSize == PtrQ->front ) 
        {            
            printf(“队列满”);                  
            return;       
        }       
        PtrQ->rear = (PtrQ->rear+1)% MaxSize;       
        PtrQ->Data[PtrQ->rear] = item; 
    }
    
    ElementType DeleteQ ( Queue PtrQ ) {                  
        if ( PtrQ->front == PtrQ->rear ) {              
            printf(“队列空”);              
            return ERROR;        
        }  else  {             
            PtrQ->front = (PtrQ->front+1)% MaxSize;             
            return  PtrQ->Data[PtrQ->f ront];        
        } 
    }
    
  • 链式存储

在这里插入图片描述

struct Node{       
    ElementType  Data;       
    struct Node  *Next; 
};
struct QNode{         		 /* 链队列结构   */      
    struct Node  *rear;      /* 指向队尾结点 */      
    struct Node  *front;     /* 指向队头结点 */ 
};  
typedef struct QNode *Queue; 
Queue  PtrQ; 

ElementType DeleteQ ( Queue  PtrQ ) 
{    
    struct Node  *FrontCell;       
    ElementType FrontElem;         
    if  ( PtrQ->front == NULL) {              
        printf(“队列空”);     
        return ERROR;       
    }       
    FrontCell = PtrQ->front;       
    if ( PtrQ->front == PtrQ->rear)        /* 若队列只有一个元素 */              
        PtrQ->front = PtrQ->rear = NULL;   /* 删除后队列置为空 */       
    else                                   
        PtrQ->front = PtrQ->front->Next;       
    FrontElem = FrontCell->Data;       
    free( FrontCell );                     /* 释放被删除结点空间  */       
    return  FrontElem; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值