struct linkNode
{
int m_value;
linkNode *next;
};
二、对链表头部进行操作
thought:
一、
1、利用栈,从头开始依次将链表中的value压入栈,
然后再一次弹出栈顶元素,实现反向打印链表
2、利用递归,每次访问结点时,先递归输出它后面的结点
二、
对头部做处理时,有两种方法
1、创建一个新的空指针p(类型与结点指针一样)p->next = list;
然后可对list的头结点做插入或删除操作,但是操作函数要有返回值
返回值就是p->next(需要熟练掌握此种方法)
2、对头结点的操作函数如果没有返回值,则其参数应该是指向链表list的指针
即指向指针的指针,linkNode* link=list,此时(*link)->next 等价于list->next;
如果参数是list,则对头结点的操作只在此函数中有效,操作结果不保存,
离开此函数,这些操作产生的结果无法显示
realize:
栈的元素类型设置为链表结点的类型
2、链表元素依次压入栈push
3、依次取(top)栈顶元素(top()返回此栈顶元素即结点指针),
输出此结点的数据元素
{
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->next
if(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;
else
cout << k << "不在单链表中。" << endl;
return link;
}
void inverse_print(linkNode *link)
{
if(NULL == link)
return;
stack<linkNode *> nodes; //创建一个栈,其元素是链表的结点,元素类型即linkNode
linkNode *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;
}