5+从头到尾打印链表中的节点

来源:互联网 发布:淘宝联盟用优惠卷 编辑:程序博客网 时间:2024/06/05 23:55
struct linkNode
{
    int m_value;
linkNode *next;
};


title:

一、从尾到头打印单链表list
二、对链表头部进行操作


thought:
一、
1、利用栈,从头开始依次将链表中的value压入栈,
   然后再一次弹出栈顶元素,实现反向打印链表
2、利用递归,每次访问结点时,先递归输出它后面的结点
二、
对头部做处理时,有两种方法
1、创建一个新的空指针p(类型与结点指针一样)p->next = list;
    然后可对list的头结点做插入或删除操作,但是操作函数要有返回值
    返回值就是p->next(需要熟练掌握此种方法)
2、对头结点的操作函数如果没有返回值,则其参数应该是指向链表list的指针
   即指向指针的指针,linkNode* link=list,此时(*link)->next 等价于list->next;
   如果参数是list,则对头结点的操作只在此函数中有效,操作结果不保存,
   离开此函数,这些操作产生的结果无法显示
realize:

一、

利用栈

1、先创建一个元素为链表结点的栈stack<linkNode *> nodes
   栈的元素类型设置为链表结点的类型
2、链表元素依次压入栈push
3、依次取(top)栈顶元素(top()返回此栈顶元素即结点指针),
   输出此结点的数据元素

   将此结点指针弹出pop(pop()无返回值)


二、

递归

#include<iostream>#include<stack>#include<iomanip>using namespace std;struct linkNode{    int m_value;linkNode *next;};linkNode *create(int ); //创建新链表linkNode *AddToHead_k(linkNode * ,int );  //向头结点插入,注意对头结点的处理linkNode *delete_k(linkNode * ,int );    //删除结点,注意对头结点的处理void inverse_print(linkNode *link); //利用栈的先进后出实现链表的反序输出void inverse_print_rescurise(linkNode *link); //递归实现链表的反序输出void print(linkNode *link);linkNode *create(int N){linkNode *p = new linkNode;p->next = NULL;linkNode *head = p;int k;for(int i = 1;i <= N;i++){cout << "输入第" << i <<"个数据:";while(!(cin >> k)){cout << "输入的不是数据,请重新输入:";cin.clear();cin.sync();}linkNode *temp = new linkNode;temp->m_value = k;temp->next = NULL;p->next = temp;p = temp;}return head->next;}linkNode *AddToHead_k(linkNode *link,int k){linkNode *head = new linkNode; //当涉及到对链表的头结点进行操作时,创建一个指针head(虚)用来指向处理的链表,但是此操作要有返回值:最后要返回head->nextif(NULL == link){linkNode *p = new linkNode;p->m_value = k;p->next = NULL;link = p;}else{linkNode *p = new linkNode;p->m_value = k;p->next = link;link = p;      }head->next = link;return head->next;}linkNode *delete_k(linkNode *link,int k){bool found = false;linkNode *p = link;linkNode *temp = NULL;if(NULL == link){cout << "链表为空!" << endl;return NULL;}if( p->m_value == k)              //头结点数据等于k时,对头结点进行操作(创建一个空指针head){linkNode *head = new linkNode;found = true;head->next = p->next;temp = p;cout << "头结点数据元素等于" << k << endl;delete temp;temp = NULL;                //将temp设置为NULL 是为了防止temp变成野指针return head->next;}while (p->next != NULL && p->next->m_value != k)   p = p->next;if(p->next != NULL && p->next->m_value == k){found = true;temp = p->next;p->next = p->next->next;delete temp;temp = NULL;                //将temp设置为NULL 是为了防止temp变成野指针}if(found)cout << k << "在单链表中。" << endl;elsecout << k << "不在单链表中。" << endl;return link;}void inverse_print(linkNode *link){if(NULL == link)return;stack<linkNode *> nodes;              //创建一个栈,其元素是链表的结点,元素类型即linkNodelinkNode *p = link;while(p != NULL){nodes.push(p);p = p->next;}while ( !nodes.empty()){p = nodes.top();      //取栈顶元素,top的返回值是栈顶元素,而pop是直接输出(弹出)栈顶元素,返回值为void(即无返回值)cout << setw(3) << p->m_value;nodes.pop();}cout << endl;}void inverse_print_rescurise(linkNode *link){if(NULL == link)return;if (link->next != NULL)inverse_print_rescurise(link->next);cout << setw(3) << link->m_value;}void print(linkNode *link){if(NULL == link)cout << "链表为空!" << endl;linkNode *p = link;while (p != NULL){cout << setw(3) << p->m_value;p = p->next;}cout << endl;}int main(){linkNode *list = create(3);//linkNode *head = list;//head是指向指针list的指针cout <<"正向输出单链表中的数据元素:" << endl;print(list);cout <<"逆向输出单链表中的数据元素:" << endl;//inverse_print(list);inverse_print_rescurise(list);cout << endl;cout << "输入待添加的数据:";int add;cin >> add;linkNode *list_add =  AddToHead_k(list,add);print(list_add);cout << "输入待删除的数据:";int k;cin >> k;linkNode *list_del = delete_k(list,k);cout << "删除数据元素" << k <<"后的单链表:" << endl;print(list_del);return 0;}


0 0
原创粉丝点击