数据结构—单链表操作及实现(CC++)

数据结构—单链表操作及实现(C/C++)

1.0初始化定义

#include<iostream>
#define MAXSIZE 100
#define ERROR -1
#define OK 1
using namespace std;
typedef  int status;//自己定义的类型
typedef  int ElemType; //上同

1.1单链表的定义

typedef struct LNode
{
	ElemType data; //存储节点的数据域
	struct LNode* next;  //存储后继节点位置的指针域next
}LNode, * LinkList;
  • **说明:LinkList和LNode的区别,其实两者本质是等价的,只是习惯上用LinkList定义单链表,强调定义是单链表的头指针,而==LNode定义指向单链表中的任意节点的指针变量==。

  • *LinkList p :*p为指向节点的指针变量,表示该节点的地址。

  • LNode p: p为指向单链表某个节点的指针,*p就是该节点 , *p为对应节点的变量,表示该节点的名称。

  • 头结点:**在首元节点之前设置的一个节点,头结点的next域(指针域)指向首元节点

  • 头指针:**指向链表中第一个节点的指针,如果链表有头结点,则头指针指向链表的头结点,如果没有头结点,则指向首元节点,例如当链表没有头结点时,头指针就应该指向首元节点,判断空表的条件可为:L==NULL,反之,当有头结点时候,无论链表是否为空,头指针都是指向头结点的飞空指针。判断空表条件就是:L->next==NULL


1.2单链表的初始化

status Initlist(LNode* L)
{
	L = new LNode; //生成新节点作为头节点,用头指针L指向头结点
	L->next = NULL;  //头结点置空
	return OK;
}

1.3单链表的取值

status GetElem(LNode* L, int i, ElemType& e)
{
	int j = 1;  //初始化,p指向头结点,计数器j 初始为1
	LNode* p;
	p = L->next; //指向头结点
	while (p && j < i) //p不为0并且计数器值小于i的值
	{
		p = p->next; //p指向p的后继节点
		j++; //计数器+1
	}
	if (!p || j > i) 
	{
		return ERROR;
	}
	else
	{
		e = p->data;
	}
	return OK;
}

1.4单链表按值查找

status LocateElem(LNode* L,ElemType e)
{
	int j=1;
	LNode* p;
	p = L->next;
	while(p&&p->data!=e)
	{
		p = p->next;
		j++;
	}
	cout<<j<<endl;
	return OK;
}

1.5单链表的插入

status ListInsert(LNode* L,int i,ElemType e)
{
	int j = 0;
	LNode* p;
	LNode* s;
	p = L;
	while(p&&(j<i-1))
	{
		p = p->next;
		j++;
	}
	if(!p||j>i-1)
	{
		return ERROR;
	}
	else
	{
		s = new LNode;
		s->data = e;
		s->next = p->next;
		p->next = s;
	}
	return OK;
}

1.6单链表的删除

tatus ListDelete(LNode* L,int i)
{
	int j = 0;
	LNode* p;
	LNode* q;
	p = L;
	while((p->next)&&(j<i-1))
	{
		p = p->next;
		j++;
	}
	if(!(p->next)||(j>i-1))
	{
		return ERROR;
	}
	else
	{
		q=p->next;
		p->next=q->next;
		delete q;
	}
	return OK;
}

1.7头插法(前插法)建立单链表

