#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");
}
单链表的建立、测长、删除、插入、排序、逆置及打印(数据结构)
最新推荐文章于 2023-12-01 17:19:29 发布