数据结构我们学校这个寒假要求提前预习,推荐课程是浙江大学的数据结构,这个之前有看了第一单元,但由于大一水平有限,再加上自已意志力不足,看到第二单元有些看不懂就放弃了。现在大二了,现在是2022年1月18号,我从第二单元开始看的,现在每天在CSDN上做做笔记,以便以后复习。
线性表的抽象数据类型描述
- 初始化一个空线性表L
- 根据位序K,返回相应元素
- 在线性表L中查找X的第一次出现的位置
- 在位序i前插入一个新元素X
- 删除指定位序i的元素
- 返回线性表L的长度n
第一种 数组存储
1.初始化
List MakeEmpty() {
List PrtL;
PrtL = (List)malloc(sizeof(struct LNode));
PtrL->Last = -1;
return PtrL;
}
2.查找
int Find(ElementType X, List PtrL) {
int i = 0;
while (i <= PtrL->Last && PtrL->Data[i] != X)
i++;
if (i > PtrL->Last)
return -1;/*如果没找到,返回-1*/
else return i;/*找到后返回的是存储的位置*/
}
3.插入
for (j = PtrL->Last;j >= i - 1;j--)
PtrL->Data[j + 1] = PtrL->Data[j];
PtrL->Data[i - 1] = X;
PtrL->Last++;
return;
4.删除
void Delete(int i, List PtrL) {
int j;
if (i<1 || i>PtrL->Last + 1) {
printf("不存在第%d个元素", i);
return;
}
for (j = i;j < PtrL->Last;j++) {
PtrL->Data[j - 1] = PtrL->Data[j];
PtrL->Last--;
return;
}
}
第二种 链式存储
1.求表长
int Length(List PtrL) {
List p = PtrL;
int j = 0;
while (p) {
p = p->Next;
j++;
}
return j;
}
2.查找
(1)按序号查找
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;
else return NULL;
}
(2)按值查找
List Find(ElementType X, List PtrL) {
List p = PtrL;
while (p1 = NULL && p->Data != X)
p = p->Next;
return p;
}
3.插入
List Insert(ElementType X, int i, List PtrL) {
List p, s;
if (i == 1) {
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = PtrL;
return s;
}
p = FindKth(i - 1, PtrL);
if (p == NULL) {
printf("参数错误");
return NULL;
}
else {
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
4.删除
- 先找到链表的的第i-1个节点,用p指向;
- 再用指针s指向要被删除的结点(p的下一个结点)
- 然后修改指针,删除s所指的结点
- 最后释放s所指结点的空间
List Delete(int i, List PtrL) {
List p, s;
if (i == 1) {
s = PtrL;
if (PtrL != NULL) PtrL->Next;
else return NULL;
free(s);
return PtrL;
}
p = FindKth(i - 1, PtrL);
if (p == NULL) {
printf("第%d个结点不存在", i - 1); return NULL;
}
else if (p->Next = NULL) {
printf("第%d个结点不存在", i);return NULL;
}
else {
s = p->Next;
p->Next = s->Next;
free(s);
return PtrL;
}
}
广义表(以后再看)
- 广义表是线性表的推广
- 对于线性表而言,n个元素都是基本的单元素
- 广义表中,这些元素不仅可以是单元素也可以是另一个广义表。
多重链表(以后再看)
多重链表:链表的结点可能隶属于多个链