数据结构单链表

单链表

单链表的操作项与顺序链表的操作箱一致。
区别内容有:
1.单链表的插入与删除
2、单链表的尾插法和头插法

代码

#include<iostream>
#define error 0
#define ok 1
using namespace std;
typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node* next;
}Lnode,*LinkList;//区别:若定义LinkList L,表示L为单链表的头指针,若定义Lnode *p,则p表示指向单链表中某个节点的指针。
void InitList_L(LinkList &L)//单链表的初始化
{
	L = new Lnode;
	if (!L)
	{
		exit(1);
	}
	L->next = NULL;//为头结点的版本,没有头结点时L=NULL;
}
int ListLength_L(LinkList L)//获取单链表的长度
{
	LinkList p;
	int length = 0;
	p = L->next;
	while (p)
	{
		length++;
		p = p->next;
	}
	return length;
}
int LocateElem_L(LinkList L, ElemType &e)//Lnode *LocateElem_L(LinkList L, ElemType &e)查找某个元素在单链表中的位置
{
	LinkList p;
	int i = 0;
	p = L->next;
	while (p && p->data != e)
	{
		p = p->next;
		i++;
	}
	return i;
}
bool ListInsert_L(LinkList& L, int i, ElemType e)//单链表插入元素
{
	LinkList p, s;
	s = new Lnode;
	p = L;
	int j = 0;
	while (p && (j < i - 1))
	{
		p = p->next;
		j++;
	}
	if (!p&&j!=i - 1)
	{
		return false;
	}
	s->data = e;
	s->next = p->next;
	p->next = s;
}
bool ListDelete_L(LinkList& L, int i, ElemType& e)//单链表的删除
{
	LinkList p, q;
	int j = 0;
	p = L;
	while ((p->next) && (j < i - 1))//区别于插入操作,是因为插入时有n+1个位置,删除时只有n个元素
	{
		p = p->next;
		j++;
	}
	if (j !=i-1)
	{
		return false;
	}
	q = p->next;
	p->next = q->next;
	e = q->data;
	return true;
}
bool GetElem_L(LinkList& L, int i, ElemType& e)//获取单链表中某个位置的值
{
	LinkList p;
	p = L;
	int j = 0;
	while ((p->next) && (j < i))
	{
		j++;
		p = p->next;
	}
	if (j != i-1)
	{
		return false;
	}
	e = p->data;
	return true;
}
void CreateList_L_Rear(LinkList& L, ElemType a[], int n)//创建单链表尾插法
{
	LinkList p, q;
	L = new Lnode;
	q = L;
	for (int i = 0; i < n; i++)
	{
		p = new Lnode;
		p->data = a[i];
		q->next = p;
		q = p;
	}
	q->next = NULL;
}
void CreateList_L_Front(LinkList& L, ElemType a[], int n)//创建单链表头插法
{
	LinkList p;
	L = new Lnode;
	L->next = NULL;
	for (int i = 0; i < n; i++)
	{
		p = new Lnode;
		p->data = a[i];
		p->next = L->next;
		L->next = p;
	}
}
void DestroyList_L(LinkList& L)
{
	LinkList p, p1;
	p = L;
	while (p)
	{
		p1 = p;
		p = p->next;
		delete p1;
	}
	L = NULL;
}
void Print_L(LinkList& L)
{
	LinkList p;
	p = L->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
void MergeList_L(LinkList& La, LinkList& Lb, LinkList& Lc)
{
	LinkList pa, pb, pc;
	pa = La->next;
	pb = Lb->next;
	Lc = La;
	pc = Lc;
	while (pa && pb)
	{
		if (pa->data < pb->data)
		{
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else
		{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
		pc->next = pa ? pa : pb;
	}
}
int main()
{
	LinkList list_a,list_b,list_c;
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		a[i] = i;
	}
	CreateList_L_Front(list_a, a, 10);
	cout << "采用头插法" << endl;
	Print_L(list_a);
	CreateList_L_Rear(list_b, a, 10);
	cout << "采用尾插法" << endl;
	Print_L(list_b);
	int num;
	GetElem_L(list_a, 5, num);
	ListDelete_L(list_a, 5, num);
	cout << "list_a表中5号位置的数为:" << num << endl;
	Print_L(list_a);
	ListInsert_L(list_a, 5, 5);
	Print_L(list_a);
	cout<<ListLength_L(list_a) << endl;
	InitList_L(list_c);
	MergeList_L(list_a, list_b, list_c);
	Print_L(list_c);
	system("pause");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值