数据结构之线性表
一:定义
- 线性表(Linear List) :由同类型数据元素构成有序序列的线性结构
- 表中元素个数称为线性表的长度
- 线性表没有元素时,称为空表
- 表起始位置称表头,表结束位置称表尾
- 线性表的抽象数据类型描述
- 类型名称:线性表(List)
- 数据对象集:线性表是 n (≥0) 个元素构成的有序序列(a11,a22,…,ann)
- 操作集:线性表 L ∈ List,整数 i 表示位置,元素 X ∈ ElementType
1:线性表的顺序存储实现
注:顺序存储中是序号是下标,从 0 开始
last【当成数组位置】
|
0
|
1
|
2
|
i
|
1
|
2
|
3
|
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define ElementType int 4 #define MAXSIZE 10 5 typedef struct Lnode *List; 6 struct Lnode 7 { 8 ElementType Data[MAXSIZE]; 9 int last; 10 }; 11 //建立空的顺序表 12 List MakeEmpty() 13 { 14 List PtrL; 15 PtrL = (List)malloc(sizeof(struct Lnode)); 16 PtrL->last = -1; 17 return PtrL; 18 } 19 //查找 20 int Find(ElementType X,List PtrL) 21 { 22 int i = 0; 23 while(i<=PtrL->last && PtrL->Data[i]!=X) 24 { 25 i++; 26 } 27 if(i>PtrL->last) 28 { 29 return -1; 30 } 31 else 32 { 33 return i; 34 } 35 } 36 void Insert(ElementType X,int i,List Ptrl) 37 { 38 int j; 39 // 判断表满 40 if(Ptrl->last == MAXSIZE -1 ) 41 { 42 printf("表满"); 43 return; 44 } 45 //检查插入位置合法 46 if(i < 1 || i > Ptrl->last + 2) 47 { 48 printf("位置不合法"); 49 return; 50 } 51 for(j = Ptrl->last;j>=i-1;j--) 52 { 53 Ptrl->Data[j + 1] = Ptrl->Data[j]; 54 } 55 Ptrl->Data[i - 1] = X; 56 Ptrl->last++; 57 return; 58 } 59 void Delete(int i, List PtrL) 60 { 61 int j; 62 if (i < 1 || i > PtrL->last +1) 63 { 64 printf("不存在第%d个元素",i); 65 return; 66 } 67 for(j = i;j<=PtrL->last;j++) 68 { 69 PtrL->Data[j - 1] = PtrL->Data[j]; 70 } 71 PtrL->last--; 72 return; 73 }
线性表的链式存储实现
不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。
插入、删除不需要移动数据元素,只需要修改“链”。
注:链式存储中是序号是下标,从 1 开始
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef struct LNode* List; 4 struct LNode 5 { 6 List next; 7 ElementType data; 8 }; 9 List MakeEmpty() 10 { 11 List PtrL = (List)malloc(sizeof(struct LNode)); 12 PtrL = NULL; 13 14 return PtrL; 15 } 16 17 //求表长 18 int ListLength(List Ptrl) 19 { 20 List temp = Ptrl; 21 int j = 0; 22 while(temp) 23 { 24 temp = temp->next; 25 j++; 26 } 27 return j; 28 } 29 //按序号查找 30 List FindKth(int k,List Ptrl) 31 { 32 int i = 1; 33 List temp = Ptrl; 34 while(temp && i < k) 35 { 36 temp = temp->next; 37 i++; 38 } 39 if (i == k) 40 { 41 return temp; 42 }else 43 { 44 return NULL; 45 } 46 } 47 //按值查找 48 List Find(ElementType x,List Ptrl) 49 { 50 List temp = Ptrl; 51 while(temp!=NULL && temp->data!=x) 52 { 53 temp = temp->next; 54 } 55 if (temp) 56 { 57 return temp; 58 } 59 else 60 return NULL; 61 62 } 63 List Insert(ElementType X,int i ,List Ptrl) 64 { 65 List p, s; 66 if(i == 1) 67 { 68 s = (List)malloc(sizeof(struct LNode)); 69 s->data = X; 70 s->next = Ptrl; 71 return s; 72 } 73 p = FindKth(i - 1, Ptrl); 74 if(p == NULL) 75 { 76 printf("参数%d有误",i); 77 return NULL; 78 } 79 else 80 { 81 s = (List)malloc(sizeof(struct LNode)); 82 s->data = X; 83 s->next = p->next; 84 p->next = s; 85 return Ptrl; 86 } 87 } 88 List Delete(int i,List PtrL) 89 { 90 List p, s; 91 if(i == 1) 92 { 93 s = PtrL; 94 if(PtrL!=NULL) 95 { 96 PtrL = PtrL->next; 97 } 98 else 99 { 100 return NULL; 101 } 102 free(s); 103 return PtrL; 104 } 105 p = FindKth(i - 1 ,PtrL); 106 if(p == NULL) 107 { 108 printf("第%d个节点不存在",i-1); 109 } 110 else if(p->next==NULL) 111 { 112 printf("第%d个节点不存在",i); 113 } 114 else 115 { 116 s = p->next; //指向要删除的结点点 117 p->next = s->next; //从链表中删除 118 free(s); //释放删除的结点 119 return PtrL; 120 } 121 } 122 //Print 123 void Print(List Ptrl) 124 { 125 List temp = Ptrl; 126 while(temp) 127 { 128 printf("%d\n",temp->data); 129 temp = temp->next; 130 } 131 }