“ Ctrl AC!一起 AC!”
目录
线性表
定义
抽象数据结构类型描述
顺序储存
主要实现方式:利用数组的连续储存空间顺序存放线性表的各元素。
代码描述:
struct LNode {
ElementType Data[MAXSIZE];
int Last;//Last是指向线性表最后的一个元素的下标
};
typedef struct LNode* List;
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i]或PtrL->Data[i]
线性表的长度:L.Last+1或PrtL->Last+1
顺序储存主要操作
1.建立空的顺序表:
List MakeEmpty() {
List PtrL;
PtrL = (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//表示没找到
else return i;//返回储存位置的下标
}
3.插入元素到位置i:
void Insert(ElementType X, int i, List PtrL) {//把X查到线性表的第i个位置(时刻注意位置与下标的关系)
//先处理两种特殊情况:
int j;
if (PtrL->Last == MAXSIZE - 1) {
cout << "表满了" << endl;
return;
}
if (i<1 || i>PtrL->Last + 2) {
cout << "位置不合法" << endl;
return;
}
//移动元素,腾出空间
for (j = PtrL->Last; j >= i - 1; j--) {
PtrL->Data[j + 1] = PtrL->Data[j];
}
PtrL->Data[i - 1] = X;
PtrL->Last++;//最后一个元素的下标加一
return;
}
4.删除第i个元素:
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;
}
链式储存
主要实现方式:链表
代码描述:
typedef struct LNOde* List;
struct LNode {
ElementType Data;
List Next;
};
struct LNode L;
List PtrL;
链式储存主要操作
1.求表长:
int Length(List PtrL) {
List temp = PtrL;
int len = 0;
while (temp) {
temp = temp->Next;
len++;
}
return len;
}
2.查找第K个结点:
List FindKth(int K, List PtrL) {//找第K个结点
List temp = PtrL;
int i = 1;
while (temp != NULL && i < K) {
temp = temp->Next;
i++;
}
if (i == K) return temp;
else return NULL;
}
3.查找值为X的结点:
List FindX(ElementType X, List PtrL) {
List temp = PtrL;
while (temp != NULL && temp->Data != X) {
temp = temp->Next;
}
return temp;
}
4.插入到第i-1个结点的后面,即放到第i个位置
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) {
cout << "错误" << endl;
return NULL;
}
else {
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
5.删除第i个位置的结点(先要找到第i-1个结点的位置)
List Delete(int i, List PtrL) {
List p, s;
if (i == 1) {
s = PtrL;
if (PtrL != NULL) PtrL = PtrL->Next;
else return NULL;
free(s);
return PtrL;
}
p = FindKth(i - 1, PtrL);
if (p == NULL || p->Next == NULL) {
cout << "结点错误" << endl;
return NULL;
}
else {
s = p->Next;
p->Next = s->Next;
free(s);
return PtrL;
}
}
广义表
定义
代码实现
多重链表
感谢阅读!!!
“ Ctrl AC!一起 AC!”