单链表的建立、测长、删除、插入、排序、逆置及打印(数据结构)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>

#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

using namespace std;

//单链表存储结构
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

//尾插法建立单链表
LinkList CreateList(LinkList L, int n)
{
	LinkList p, r;
	int i;
	r = L;//r为指向尾部的结点
	for (i = 0; i < n; i++)
	{
		p = (LNode*)malloc(sizeof(LNode)); //生成新结点
		cin>> p->data;
		r->next = p; //将表尾终端结点的指针指向新结点
		r = p; //将当前的新结点定义为表尾终点
	}
	r->next = NULL;//表示当前链表结束
	return L;
}

//单链表测长
int LengthList(LinkList L)
{
	int n = 0;
	LinkList p = L;
	while (p != NULL)
	{
		p = p->next;//指向下一个结点
		n++;//计数
	}
	return n;
}
 //删除第i个元素,并由e返回其值
Status DeleteList(LinkList L, int i,ElemType &e)
{
	int j;
	LinkList p, q;
	p = L;
	j = 1;
	while (p->next&&j < i)//遍历寻找第i个元素
	{
		p = p->next;
		j++;
	}
	if (!(p->next)||j>i)
		return ERROR;//第i个元素不存在
	q = p->next; //删除并释放结点
	p->next = q->next;
	e = q->data;
	free(q);
	return OK;
}

//在第i个位置之前插入新元素e,L的长度加1
Status InsertList(LinkList L, int i, ElemType e)
{
	int j;
	LinkList p, s;
	p = L;
	j = 1;
	while (p&&j < i)//寻找第i个结点
	{
		p = p->next;
		j++;
	}
	if (!p || j>i)
		return ERROR; //第i个元素不存在
	s = (LNode*)malloc(sizeof(LNode));//生成新结点
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

//链表排序
LinkList SortList(LinkList L)
{
	ElemType Temp;
	if (L == NULL || L->next == NULL)
		return L;
	for (LNode *p1 = L; p1 != NULL; p1 = p1->next)
	{
		for (LNode *p2 = L; p2 != NULL; p2 = p2->next)
		{
			if (p1->data < p2->data)
			{
				Temp = p1->data;
				p1->data = p2->data;
				p2->data = Temp;
			}
		}
	}
	return L;
}

//链表逆置
LinkList ReverseList(LinkList L)
{
	LNode * p1, *p2, *p3;
	if (L == NULL || L->next == NULL)
		return L;
	p1 = L;
	p2 = p1->next;
	while (p2)
	{
		p3 = p2->next;
		p2->next = p1;
		p1 = p2;
		p2 = p3;
	}
	L->next = NULL;
	L = p1;
	return L;
}

//打印链表
 void PrintList(LinkList L,int n)
{
	while (L != NULL)
	{
		cout << L->data << " ";
		L = L->next;
	}
}

void main()
{
	const int n = 5;
	LinkList L=(LinkList)malloc(sizeof(LNode));
	L->data = 0;
	L->next = NULL;

	cout << "请输入" << n << "个数据" << endl;
	L = CreateList(L, n);
	PrintList(L, n);
	int l = LengthList(L);
	cout << "表长为:"<< l << endl<<endl;

	//测试删除结点
	int i = 3;//删除第三个结点
	ElemType e;
	DeleteList(L, i, e);
	l = LengthList(L);
	cout << "删除一个结点后,表长为" << l << endl;
	PrintList(L, l);
	cout << endl << "删除的元素为:" << e << endl << endl;

	//测试插入结点
	i = 3;
	e = 8;
	InsertList(L, i, e);
	l = LengthList(L);
	cout << "插入一个结点后,表长为" << l << endl;
	PrintList(L, l);
	cout << endl << "插入的元素为:" << e << endl<<endl;

	//测试排序	
	cout << "排序后的链表为:" << endl;
	PrintList(SortList(L) , l);

	//测试逆置
	cout <<endl<< "逆置后的链表为:" << endl;
	PrintList(ReverseList(L), l);

	system("pause");	
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值