hello,MIss and gentlemen
我在整理以前的学习笔记,所以我的博客目前没有顺序之说,请切记,它只是个学习记录,我只希望他能给每个人一点点帮助就好了,一点帮助汇集在一起也是河流,毕竟我的水平很一般,我有自知之明。
最近我经常有意的在句子里面引用英语,因为四六级的考试让我很是头疼,而且我发现敲代码敲的好一点的人他英语是很好的,后来痛定思痛更改,我也经常偷懒,所以我要强迫自己多写英语,因为我在18岁以前英语是零基础,所以接下来英语不好的小伙伴看我的博客会很头疼,但我觉得只有直面恐惧,直面最黑最恶的事情和物品,我们才能获得真正意义上的进步,形而上者谓之道,形而下者谓之术,所谓红尘中历练,学习了很多生存的技能,磨破了脚,最终道心也在不知不觉中圆满。
我喜欢那句话,道可道,非恒道,名可名,非恒名。
直面英语,别怕,尤其是男生,打个不切当的鸡血,想想一些女生靠个英语压你一头的事情,一门英语就可以化解你理科的全面领先,一力破万法,这行吗?显然不行,我们不光要在英语上让他们觉得我们行,我们牛,更要在身体上让他们感觉行,我们牛,我们真大。
head file,everyone懂得都懂,嘻嘻。
typedef int DataType;//typedef give object a alias
#define Node element//here's the same thing
const int ERROR=NULL;//I went for the striking visual effect,wrong name uppercase
create a node class(创建一个结点类)
class Node
{
public:
int data;
Node *next;
}
To summarize ,first of all,
create a Node class, Inside are fields for pointers and data
we have to think about what this list does
whatever you want to do
class linkList
{
public:
linkList();// initialize
you bet,有始有终,so
~linkList();//destruction of the link list
secondly
void createLinkList(int n);//first of all,create a link list
and then
element *find(DataType data);//find the Node
next
void InsertElementAtIndex(DataType data,int n);
finally
deleteAll();
private:
elemType *head;
提到单链表,你脑子里就应该出现这些,so easy。
this is the must basics
我在下面的member function省略了作用域,毕竟头文件和源文件分离好处多多
think代码可读性不错,外加时间有限,所以讲解较少,有不懂的可以直接在底下问我,知无不言,言无不尽。
linkList()
{
head=new elemType;
head->data=0;
head->next=NULL;
}
~linkList()
{
delete head;
}
上面是构造函数,和析构函数,懂得都懂,嘻嘻
void createLinkList(int n);
{
element *pnew,*ptemp;//a 新的指针,a 临时变量
ptemp=head;
if(n<0)
{
cout<<"输入的结点有误"<<endl;
exit(EXIT_FAILURE)//程序异常退出
}
for(int i=0;i<n;n++
{
pnew =new eleType;
cout<<"请输入第"<<i+1<<"个值"<<endl;\
cin<<pnew->data;//注意这个,这个是用户输入的玩意应该放在哪里?
pnew->next=NULL;
ptemp->next=pnew;
ptemp=pnew;
这里有点像冒泡排序,ptemp你可以理解成老结点,pnew则是新结点,利用调换以实现将值一个一个插入单链表中,if you have不懂得,一是留言问我,二是再回去复习一下有关C++的类和结构体另外再看一下冒泡排序法,这个我接下来也会更新,都是以前写的,我会搞得。
}
}
我们丰富一下这个程序的一些功能。
for instance
first of all : added traversal of linked lists
secondly: gets the length of a single linked list
and then check whether the single-linked list is empty
我们一下子插入了三个,所以对应的我们头文件里面就得多加三个成员函数。为了节省时间,我直接在底下写方法,就不特意到源文件那写了
void traversalLinkList();
{
if(head==NULL||head->next==NULL)
{
cout<<"链表为空表"<<endl;
}
elemType *p =head;
while(p->next!=NULL)
{
p=p->next;
cout<<p->data<<"";
}
}
int getLength()
{
int count =0;
elemType *p=head->next;
while(p!=NULL)
{
count++;
p=p->next;
}
return count;
}
bool isEmpty()
{
if(head->next==NULL)
{
return true;
}
return false;
}
这三个很简单。
一个程序员听到一个数据结构应该迅速反应出最基本的几个用法接下来在回想起基本的拓展用法,这才正常,有个主次关系的。
查找结点,find Node前面我们说过,也是基本用法之一。
elemType* find(dataType data)
{
elemType*p=head;
if(p==NULL)
{
cout<<""<<endl;
return ERROP;
}
else
{
while(p->next!=NULL)
{
if(p->data==data)
{
return p;
}
p=p->next;
}
return NULL;
}
}
写到这里我们有没有想过对data做点什么,如果想过,那么恭喜你,你学编程很有天赋,加油。
在尾部插入指定元素和在头部插入指定元素,以及一个基础拓展,在指定位置插入指定元素,so
my head began to heat,请原谅我的口吻有点像一个teacher,因为我真的无师自通,我写的日记也好学习笔记也好,都不像笔记,更像是我在给自己讲课,我吧一些资料也总结了后,一些解释和串联的话的口吻太像一个老师了,真的假如你不了解我的话,你还以为我的笔记是从哪里抄的或者复制粘贴的,说真的,我很苦恼,我并不喜欢当老师,就不细说为什么,总之,哦,上帝啊,我想你可能吧写我的思维时,打了个盹,写出bug了。
题外话啦,哈哈
关于 how 搞定插入元素的问题。
void inserElemAtEnd(dataType data)
{
elemType* newNode= new ElemType;
先定义一个新结点的指针,等下直接狠狠的插入,哦耶。
newNode->data=data;
newNode->next=NULL;
elemType*p=head;
if(head==NULL)
{
head==newNode;
}
else
{
while(p->next!=NULL)
{
p=p->next;
}
p->next=newNode
}
}
上面那个是尾部插入,下面这个是头部插入
void insertElemAtHead(dataType data)
{
elemType* newNode=new elemType;
newNode->data=data;
elemType*p=head;
if(head==NULL)
{
head=newNode;
}
newNode->next=p->next;
p->next=newNode;
}
指定位置插入呢
void insertElemAtIndex(datatype data,int n)
{
if(n<1||n>GetLength())
cout<<"输入的值错误"<<endl;
else
{
ElemType*ptemp=new elemType;//创建新结点
ptemp->data=data;//定义数据域
elemType*p=head;
int i=1;
while(n>i)//他遍历到一个指定位置,
{
p=p->next;
i++;
}
ptemp->next=p->next;
p->next=ptemp
}
}
结点的指针域存放着下一个结点的地址,它本身也被上一个结点的指针域的指针指着
至于删除数据的方法呢,其实很简单,只需要找到那个结点删掉后就行,区别只有三个,尾部和头部以及其他位置。如果你认真看了我上面文章并掌握,你肯定明白,加油陌生人,这个笔记既是为了我回忆一下原来的知识点,也能帮助到一些人,仅仅帮助到一丢丢,我就很满足了,略尽绵薄之力,谢谢。