#include<iostream>
using namespace std;
typedef struct LinkNode {
int data;
LinkNode* next;
}LNODE, * PNODE;
typedef struct LinkList {
PNODE head;
int length;
}Llist ;
//初始化
Llist* Initlist() {
Llist* mylist = new Llist; //申请空间
mylist->length = 0;
mylist->head = new LNODE;
mylist->head->data = 0;
mylist->head->next = NULL;
return mylist;
}
//判空单链表
void isEmpty(Llist* list) {
if (list == NULL)
cout << "链表已空!";
else {
cout << "链表未空!";
}
}
//清空单链表
void Emptlize(Llist* list) {
list->length = 0;
cout << "链表已经清空!";
}
//销毁(删除)单链表
void DestroyList(Llist* list) {
list = NULL;
cout << "链表已被销毁!";
}
//获得链表的长度
int SizeList(Llist* list) {
if (list == NULL) {
cout << "链表已空长度为0";
}
int i = 1;
PNODE pCurrent = new LNODE;
pCurrent = list->head->next;
while (pCurrent != NULL) {
pCurrent = pCurrent->next;
i++;
}
return i;
}
//返回第一个节点
void* Returnfirst(Llist* list) {
return list->head->next;
}
//插入元素(找到前驱)
void Insertelem(Llist* list, int data, int pos) {
if (list == NULL)
return;
if (!data)
return;
if (pos<0 || pos>list->length) {
pos = list->length;
}
PNODE s = new LNODE;
s->data = data;
s->next = NULL;
PNODE pCurrent = list->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
s->next = pCurrent->next;
pCurrent->next = s;
list->length++;
}
//删除元素(找到前驱)
void Deleteelem(Llist* list, int pos) {
if (list == NULL)
return;
if (pos<0 || pos>list->length) {
pos = list->length;
}
PNODE pCurrent = new LNODE;a
pCurrent = list->head;
for (int i = 1; i <pos; i++)
{
pCurrent = pCurrent->next;
}
PNODE pDel = pCurrent->next;
pCurrent->next = pDel->next;
free(pDel);
list->length--;
}
//根据位置查找元素(返回元素值)
int FindByPos(Llist* list, int pos) {
if (list == NULL) {
exit(1);
}
if (pos<0 || pos>list->length) {
cout << "没有该元素的位置";
}
PNODE pCurrent = new LNODE;
pCurrent = list->head->next;
int i = 0;
while (i != pos) {
pCurrent = pCurrent->next;
}
return pCurrent->data;
}
//根据值查找元素的位置 (返回位置)
int FindByValue(Llist* list, int data) {
if (!data) {
cout << "没有该数字";
exit(1);
}
PNODE pCurrent = new LNODE;
pCurrent = list->head->next;
int i = 1;
while (pCurrent != NULL) {
pCurrent = pCurrent->next;
i++;
if (pCurrent->data = data) {
break;
}
}
return i;
}
//打印并遍历当前单链表
void Traverse(Llist* list) {
if (list == NULL) {
return;
}
PNODE pCurrent = new LNODE;
int i= 0;
pCurrent = list->head->next;
while (pCurrent != NULL) {
i++;
cout << pCurrent->data<<" ";
pCurrent = pCurrent->next;
}
}
int main() {
int data, i, n;
Llist* mylist = Initlist();
cout << "单链表创建成功,接下来你想插入几个元素?";
cin >> n;
cout << "那么这" << n << "个元素分别是?";
for (i = 0; i < n; i++)
{
cin >> data;
Insertelem(mylist, data, i);
}
cout << "您输入的元素遍历后是:";
Traverse(mylist);
cout << "你想删除第几个元素?";
cin >> n;
Deleteelem(mylist, n);
Traverse(mylist);
cout << "现在返回第一个元素节点";
Returnfirst(mylist);
}
其实也不算是一个博客,更像是一篇日志:上面是代码展示,基本把可以实现的ADT都自己手敲了一遍,估计只有我学了几个月C语言和C++今天才整出一个自己写的代码,555不过终究还是相信努力会有回报,有几个ADT没有在main函数里面体现的。关于这个如何从平常的C语言跳到比较”高阶“的数据结构,会比较难,建议搞清楚几个概念再来自己手撸一遍这样的代码
1、结构体的关键词 什么是typedef 什么是struct 两个连起来用会怎么样
2.结构体运用的作用是什么?这个概念我觉得单独看会比较难,可以将理解为类比为C++和java的类,(因为我认为学面向对象对于人类来说是更好理解的)其实结构体和类一样,目的就是用一种抽象的数据类型将其包装起来,例如你手中有苹果 西瓜 草莓,而你把他抽象化成:“水果”,这就是一种封装的思想,而这水果就是结构体,就是类,就是抽象数据类型,水果中的苹果,西瓜,草莓,就是结构体里面的数据类型(相当于起到一个打包的作用)
3.指针,其实C语言也没学懂,C++也没咋地的我强烈认为:指针这个东西的概念一定要弄明白,指针就是放地址的东西,至于为什么说学指针难,涉及到的就是和内存有关的东西了
4.内存,强烈建议学指针先搞明白电脑里面是怎么分配内存这个东西的,对你学好指针,动态的内存分配显得尤为重要。
5.你把1234慢慢地参透,感觉你就可以开始学这个了,有些人一天就懂了,有些人三天就懂了。这东西也不是因人而异的,说白了,你天天往这个地方砸时间,多看别人的文章,CSDN这么多好人,一个个地帮忙去问,他们都很热心,真的投入个两星期,我觉得你学的比我还快,我之前快走了5个月的弯路,现在才慢慢地有了眉目,希望有问题的小伙伴少走弯路吧(毕竟东西你学了却学不进去的感觉是很难受的)(还要考试,你想逃避,于是天天干别的,这样不行,听我的一定要改正!)