易学c++链表学习

通过《易学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;

}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值