数据结构与算法学习笔记
第二章 线性结构
-
使用数组表示多项式(下标表示多项式的指数,下标的值表示多项式的系数,有点操作方便,缺点浪费空间)
-
使用结构体数组表示多项式(数组元素按照指数递减的规则存储,数组元素为结构体)!
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;
}