链表的创建和遍历算法

 

这篇文章来复习一下数据结构中的链表的创建和遍历。
以下为实现的代码:
// test.cpp : Defines the entry point for the console application.
//
#include "StdAfx.h"
#include "iostream.h"
struct node//定义结点的结构类型
{
char data;
node *next;
};

node *creat();//创建链表,返回表头,
void showlist(node *head);//遍历链表的函数,参数为表头

int main()
{
node *head;
head=creat();//以head 为表头创建一个链表
showlist(head);//遍历以 head 为表头的链表
return 0;
}

node *creat()
{
node *head=NULL;//表头指针,一开始没有任何结点,所以为 NULL
node *pEnd=head;//表尾指针,一开始没有任何结点,所以指向表头
node *pS;//创建新结点时使用的指针
char temp;
cout<<"Please input a string end with'#':"< do
{
cin>>temp;
if (temp!='#')
{
pS=new node;//使用 new 操作符后,会返回一个对应数据类型的指针,该指针指向了空间的首元素。
pS->data=temp;
pS->next=NULL;
if (head==NULL)
{
head=pS;
}
else
{
pEnd->next=pS;//这里的pEnd的值其实是上一个节点指针的值
}
pEnd=pS;
}
} while (temp!='#');
return head;
}
void showlist(node *head)
{
node *pRead=head;
cout<<"The data of the link list are:"< while(pRead!=NULL)
{
cout<data;
pRead=pRead->next;
}
cout< }


下面来说明一下上面的代码。

链表中的节点都是用一个结构体来表示的。一个节点就是一个结构体类型的一个变量。或者你也可以用类来代替,但是我从来没有用类来写过。
我们知道链表是一个节点指着另一个节点。但是要用代码真正的实现出来可没有像理解概念一样容易。

好了,现在要来创建链表了。思想:

1.为了获得链表的首地址我们定义了一个头结点,在第一次创建节点的时候,这个节点也就是首节点的地址必须要保存下来(一个链表的首地址你总的要有吧)。我们也就是用这个头结点地址变量,我觉得应该叫做一个普通的结构体指针变量来把它存储下来。
或者我们也可以不要这么做,我们也可以不定义这个结构体指针变量,我们可以定义一个布尔型变量,bool frist=true;然后判断是不是第一次,是的话if(frist){return ps;frist=false};就把第一个节点的地址还回了。就不要引入什么头节点,什么首节点这样乱七八糟,容易迷糊的概念出来了。

2.每当我们创建一个新节点的时候,我们需要把上一个节点中的指针域指向下一个也就是新建的这个节点,来完成一个链表的创建。可是当新建一个节点的时候上一个节点的指针变量ps会被销毁,然后新建节点的时候这个ps会被从新附上值。我们没有上一个节点的指针还怎么找到上一个节点的指针域呢?为了能够找到它,在上一个节点的指针要销毁的时候我们用一个指针变量将其保存下来。你看到上面是这么做的:node *pEnd=head;我觉得这名字也不应该这么取,什么尾节点一直指向最后一个节点,这样指来指去,很容易糊涂。就是为了得到上一个指针的指针域,需要一个指针变量保存上一个节点的指针,这样想会简单一点。

遍历链表相对来说就比较容易了。你只要得到链表的首节点的指针,先输出该节点的数据,然后重置改节点的指针,也就是得到下一个节点的指针如pRead=pRead->next;循环下去就行了。

你可能感兴趣的:(链表的创建和遍历算法)