链式存储(链表实现)
本文很简单,适合链表初学者(其实我也学过不久,理解的高度还很低,欢迎大佬批评指正!也欢迎小萌新来问我不理解的问题,但是我只写了主要函数,都没有将运行页面放上来,因为最近心情低迷,做事情及其不振呜呜呜呜呜,希望快快好起来,开学没有太久还影响不大)
1.构造结构体:
通过指针实现,Data为链表的数据,Next为指针指向下一个数据。
typedef struct LNode* List;
struct LNode {
ElementType Data;
List Next;
};
2.求表长:
对于链表,我们只知道头指针,求表长通过临时指针p来遍历链表来实现,函数形参为头指针哦。
int Length(List PtrL)
{
List p = PtrL;
int j = 0;
while (p) {
p = p-> Next;
j++;
}
return j;
}
3.按序号查找:
可以称之为一个抽象的遍历,但要注意遍历条件,①头指针为空时。②只有头指针时。
List FindK(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;
}
4.按值查找:
也是一个抽象的遍历,同时也要注意遍历条件(未指明)。
List Find(ElementType x, List PtrL)
{
List p = PtrL;
while (p != NULL && p->Data != x)
p = p->Next;
return p;
}
5.插入操作实现函数:
插入时,要注意创建一个新空间,将插入的数据给到这个空间,即为s,将我要插进去新数据的指针s->Next指向新数据前一个数据的指针p指向的数据p->Next,再将p->Next指向s。同时也要注意条件:①要插入的数据是头指针的位置时。②头指针为空时。
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 = FindK(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;
}
}
6.删除操作实现函数:
这时要注意释放空间!!!设要删除的数据是s,其前一个数据为p,只需让p的指针指向s->Next,然后释放s空间,也要注意条件哦!
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 = FindK(i - 1, PtrL);
if (p == NULL)
{
cout << "第" << i - 1 << "个结点不存在哦!" << endl;
}
else if (p->Next == NULL) {
cout<< "第" << i << "个结点不存在哦!" << endl;
}
else {
s = p->Next; p->Next = s->Next;
free(s);
return PtrL;
}
}