数据结构中单链表结构的创建、链表初始化、前插法、尾插法、获取第i位置元素、查找元素e的位置、链表的插入和删除、判断表长、清空和销毁链表等操作

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

//定义链表结构-节点结构
typedef struct LNode
{
	ElemType date;
	struct  LNode *next;	
}LNode,*Linklist;//Linklist--Lode* 是相互等价
//区别:
//指针变量: 表示结点地址 LNode s;//s是结点 访问成员 s.date
//结点变量:表示一个结点 LinkList p;//p是指针 p->date ai


//初始化链表
Status InitLinklist(Linklist &L)
{
	L = (LNode*)malloc(sizeof(LNode));
	if (!L)
		return ERROR;
	L->next = NULL;
	return OK;
}

//创建N个元素的单链表(前插法)//放在头节点之前加一个新的
Status CreakLinklist(Linklist &L, int n)
{
	for (int i = 0; i < n; i++)//循环n次
	{
		LNode *p = (LNode*)malloc(sizeof(LNode));//申请一个结点p,p指向申请结点的空间
		if (!p)
			return ERROR;
		scanf("%d", &p->date);//申请到空间后,用键盘给结点赋值。
		p->next = L->next;//L是在主函数中新定义的一个单链表,而p是在CreakLinklist里面定义的一个指针
		L->next = p;	
		//这两个语句的顺序是不能倒过来,这样会导致数据的丢失
	}
	return OK;
}

//创建N个元素的单链表(尾插法)
Status CreateLink_L(Linklist &L, int n)
{
	LNode *r = L;
	for (int i = 0; i < n; i++)
	{
		LNode *p = (LNode*)malloc(sizeof(LNode));
		if (!p)
			return ERROR;
		scanf("%d", &p->date);
		p->next = NULL;
		r->next = p;
		r = p;
	}
	return OK;
}

void DispLinklist(Linklist L)//显示指针
{
	LNode *p = L->next;//指针p指向第一个结点的next
	while (p)
	{
		printf(" %d", p->date);
		p = p->next;
	}
	printf("\n");
}

//获取位置为i的元素
Status GetElem(Linklist L, int i)
{
	ElemType e;
	Linklist p = L->next;
	int j = 1;
	while (p&&j < i)
	{
		p = p->next;
		j++;
		p = p->next;
	}
	if (!p || j < i)
		return ERROR;
	e = p->date;
	printf("%d", e);
}

//查找元素e所在的位置
Status LocateLink(Linklist L, ElemType e)
{
	Linklist p = L->next;
	int j = 1;
	while (p)
	{
		if (p->date == e)
			return j;
		else
		{
			p = p->next;
			j++;              
		}
	}
}

//链表的插入(在第i个元素插入)
Status InsetLink(Linklist &L, ElemType e, int i)
{
	Linklist p = L, s;
	int j=0;
	while (p&&j<i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j>i-1)
		return ERROR;
	s = (LNode*)malloc(sizeof(LNode));
	if (!s)
		return ERROR;
	s->date = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

//删除链表第i个结点
Status DeletdLink(Linklist &L, int i)
{
	ElemType e;
	Linklist p = L,q;
	int j = 0;
	while (p&&j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j>i - 1)
		return ERROR;
	q = p->next;//q是临时保存要被删除的元素
	e = q->date;//
	q->next = q->next;
	printf("%d\n", e);
	free(q);
	return OK;
}

//判断表长是否为空 
Status ListEmpty(Linklist L)
{//若L为空表,则返回1,否则返回0
	if (L->next)//非空
		return ERROR;
	else
		return OK;
}

//销毁指针
Status DestroyLinst(Linklist &L)
{
	Linklist p, q;
	p = L;//p指向头节点
	while (p)//没到表尾
	{
		q = p->next;
		free(p);
		p = q;
	}
	return OK;
}

//清空链表
Status ClearLinst(Linklist &L)
{
	//将L重置为空表
	Linklist p, q;
	p = L->next;//p指向第一个结点
	while (p)//没有表尾
	{
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;//头节点指针域为空
	return OK;
}

int main()
{
	Linklist L;//是定义了一个struct类型的指针L
	InitLinklist(L);//初始化链表
	//CreakLinklist(L,5);//前插法
	//DispLinklist(L);//显示单链表
	CreateLink_L(L, 5);//尾插法
	DispLinklist(L);
	InsetLink(L, 123, 3);//在第i个元素插入e的值
	DispLinklist(L);
	DeletdLink(L, 4);//删除链表中第4个元素
	DispLinklist(L);//显示链表
	ClearLinst(L);//清空链表
	DestroyLinst(L);//销毁链表
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值