单链表的创建、测长、打印、插入、删除、排序及逆置

#include<iostream>
#include<vector>
using namespace std;

typedef struct student
{
	int data;
	//struct student *next;
	student *next;
}node;

//单链表的建立(带头结点)
node* creat()
{
	node *p, *s;
	int x, cycle = 1;
	node *head = new node();
	//head->data = 1;   //头结点默认值为0,当然这里也可以初始化其值
	p = head;
	while (cin>>x&&x!=0)  //依次输入结点值,规定当输入为0时结束while循环
	  {
	  s = new node();
	  s->data = x;
      p->next = s;
	  p = s;
	  }
	return head;
}

//单链表的测长
int length(node *head)
{
	int len=0;
    node *p = head;
	while (p!= NULL)
	{
		len++;
		p = p->next;
	}
    return len;
}

//单链表的打印
void print(node *head)
{
	node *p = head;
	while (p != NULL)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

//单链表的删除
node *Del(node *head,int num)
{
	node * p1, *p2;
	p1 = head;
	p2 = p1;   //p2需要初始化

	while (num!=p1->data&&p1->next!=NULL)
	{
		p2 = p1;
		p1 = p1->next;
	}
	if (num == p1->data)  
	{
		if (p1 == head)
		{
			head = p1->next;   //删除头结点
			delete p1;
		}
		else                   //删除中间结点
		{
			p2->next= p1->next; 
			delete p1;
		}
	}
	else
	{
		cout << num << " not found" << endl;
	}
	return head;
}

//单链表的插入
node *Insert(node * head, int num)
{
	node *p1,*p2;
	node *p0 = new node();   //新建待插入结点
	p0->data = num;
	p1 = head;
	p2 = p1;
	while (p0->data > p1->data&&p1->next != NULL)   //假设将待插入结点插在第一个比它小的结点后面
	{
		p2 = p1;
		p1 = p1->next;
	}
	if (p0->data <= p1->data)  
	{
		if (p1 == head)    //插在头结点前面
		  {
			 p0->next = p1;
			 head = p0;
		  }
		else              //插入位置为中间结点
		  {
             p2->next = p0;
			 p0->next = p1;
		  }
	}
	else                  //插在尾结点后面
	{
		p1->next = p0;
		p0->next = NULL;
	}
	return head;
}

//单链表的排序
node *sortList(node *head)
{
	int temp;
	node *p1 = head;
	int len = length(head);
	if (head == NULL || head->next == NULL)
		return head;
	for (int i = 1; i < len; i++)
	 {
		p1 = head;
		for (int j = 0; j < len-i; j++)
		  {
			if (p1->data > p1->next->data)
			  {
				temp = p1->data;
				p1->data = p1->next->data;
				p1->next->data = temp;
			  }
			p1 = p1->next;
		  }
	 }
	return head;
}

//单链表的逆置
node *Reverse(node *head)
{
	node *pNode = head;
	node *pPre = NULL;
	node *pReveseNode = NULL;

	while (pNode != NULL)
	{
		node *pNext = pNode->next;
		if (pNext == NULL)
			pReveseNode = pNode;
		pNode->next = pPre;
		pPre = pNode;
		pNode = pNext;
	}
	return pReveseNode;
}

int main()
{
	//创建单链表
	node *head=creat();
	//单链表测长
	int len = length(head);
	//打印单链表
	print(head);
	//单链表删除指定结点
	int num1;
	cin >> num1;
	node *head2=Del(head,num1);
	print(head2);
	//单链表插入结点
	int num2;
	cin >> num2;
	node *head3 = Insert(head, num2);
	print(head3);
	//单链表的排序
	node *head4 = sortList(head);
	print(head4);
	//逆置单链表
	node *head5 = Reverse(head);
	print(head5);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rs勿忘初心

您的鼓励将是我的最大创动原动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值