通过《易学C++》学习的链表理解的总结:
在书中对链表的实现和操作做了一个形象的描述,首先介绍链表是一个顺序相连接的链条,类似于自行车车链,一环套一环,链表是一个单向可遍历的,只能通过从头开始,逐个遍历的过程来实现链表节点(node)的查找过程。
实现链表,首先要明晰一个节点的概念,一个节点,首先要有一个保存数据的内存空间,然后包含一个指向下一个节点的指针。所以,定义一个结构类型,命名为node。
struct node
{
char data;
node *next;
};
char类型的data用来接收链表节点上存储的数据;
node结构的指针next,用来指向下一个节点的地址,因为下一个节点也是一个node,存储空间也是需要一个node的大小,所以要用一个节点指针指向,要是用个整形指针指向当然就错了。
然后就是需要定义的方法,对待链表,
首先要实现的是创建链表,
然后要实现的是对链表信息的显示,
然后要实现的是对链表信息的插入,
然后要实现的是对链表信息的删除。
所以分别要定义以下的方法,
createList();
showList();
insertList();
deleteList();
createList();要实现的是创建一个新的链表,而链表只需要返回一个头节点的地址就可以完成整个列表的操作了,这样的情况下就只需返回一个创建好的节点的地址就可以了。
列表创建需要知道头结点,pHead,
需要知道尾部节点,pEnd;
需要有一个临时节点用来传递数据,pTemp;
需要一个变量来接受数据;
所以如下定义createList:
node *createList()
{
node *pHead = NULL;
node *pEnd=pHead;
node *pTemp;
char c;
cout<<“input the string with a “#” in the end”<<endl;
do
{
cin>>c;
if(c!=‘#’)
{
//此处需要新开辟一个空间用来创建新的节点,因为node *pTemp语句在创建pTemp的时候只是创建了一个节点空间,只能创建一个节点,当接收新的字母形成新的节点的时候就没有空间了,所以要动态地赶紧给他分一个空间.
pTemp = new node;
pTemp->data = c;
pTemp->next = NULL;
if(pHead = NULL)
{
pHead = pTemp;
pEnd = pHead;
}
else if()
{
pEnd->next = pTemp;
pEnd = pTemp;
}
}
}
while (c!=‘#’);
return pHead;
};
showList的实现,只是用来display这个链表的内容,所以返回类型用void就可以了,设置一个形参,用来传递要读的那个链表;
void showList(node *head)
{
int i = 0;
node *sHead;
for(sHead=head;sHead !=NULL;sHead = sHead->next)
{
cout<<“the ”<<i+1<<“ char in the Linklist is”<<sHead->data<<endl;
}
}
要想实现insert首先要实现的是一个findList的功能,就是要查找到对应的节点,然后再返回该节点的指针。
node *findList(node *head)
{
char insertC;
cout<<“please input the char after which you wanna insert a char”<<endl;
cin>>insertC;
node *pFind;
pFind = head;
while(pFind != NULL)
{
if(pFind->data != insertC)
{
pFind = pFind->next;
}
else
{
break;
}
}
cout<<pFind->data;
return pFind;
}
insertList的实现,insertList的过程是一个插入的过程,应该是首先定位要插入的位置,这一个通过链表的搜索实现,然后在需要插入的节点的位置,首先创建一个新的node,nTemp,相当于开辟了一个新的内存,用来存储新插入的数据,nTemp->data=c;nTemp->next
insertList(node *head)
{
node *pInsert;
pInsert=findList(head);
}
//
// main.cpp
// linkList
////
#include <iostream>
using namespace std;
//以下代码创建一个节点的结构体;
struct node
{
char data;//开辟一个data内存用来存储节点数据
node *next;//开辟一个指针变量用来指向下一个节点的位置,类型为节点结构类型的指针,指向的内存段是一个节点。
};
node *Create();//定义Create方法,用来创建节点,返回的是一个节点类型的指针;
void showList(node *head);//显示链表内容的方法,参数为一个节点的头指针。
int main()
{
node *head;//新建一个节点头指针,用来存储创建的链表的头指针
head=Create();//用新建的节点指针head来接收Create返回的头指针;
showList(head);//将参数传递给showlist方法来显示链表内容
return 0;
}
//创建链表的方法实现
node *Create()
{
node *head = NULL;//新创建一个头指针用来指向链表的头地址
node *pEnd = head;//新建一个尾指针,一直在链表的最后
node *ps;//新建一个临时指针,用来传递
char temp;//新建一个临时字符变量temp,用来接收键盘输入并传递给node中的data
cout<<"Please input the string end with #"<<endl;
do
{
cin>>temp;
if(temp != '#')
{
ps = new node;//新开辟一个空间给ps
ps->data = temp;//ps的数据接收键盘输入
ps->next = NULL;//ps的next指向是空,当前的ps指针就相当于是最后一个指针也就是pend,剩下的工作是把ps的内容传递给pend;
if(head == NULL)//如果接收第一个信息的时候链表还是个空的,那么就将ps直接给了head,就是将head指向ps所指的那个内存段。
{
head = ps;
}
else//如果head不是空的那么就需要将ps的信息转移给pend,因为ps还要腾出来去指下一个输入时候的新的内存空间。
{
pEnd->next = ps;//pend中其实是包含了两个指针,pend自身是一个指针,指向的是自己所代表的节点的内存位置,他的next就指向当前的最后一个节点的内存位置,也就是ps指向的位置。
}
pEnd = ps;//在安排好倒数第二个的next指向之后,pEnd开始挪到最后的位置。
}
}
while (temp != '#') ;
return head;
}
void showList(node *head)
{
node *pRead = head;//给showlist传递一个实参,就是需要读的链表的头指针
cout<<"the data of the linklist are:"<<endl;
while (pRead != NULL)//开启一个判断,加入头指针不是指向空,那么就开始输出头文件的data,然后将pread的指针指向下一个,再开启一个循环。
{
cout<<pRead->data<<endl;
pRead=pRead->next;
}
cout<<endl;
}