单链表正向排序、逆置、寻找中间元素、打印单链表操作

 

// 单链表.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;
}


 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值