当前位置:   article > 正文

数据结构之线性结构知识点总结_数据结构线性表知识点总结

数据结构线性表知识点总结

目录

一、前置函数clock()

二、时间复杂度

三、线性表及其实现

1.数组

2.链表

3.广义表

四、堆栈

1.数组

2.二栈数组

3.链表

4.堆栈的应用

 五、队列

1.数组

2.链表

六、实例

1.多项式加法运算

2.一元多项式的加法与乘法运算


一、前置函数clock()

C语言提供clock()函数可以捕捉从程序开始运行到clock()函数被调用时所耗费的时间,通过clock()函数可以得到程序执行的时间,具体实现如下:

  1. clock_t start,stop; //定义变量类型
  2. double duration;
  3. int main()
  4. {
  5. start = clock();
  6. MyFunction();
  7. stop = clock();
  8. duration = ((double)(stop - start))/CLK_TCK;
  9. //CLK_TCK:机器时钟每秒走的打点数
  10. return 0;
  11. }

二、时间复杂度

三、线性表及其实现

1.数组

①头文件

  1. #include<stdio.h>
  2. #define ERROR -1
  3. #define ElementType int
  4. typedef int Position; //数组元素类型
  5. typedef struct LNode *List; //List:结构体指针
  6. struct LNode {
  7. ElementType Data[MAXSIZE];
  8. Position Last;
  9. };

②初始化

  1. List MakeEmpty()
  2. {
  3. List L;
  4. L = (List)malloc(sizeof(struct LNode));
  5. L->Last = -1;
  6. return L;
  7. }

③查找

  1. Position Find( List L, ElementType X )
  2. {
  3. Position i = 0;
  4. while( i <= L->Last && L->Data[i]!= X )
  5. i++;
  6. if ( i > L->Last ) return ERROR; //如果没找到,返回错误信息
  7. else return i; //找到后返回的是存储位置
  8. }