status tailInsert(LinkList &L)
{
	LinkList s;
	ElemType x;
	L = (LNode*)malloc(sizeof(LNode));
	L->next = NULL;
	cout << "请依次输入元素x的值,最后输入9999结束输入!"<<endl;
	cin>>x;
	while(x!=9999)
	{
		s =(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next = L->next;
		L->next = s;
		cin>>x;
	}
	return OK;
}

1.8尾插法(后插法)建立单链表

status tailInsert2(LinkList &L)
{
	ElemType x;
	LNode* r;
	LNode* s;
	L = new LNode;
	L->next = NULL;
	r = L;
	cout << "请依次输入元素x的值,最后输入9999结束输入!"<<endl;
	cin >> x;
	while(x!=9999)
	{
		s = new LNode;
		s->next = NULL;
		s->data = x;
		r->next = s;
		r = s;
		cin >> x;
	}
	r->next = NULL;
	return OK;
}

1.9输出单链表函数

void print(LinkList L)
{
	LinkList p=L->next ;
	printf("当前的链表元素为:");
	while(p!=NULL)
	{
		printf("  %d",p->data);
		p=p->next;
	}
    cout<<endl;
}

2.0 C 完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define ERROR -1
#define OK 1
typedef  int status;
typedef  int ElemType;
//定义单链表
typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode, * LinkList;

//初始化单链表
status Initionlist(LNode* L)
{
	L = (LNode*)malloc(sizeof(LNode)); //生成新节点作为头节点,用头指针L指向头结点
	L->next = NULL;  //头结点置空
	return OK;
}

//单链表的取值
status GetElem(LNode* L, int i, ElemType& e)
{
	int j = 1;  //初始化,p指向头结点,计数器j 初始为1
	LNode* p;
	p = L->next; //指向头结点
	while (p && j < i) //p不为0并且计数器值小于i的值
	{
		p = p->next; //p指向p的后继节点
		j++; //计数器+1
	}
	if (!p || j > i) 
	{
		return ERROR;
	}
	else
	{
		e = p->data;
	}
	return OK;
}
//单链表按值查找w位置
status LocateElem(LNode* L,ElemType e)
{
	int j=1;
	LNode* p;
	p = L->next;
	while(p&&p->data!=e)
	{
		p = p->next;
		j++;
	}
	printf("%d",j);
	return OK;
}
//单链表的插入操作
status ListInsert(LNode* L,int i,ElemType e)
{
	int j = 0;
	LNode* p;
	LNode* s;
	p = L;
	while(p&&(j<i-1))
	{
		p = p->next;
		j++;
	}
	if(!p||j>i-1)
	{
		return ERROR;
	}
	else
	{
		s = new LNode;
		s->data = e;
		s->next = p->next;
		p->next = s;
	}
	return OK;
}
//单链表的删除操作
status ListDelete(LNode* L,int i)
{
	int j = 0;
	LNode* p;
	LNode* q;
	p = L;
	while((p->next)&&(j<i-1))
	{
		p = p->next;
		j++;
	}
	if(!(p->next)||(j>i-1))
	{
		return ERROR;
	}
	else
	{
		q=p->next;
		p->next=q->next;
		delete q;
	}
	return OK;
}
//头插法(前插法)建立单链表

status tailInsert(LinkList &L)
{
	LinkList s;
	ElemType x;
	L = (LNode*)malloc(sizeof(LNode));
	L->next = NULL;
	printf("请依次输入元素x的值,最后以9999结束输入:\n");
	scanf("%d",&x);
	while(x!=9999)
	{
		s =(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next = L->next;
		L->next = s;
		scanf("%d",&x);
	}
	return OK;
}
//尾插法(后插法)建立单链表
status tailInsert2(LinkList &L)
{
	ElemType x;
	LNode* r;
	LNode* s;
	L = (LNode*)malloc(sizeof(LNode));;
	L->next = NULL;
	r = L;
		printf("请依次输入元素x的值,最后以9999结束输入:\n");
	scanf("%d",&x);
	while(x!=9999)
	{
		s = (LNode*)malloc(sizeof(LNode));;
		s->next = NULL;
		s->data = x;
		r->next = s;
		r = s;
		scanf("%d",&x);
	}
	r->next = NULL;
	return OK;
}
void print(LinkList L)
{
	LinkList p=L->next ;
	printf("当前的链表元素为:");
	while(p!=NULL)
	{
		printf("  %d",p->data);
		p=p->next;
	}
}


int main()
{
	LinkList L;
	Initionlist(L);
	printf("头插法建立单链表:\n");
	tailInsert(L);
	print(L);
	printf("\n");
	printf("删除第三个位置的值,");
	ListDelete(L,3);
	print(L);
	printf("\n");
	printf("插入第三个位置的值,");
	ListInsert(L,3,88);
	print(L);
	printf("\n");
	printf("元素88的位置是:");
	LocateElem(L,88);
	printf("\n");
	printf("\n");
	printf("\n");
	printf("尾插法建立单链表:\n");
	tailInsert2(L);
	print(L);
	printf("\n");
	printf("删除第三个位置的值,");
	ListDelete(L,3);
	print(L);
	printf("\n");
	printf("插入第三个位置的值,");
	ListInsert(L,3,88);
	print(L);
	printf("\n");
	printf("元素88的位置是:");
	LocateElem(L,88);
	return 0;
}

2.1 C++完整代码如下:

#include<iostream>
#define MAXSIZE 100
#define ERROR -1
#define OK 1
using namespace std;
typedef  int status;
typedef  int ElemType;
//定义单链表
typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode, * LinkList;

//初始化单链表
status Initionlist(LNode* L)
{
	L = new LNode; //生成新节点作为头节点,用头指针L指向头结点
	L->next = NULL;  //头结点置空
	return OK;
}

//单链表的取值
status GetElem(LNode* L, int i, ElemType& e)
{
	int j = 1;  //初始化,p指向头结点,计数器j 初始为1
	LNode* p;
	p = L->next; //指向头结点
	while (p && j < i) //p不为0并且计数器值小于i的值
	{
		p = p->next; //p指向p的后继节点
		j++; //计数器+1
	}
	if (!p || j > i) 
	{
		return ERROR;
	}
	else
	{
		e = p->data;
	}
	return OK;
}
//单链表按值查找w位置
status LocateElem(LNode* L,ElemType e)
{
	int j=1;
	LNode* p;
	p = L->next;
	while(p&&p->data!=e)
	{
		p = p->next;
		j++;
	}
	cout<<j<<endl;
	return OK;
}
//单链表的插入操作
status ListInsert(LNode* L,int i,ElemType e)
{
	int j = 0;
	LNode* p;
	LNode* s;
	p = L;
	while(p&&(j<i-1))
	{
		p = p->next;
		j++;
	}
	if(!p||j>i-1)
	{
		return ERROR;
	}
	else
	{
		s = new LNode;
		s->data = e;
		s->next = p->next;
		p->next = s;
	}
	return OK;
}
//单链表的删除操作
status ListDelete(LNode* L,int i)
{
	int j = 0;
	LNode* p;
	LNode* q;
	p = L;
	while((p->next)&&(j<i-1))
	{
		p = p->next;
		j++;
	}
	if(!(p->next)||(j>i-1))
	{
		return ERROR;
	}
	else
	{
		q=p->next;
		p->next=q->next;
		delete q;
	}
	return OK;
}
//头插法(前插法)建立单链表

status tailInsert(LinkList &L)
{
	LinkList s;
	ElemType x;
	L = (LNode*)malloc(sizeof(LNode));
	L->next = NULL;
	cout << "请依次输入元素x的值,最后以9999结束输入:"<<endl;
	cin>>x;
	while(x!=9999)
	{
		s =(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next = L->next;
		L->next = s;
		cin>>x;
	}
	return OK;
}
//尾插法(后插法)建立单链表
status tailInsert2(LinkList &L)
{
	ElemType x;
	LNode* r;
	LNode* s;
	L = new LNode;
	L->next = NULL;
	r = L;
	cout << "请依次输入元素x的值,最后以9999结束输入:"<<endl;
	cin >> x;
	while(x!=9999)
	{
		s = new LNode;
		s->next = NULL;
		s->data = x;
		r->next = s;
		r = s;
		cin >> x;
	}
	r->next = NULL;
	return OK;
}
void print(LinkList L)
{
	LinkList p=L->next ;
	printf("当前的链表元素为:");
	while(p!=NULL)
	{
		printf("  %d",p->data);
		p=p->next;
	}
}


int main()
{
	LinkList L;
	Initionlist(L);
	cout<<"头插法建立单链表:"<<endl;
	tailInsert(L);
	print(L);
	cout<<endl;
	cout<<"删除第三个位置的值,";
	ListDelete(L,3);
	print(L);
	cout<<endl;
	cout<<"插入第三个位置的值,";
	ListInsert(L,3,88);
	print(L);
	cout<<endl;
	cout<<"元素88的位置是:";
	LocateElem(L,88);
	cout<<endl<<endl<<endl;
	cout<<"尾插法建立单链表:"<<endl;
	tailInsert2(L);
	print(L);
	cout<<endl;
	cout<<"删除第三个位置的值,";
	ListDelete(L,3);
	print(L);
	cout<<endl;
	cout<<"插入第三个位置的值,";
	ListInsert(L,3,88);
	print(L);
	cout<<endl;
	cout<<"元素88的位置是:";
	LocateElem(L,88);
	return 0;
}

2.1 运行截图

在这里插入图片描述

2.2参考书籍

《数据结构》(C语言版)(第2版)—严蔚敏 李冬梅 吴伟民 编著

2.3总结

对于链表,在确定插入和删除位置后,插入或删除操作无需移动数据,只需要修改指针。

有时间我在好好完善一下内容,这个没有修改多少。
水平有限,如果有错误的地方希望大家能够多指正!
写博客不容易,动动大家小手,多多关注!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值