#include "stdafx.h"
#include <iostream>
#include <string>
#include <stack> //二叉树遍历时使用栈
#include <queue> //二叉树层次遍历时使用
using namespace std;
//单链表操作
class Node
{
public:
Node *next;
Node *front; //双向链表时指向前驱节点的指针
int data;
};
Node *head=NULL; //头指针 全局变量
Node *rear=NULL; //队列的尾指针
void create_list()
{
Node *p1,*p2;
int index=0;
int data;
while(1)
{
cout<<"请输入链表的第"<<++index<<"个数据(输入负数表示结束链表创建):";
cin>>data;
if (data<0&&index==1) //空链表时输入负数
{
return;
}
else if (data<0) //非空链表时输入负数
{
break;
}
p1=new Node;
p1->data=data;
if (index==1) //空链表时输入有效数据
{
head=p1;
}
else
p2->next=p1;
p2=p1;
}
p2->next=NULL;
}
void show_list(Node *head)
{
int index=0;
Node *p=head;
if (head==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
while(p)
{
cout<<"链表的第"<<++index<<"个数据为:"<<p->data<<endl;
p=p->next;
}
}
int length_list(Node *head)
{
Node *p=head;
int length=0;
if (head==NULL)
{
cout<<"链表为空!"<<endl;
return length;
}
while(p)
{
length++;
p=p->next;
}
return length;
}
//按照位置查找数据
void find_data_list(Node *head,int pos) //pos表示要查找的位置 从1开始算
{
Node *p=head;
if (head==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
if (pos<1||pos>length_list(head))
{
cout<<"pos位置超出链表长度或者小于1!"<<endl;
return;
}
cout<<"链表第"<<pos<<"个位置的值为:";
while(--pos)
{
p=p->next;
}
cout<<p->data<<endl;
}
//按照数据查找位置
void find_pos_list(Node *head,int data)
{
Node *p=head;
int pos=0; //记录数据在链表中的位置
if (head==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
while(p)
{
pos++;
if (p->data==data)
{
cout<<data<<"在链表的第"<<pos<<"个位置"<<endl;
return;
}
p=p->next;
}
cout<<data<<"不在链表中"<<endl;
}
//删除指定位置的数据
void delete_pos_list(Node *head,int pos)
{
Node *p=head;
Node *temp;
if (head==NULL)
{
cout<<"链表为空!"<<endl;
return ;
}
if (pos<1||pos>length_list(head))
{
cout<<"pos位置超出链表长度或者小于1!"<<endl;
return ;
}
if (pos==1) //删除头结点
{
::head=head->next; //更新全局头指针
delete p;
p=NULL;
}
else
{
pos=pos-1; //保证while循环找到的是pos结点的上一个结点
while(--pos) //循环结束时p指向pos位置的上一个位置
{
p=p->next;
}
temp=p->next;
p->next=p->next->next;
//p=temp->next;
delete temp;
temp=NULL;
}
}
//在pos位置插入一个元素 插入在pos-1位置后面
void insert_pos_list(Node *head,int pos,int data)
{
Node *temp;
Node *p=head;
if (head==NULL)
{
cout<<"链表为空!"<<endl;
return ;
}
if (pos<1||pos>length_list(head))
{
cout<<"pos位置超出链表长度或者小于1!"<<endl;
return ;
}
if (data<0)
{
cout<<"插入的数据小于0!"<<endl;
return ;
}
if (pos==1) //插入的头结点
{
temp=new Node;
temp->data=data;
temp->next=head;
::head=temp;
}
else
{
pos=pos-1;
while(--pos) //while循环结束时p指针指向pos-1个位置
{
p=p->next;
}
temp=new Node;
temp->data=data;
temp->next=p->next;
p->next=temp;
}
}
void reverse_list(Node *head) //翻转单链表
{
Node *p1,*p2,*p3; //借助三个指针完成链表节点的依次反转 指向反转
if (head==NULL||head->next==NULL) //头结点为空 或者 只有头结点而没有其他节点 此时直接返回空
{
cout<<"链表为空或只有头结点而无其他数据节点!"<<endl;
return ;
}
p1=head; //p1保存头结点地址
p2=head->next; //
head->next=NULL;
while(p2)
{
p3=p2->next; //p3保存剩下的旧的链表
p2->next=p1;
p1=p2; //指针依次后移
p2=p3;
}
::head=p1; //更新全局head指针
}
//找出单链表的中间元素
Node *search_middle(Node *head)
{
if (head==NULL)
{
cout<<"链表为空"<<endl;
return NULL;
}
Node *p;
p=head;
int i=0,j=0;
Node *mid;
mid=head;
while(p)
{
if (i/2>j)
{
j++;
mid=mid->next;
}
i++;
p=p->next;
}
return mid;
}
//创建环形链表(单向)
//参数n表示有n个人围成的的环
void create_sysle_list(int n)
{
if (n<1)
{
cout<<"参数错误,人数不能小于1"<<endl;
return;
}
Node *p1,*p2;
int index=0; //计数
while(index++<n)
{
p1=new Node;
p1->data=index;
if (index==1) //头结点
{
head=p1;
p1=p1->next;
}
else
p2=p1;
p2=p1;
}
}
单链表的反转,图解理解是最好的了,参考网址http://www.2cto.com/kf/201110/106607.html