// 单链表.cpp : 定义控制台应用程序的入口点。
//单链表
#include "stdafx.h"
#include <iostream>
#include <complex>
using namespace std;
typedef struct node {
int data;//节点内容
node *next;//下一个节点
}node;
//单链表的正向排序
node *InsertSort(){
node *head,*p,*q,*cur;
int a=-1;
head=new node;
head->next=NULL;
while (1)
{
cout<<"please input the data(-1,quit):";
cin>>a;
if (-1==a){ //输入-1结束
break;
}
p=new node;
p->data=a;
p->next=NULL;
q=head->next;
if (q==NULL){//如果第一个节点为NULL,则对第一个节点赋值
head->next=p;
continue;
}
if (q->data>a){//如果插入值小于第一个节点,则插入到head之后
p->next=head->next;
head->next=p;
}
else{ //如果插入值大于等于第一个节点
while (q->data<a){
cur=q;
q=q->next;
if (q==NULL){ //如果到了末尾,则跳出循环
break;
}
}
if (q==NULL){ //如果到了末尾,直接插入到末节点后面
cur->next=p;
}
p->next=q; //插入值插到q前面,cur后面
cur->next=p;
}
}
return head;
}
//打印单链表
void print(node *head){
node *p=head->next;
int index=0;
if (p==NULL)//链表为NULL
{
cout<<"Link is empty!"<<endl;
getchar();
return;
}
while (p!=NULL)//遍历链表
{
cout<<"The "<<++index<<"th node is :"<<p->data<<endl;//打印元素
p=p->next;
}
}
//单链表逆置
node *reverse(node *head){
node *p,*q,*r;
if (head->next==NULL)//链表为空
{
return head;
}
p=head->next;
q=p->next;//保存原第2个节点
p->next=NULL;//原第1个节点为末节点
while (q!=NULL)//遍历,各个节点的next指针反转
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=p;//新的第一个节点为原末节点
return head;
}
//寻找单链表的中间元素
node *search_mid(node *head){
node *current=NULL; //current指向当前已扫描链表的尾节点
node *mid=NULL; //mid指向当前已经扫描的子链表的中间元素
int i=0,j=0;
current=mid=head->next;//都指向第一个节点
while (current!=NULL){
if (i/2>j)
{
j++;
mid=mid->next;
}
i++;
current=current->next;
}
return mid;
}
int _tmain(int argc, _TCHAR* argv[])
{
node *head=InsertSort();//创建单链表
cout<<"--------after insertSort()------------"<<endl;
print(head);
node *preverse=reverse(head);
cout<<"--------after reverse()------------"<<endl;
print(preverse);
node *p=search_mid(head);
cout<<"--------after search_mid()------------"<<endl;
cout<<"search_mid():"<<p->data<<endl;
system("pause");
delete [] head;
return 0;
}