【数据结构】单链表的基本操作(最常用)c++代码实现

 最近在学数据结构,主要看小甲鱼的“数据结构与算法”视频,自己根据视频实现了单链表的基本操作。

主要包括以下函数;

typedef struct Node
{
    ElemType data;//数据域
    struct Node *Next;//指针域
}Node,*Linklist;

//头插法建立单链表
int CreatListHead(Linklist *L, int n);

//尾插法建立单链表
int CreatListTail(Linklist *L, int n);

//遍历链表输出所有元素
int OutputList(Linklist L);

//求链表长度
int GetListLength(Linklist L);


//单链表查找
//用e返回L中第i个元素的值
int GetListElem(Linklist L, ElemType *e, int i);


//单链表插入
//在L中第i个元素之前插入新的元素e,L的长度+1
int ListInsert(Linklist *L, int i, ElemType e);

//单链表删除
//删除L的第i个数据元素,并用e返回其值
int ListDelet(Linklist *L, int i, ElemType *e);


//单链表整表删除
int ClearList(Linklist *L);


直接上代码:

//头插法建立单链表
int CreatListHead(Linklist *L, int n)
{
	*L = (Linklist)malloc(sizeof(Node));//头结点申请地址  注意malloc的用法
	(*L)->Next = NULL;

	Linklist p;
	srand(time(0));//初始化随机数种子,后续用于生成随机数
	for (int i = 0; i < n; i++)
	{
		p = (Linklist)malloc(sizeof(Node));//生成新结点
		p->data = rand() % 100 + 1;//生成两位随机数
		p->Next = (*L)->Next;
		(*L)->Next = p;
	}

	return 0;
}

//尾插法建立单链表
int CreatListTail(Linklist *L, int n)
{
	*L = (Linklist)malloc(sizeof(Node));//头结点申请地址  注意malloc的用法

	Linklist p, r;
	srand(time(0));//初始化随机数种子,后续用于生成随机数
	for (int i = 0; i < n; i++)
	{
		p = (Linklist)malloc(sizeof(Node));//生成新结点
		p->data = rand() % 100 + 1;//生成两位随机数
		(*L)->Next = p;
		*L = p;
	}
	(*L)->Next = NULL;

	return 0;
}

//遍历链表输出所有元素
int OutputList(Linklist L)
{
	Linklist p;
	for (p = L->Next; p != NULL; p = p->Next)//遍历链表
	{
		cout << p->data << " ";
	}
	cout << endl;
	return 0;
}

//求链表长度
int GetListLength(Linklist L)
{
	Linklist p;
	int Length = 0;
	for (p = L->Next; p != NULL; p = p->Next)//遍历链表
	{
		//cout << p->data << " ";
		Length++;
	}
	return Length;
}

//单链表查找
//用e返回L中第i个元素的值
int GetListElem(Linklist L, ElemType *e, int i)
{
	int j = 0;
	Linklist p;
	p = L->Next;
	while (p&&j<i)
	{
		p = p->Next;
		j++;
	}
	if (!p || j < i)//存在性判断 
	{
		return 1;
	}
	*e = p->data;
	return 0;
}

//单链表插入
//在L中第i个元素之前插入新的元素e,L的长度+1
int ListInsert(Linklist *L, int i, ElemType e)
{
	Linklist p, r;

	p = (*L)->Next;
	int j=0;
	while (p&&j<i)
	{
		p= p->Next;
		j++;
	}
	if (!p || j < i)//存在性判断 
	{
		return 1;
	}
	r = (Linklist)malloc(sizeof(Node));
	r->data = e;
	r->Next = p->Next;
	p->Next = r;
	return 0;
}

//单链表删除
//删除L的第i个数据元素,并用e返回其值
int ListDelet(Linklist *L, int i, ElemType *e)
{
	Linklist p, r;

	p = (*L)->Next;
	int j=0;
	while (p&&j<i)
	{
		p = p->Next;
		j++;
	}
	if (!p || j < i)//存在性判断 
	{
		return 1;
	}
	r = (Linklist)malloc(sizeof(Node));
	r = p->Next;
	p->Next = r->Next;
	*e = r->data;
	free(r);
	return 0;
}

//单链表整表删除
int ClearList(Linklist *L)
{
	Linklist p, q;
	p = (*L)->Next;
	q = (Linklist)malloc(sizeof(Node));
	while (p)
	{
		q = p->Next;
		free(p);
		p = q;
	}
	return 0;
}

简单测试代码:

int main()
{
	int n;
	Linklist list1;
	cout << "输入单链表的长度:" << endl;
	cin >> n;
	CreatListHead(&list1, n);
	OutputList(list1);
	int length = GetListLength(list1);
	cout << "链表的长度是" << length << endl;
	cout << "请输入要取哪一个元素的位置" << endl;
	int i,elem;
	cin >> i;
	GetListElem(list1, &elem, i);
	cout << "该位置元素为" << elem << endl;
	cout << "请输入要删除哪一个元素的位置" << endl;
	int a,elem1;
	cin >> a;
	ListDelet(&list1, a, &elem1);
	cout << "要删除的元素为" << elem1 << endl;
	OutputList(list1);

	getchar();
	return 0;
}

测试结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值