严奶奶版数据结构,我用C写一直报错,后来发现C中没有引用,只有指针。为了还原原版的味道.这里创建了.cpp的文件,加上了#include<cstdio>和#include<cstdlib>两个头文件,来还原原汁原味的严奶奶版数据结构中的算法。
/*线性表*/
#include<cstdio>
#include<cstdlib>
#define ElemType int
#define Status int
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode,*LinkList;
链表初始化
Status InitList_L(LinkList& L) {
L = new LNode;
L->next = NULL;//第个节点为空
return 0;
}
查找第i个数的位次 p29 算法2.8 需要定义p、和j
Status GetElem(LinkList& L, int i, ElemType e) {
LinkList p = L->next;//初始化,p指向第一个节点
int j;
j = 1;
while (p && j < i) {
p = p->next;
++j;
}
if (!p || j > i) {
printf("该元素在链表L中不存在!");
return 0;
}
e = p->data;
printf("第%d个元素的值为:%d", i, e);
return 0;
}
在链表L第i个元素前插入元素e
Status ListInsert_L(LinkList& L,int i, ElemType e) {
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;//沿着指针去寻找元素i的前一个结点
j++;
}
//这时p的值为元素i的前一个值所在内存的地址
if (!p || j > i - 1) printf("链表L中查无此值"); return 0;
LinkList s = new LNode;
s = (LinkList)malloc(sizeof(ElemType));//生成新结点用于插入新元素
s->data = e;//新节点的指针域赋值
s->next = p->next;//将e插入链表L中
p->next = s;
printf("元素%d插入成功!", e);
return 0;
}
删除链表L中的元素i,并由e返回其值
Status ListDelete_L(LinkList& L, int i, ElemType e) {
LinkList p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
++j;
}
if (!(p->next) || j > i + 1) printf("链表L中没有该元素!"); return 0;
LinkList q = p->next;//新建结点用于存储需要删除的元素i
p->next = q->next;//相当于 p->next是指向了i的地址,q存储了i的地址,q->next就是q指向了i下一个元素的地址
e = q->data;
free(q);//回收结点q
printf("删除元素%d成功!", e);
return 0;
}
逆序创建链表L
void CreateList_L(LinkList& L, int n) {
InitList_L(L);
int i;
for (i = 0; i < n; i++) {
LinkList p = new LNode;//新建一个结点
scanf_s("%d", &p->data);
p->next = L->next;//L->next 头结点指针
L->next = p;
}
printf("链表创建成功!");
}
查找链表L中第一个值与元素e相等的元素位序
Status LocateElem(LinkList& L, int i, ElemType e) {
LinkList p = L->next;
int i, j;
i = 1; j = 0;
while (p != NULL) {
if (p->data == e) {
j = 1;
break;
}
p = p->next;
i++;
}
if (j) {
printf("元素%d在链表L中的位序是:%d\n", e, i);
}
else {
printf("链表L中没有该元素!");
}
return 0;
}
将链表L置为空表
Status ClearList_L(LinkList& L) {
if (L->next = NULL) L->next = NULL;
printf("链表置空成功!!");
return 0;
}
查找链表L中元素cur_e的前驱并用pre_e返回
Status PriorElem_L(LinkList& L, ElemType cur_e, ElemType pre_e) {
LinkList p = L->next;
if (p->data = cur_e) {
printf("元素%d是第一个元素,第一个元素没有前驱!", cur_e);
return 0;
}
while (p && p->data != cur_e) {
pre_e = p->data;
p = p->next;
}
printf("在链表L中元素%d的前驱是%d\n", cur_e, pre_e);
return 0;
}
//查找链表L中元素cur_e的后继元素,并用next_e返回该值
Status NextElem_L(LinkList L, ElemType cur_e, ElemType next_e) {
LinkList p = L->next; //初始化,p用于指向第一个结点
while (p && p->data != cur_e) {
p = p->next;
}
if (p->next == NULL) {
printf("元素%d是第最后个元素,第一个元素没有后继!\n", cur_e, next_e);
}
else {
next_e = p->next->data;
printf("在链表L中元素%d的后继是%d\n", cur_e, next_e);
}
return 0;
}
int main() {
/*此处省略10000字*/
}
main交给各位写了,我实现了没有问题的,有问题的请联系我。
学艺不精,若有错误还请多多指教,谢谢。
p.s.在使用Visual Studio编译器的时候输入scanf()方法要用scanf_s()
更多内容请移步公众号 手撕算法。谢谢
算法爱好者协会群:940100543,加入学习讨论。
所使用编译器为:Visual Studio2019 链接:https://pan.baidu.com/s/1eg8CNrqrP1jn7GRzHfYXxA
提取码:1234
推荐新手使用dev cpp 链接:https://pan.baidu.com/s /1XZp_8lVE7X6tMLmvXRbYhw
提取码:1234