线性表的实现大致有两种方式:定长数组定义的定长线性以及指针定义的变长线性表。本文结合中国大学MOOC浙江大学的数据结构课程,对链表相关的基础知识进行了梳理和总结。
线性表表
定长链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| typedef int Position; typedef struct LNode *List;
#define MAXSIZE 100
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; }
bool Insert( List L, ElementType X, Position P ) { Position i; if ( L->Last == MAXSIZE-1) { printf("表满"); return false; } if ( P<0 || P>L->Last+1 ) { printf("位置不合法"); return false; } for( i=L->Last; i>=P; i-- ) L->Data[i+1] = L->Data[i]; L->Data[P] = X; L->Last++; return true; }
bool Delete( List L, Position P ) { Position i; if( P<0 || P>L->Last ) { printf("位置%d不存在元素", P ); return false; } for( i=P+1; i<=L->Last; i++ ) L->Data[i-1] = L->Data[i]; L->Last--; return true; }
|
变长链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List;
#define ERROR NULL Position Find( List L, ElementType X ) { Position p = L; while ( p && p->Data!=X ) p = p->Next; if ( p ) return p; else return ERROR; }
bool Insert( List L, ElementType X, Position P ) { Position tmp, pre; for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ; if ( pre==NULL ) { printf("插入位置参数错误\n"); return false; } else { tmp = (Position)malloc(sizeof(struct LNode)); tmp->Data = X; tmp->Next = P; pre->Next = tmp; return true; } }
bool Delete( List L, Position P ) { Position tmp, pre; for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ; if ( pre==NULL || P==NULL) { printf("删除位置参数错误\n"); return false; } else { pre->Next = P->Next; free(P); return true; } }
|
Last updated:
Thanks for your reading :) | URL
https://joshuaqyh.github.io/2019/02/04/数据结构-线性表/