④插入

  1. bool Insert( List L, ElementType X, Position P )
  2. { /* 在L的指定位置P前插入一个新元素X */
  3. Position i;
  4. if ( L->Last == MAXSIZE-1) {
  5. /* 表空间已满,不能插入 */
  6. printf("表满");
  7. return false;
  8. }
  9. if ( P<0 || P>L->Last+1 ) { /* 检查插入位置的合法性 */
  10. printf("位置不合法");
  11. return false;
  12. }
  13. for( i=L->Last; i>=P; i-- )
  14. L->Data[i+1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
  15. L->Data[P] = X; /* 新元素插入 */
  16. L->Last++; /* Last仍指向最后元素 */
  17. return true;
  18. }

⑤删除

  1. bool Delete( List L, Position P )
  2. { /* 从L中删除指定位置P的元素 */
  3. Position i;
  4. if( P<0 || P>L->Last ) { /* 检查空表及删除位置的合法性 */
  5. printf("位置%d不存在元素", P );
  6. return false;
  7. }
  8. for( i=P+1; i<=L->Last; i++ )
  9. L->Data[i-1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */
  10. L->Last--; /* Last仍指向最后元素 */
  11. return true;
  12. }

2.链表

①头文件

  1. #include <stdio.h>
  2. #define ElementType int
  3. typedef struct LNode *PtrToLNode;
  4. struct LNode {
  5. ElementType Data;
  6. PtrToLNode Next;
  7. };
  8. typedef PtrToLNode Position;
  9. typedef PtrToLNode List;

②查找

  1. Position Find( List L, ElementType X )
  2. {
  3. Position p = L; /* p指向L的第1个结点 */
  4. while ( p && p->Data!=X )
  5. p = p->Next;
  6. return p;
  7. }

③插入

  1. bool Insert( List L, ElementType X, Position P )
  2. { /* 这里默认L有头结点 */
  3. Position tmp, pre;
  4. /* 查找P的前一个结点 */
  5. for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;
  6. if ( pre==NULL ) { /* P所指的结点不在L中 */
  7. printf("插入位置参数错误\n");
  8. return false;
  9. }
  10. else { /* 找到了P的前一个结点pre */
  11. /* 在P前插入新结点 */
  12. tmp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */
  13. tmp->Data = X;
  14. tmp->Next = P;
  15. pre->Next = tmp;
  16. return true;
  17. }
  18. }

④删除

  1. bool Delete( List L, Position P )
  2. { /* 这里默认L有头结点 */
  3. Position pre;
  4. /* 查找P的前一个结点 */
  5. for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;
  6. if ( pre==NULL || P==NULL) { /* P所指的结点不在L中 */
  7. printf("删除位置参数错误\n");
  8. return false;
  9. }
  10. else { /* 找到了P的前一个结点pre */
  11. /* 将P位置的结点删除 */
  12. pre->Next = P->Next;
  13. free(P);
  14. return true;
  15. }
  16. }

3.广义表

 

四、堆栈

1.数组

①头文件

  1. #include<stdio.h>
  2. #define ERROR -1
  3. #define ElementType int
  4. typedef int Position;
  5. typedef struct SNode *Stack;
  6. struct SNode {
  7. ElementType *Data; /* 存储元素的数组 */
  8. Position Top; /* 栈顶指针 */
  9. int MaxSize; /* 堆栈最大容量 */
  10. };

②初始化

  1. Stack CreateStack( int MaxSize )
  2. {
  3. Stack S = (Stack)malloc(sizeof(struct SNode));
  4. S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
  5. S->Top = -1;
  6. S->MaxSize = MaxSize;
  7. return S;
  8. }

③判断是否空/满

  1. bool IsFull( Stack S )
  2. {
  3. return (S->Top == S->MaxSize-1);
  4. }
  5. bool IsEmpty( Stack S )
  6. {
  7. return (S->Top == -1);
  8. }

④入栈

  1. bool Push( Stack S, ElementType X )
  2. {
  3. if ( IsFull(S) ) {
  4. printf("堆栈满");
  5. return false;
  6. }
  7. else {
  8. S->Data[++(S->Top)] = X;
  9. return true;
  10. }
  11. }

⑤出栈

  1. ElementType Pop( Stack S )
  2. {
  3. if ( IsEmpty(S) ) {
  4. printf("堆栈空");
  5. return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
  6. }
  7. else
  8. return ( S->Data[(S->Top)--] );
  9. }

2.二栈数组

①初始化

②出入栈

3.链表

①头文件

  1. #include<stdio.h>
  2. #define ERROR -1
  3. #define ElementType int
  4. typedef struct SNode *PtrToSNode;
  5. typedef PtrToSNode Stack;
  6. struct SNode {
  7. ElementType Data;
  8. PtrToSNode Next;
  9. };

②初始化

  1. Stack CreateStack( )
  2. { /* 构建一个堆栈的头结点,返回该结点指针 */
  3. Stack S;
  4. S = (Stack)malloc(sizeof(struct SNode));
  5. S->Next = NULL;
  6. return S;
  7. }

③判断是否为空

  1. bool IsEmpty ( Stack S )
  2. { /* 判断堆栈S是否为空,若是返回true;否则返回false */
  3. return ( S->Next == NULL );
  4. }

④入栈

  1. bool Push( Stack S, ElementType X )
  2. { /* 将元素X压入堆栈S */
  3. PtrToSNode TmpCell;
  4. TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
  5. TmpCell->Data = X;
  6. TmpCell->Next = S->Next;
  7. S->Next = TmpCell;
  8. return true;
  9. }

⑤出栈

  1. ElementType Pop( Stack S )
  2. { /* 删除并返回堆栈S的栈顶元素 */
  3. PtrToSNode FirstCell;
  4. ElementType TopElem;
  5. if( IsEmpty(S) ) {
  6. printf("堆栈空");
  7. return ERROR;
  8. }
  9. else {
  10. FirstCell = S->Next;
  11. TopElem = FirstCell->Data;
  12. S->Next = FirstCell->Next;
  13. free(FirstCell);
  14. return TopElem;
  15. }
  16. }

4.堆栈的应用

 五、队列

1.数组

①头文件

  1. #include<stdio.h>
  2. #define ERROR -1
  3. #define ElementType int
  4. typedef int Position;
  5. typedef struct QNode *Queue;
  6. struct QNode {
  7. ElementType *Data; /* 存储元素的数组 */
  8. Position Front, Rear; /* 队列的头、尾指针 */
  9. int MaxSize; /* 队列最大容量 */
  10. };

②初始化

  1. Queue CreateQueue( int MaxSize )
  2. {
  3. Queue Q = (Queue)malloc(sizeof(struct QNode));
  4. Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
  5. Q->Front = MaxSize - 1;
  6. Q->Rear = -1;
  7. Q->MaxSize = MaxSize;
  8. return Q;
  9. }

③判断是否满/空

  1. bool IsFull( Queue Q )
  2. {
  3. return ((Q->Rear+1)%Q->MaxSize == Q->Front);
  4. }
  5. bool IsEmpty( Queue Q )
  6. {
  7. return (Q->Front == Q->Rear);
  8. }

④入列

  1. bool AddQ( Queue Q, ElementType X )
  2. {
  3. if ( IsFull(Q) ) {
  4. printf("队列满");
  5. return false;
  6. }
  7. else {
  8. Q->Rear = (Q->Rear+1)%Q->MaxSize;
  9. Q->Data[Q->Rear] = X;
  10. return true;
  11. }
  12. }

⑤出列

  1. ElementType DeleteQ( Queue Q )
  2. {
  3. if ( IsEmpty(Q) ) {
  4. printf("队列空");
  5. return ERROR;
  6. }
  7. else {
  8. Q->Front =(Q->Front+1)%Q->MaxSize;
  9. return Q->Data[Q->Front];
  10. }
  11. }

2.链表

①头文件

  1. #include<stdio.h>
  2. #define ERROR -1
  3. #define ElementType int
  4. typedef struct Node *PtrToNode;
  5. typedef PtrToNode Position;
  6. typedef struct QNode *Queue;
  7. struct Node { /* 队列中的结点 */
  8. ElementType Data;
  9. PtrToNode Next;
  10. };
  11. struct QNode {
  12. Position Front, Rear; /* 队列的头、尾指针 */
  13. int MaxSize; /* 队列最大容量 */
  14. };

②判断是否为空

  1. bool IsEmpty( Queue Q )
  2. {
  3. return ( Q->Front == NULL);
  4. }

③出队 

  1. ElementType DeleteQ( Queue Q )
  2. {
  3. Position FrontCell;
  4. ElementType FrontElem;
  5. if ( IsEmpty(Q) ) {
  6. printf("队列空");
  7. return ERROR;
  8. }
  9. else {
  10. FrontCell = Q->Front;
  11. if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */
  12. Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */
  13. else
  14. Q->Front = Q->Front->Next;
  15. FrontElem = FrontCell->Data;
  16. free( FrontCell ); /* 释放被删除结点空间 */
  17. return FrontElem;
  18. }
  19. }

六、实例

1.多项式加法运算

 

 

2.一元多项式的加法与乘法运算

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/866058
推荐阅读
相关标签
  

闽ICP备14008679号