单链表的基本操作

头文件:
#include<stdio.h>
#include<stdlib.h>
定义

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

初始化单链表

bool InitList(LinkList &L)
{
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL)return false;
	L->next = NULL;
}

bool ListEmpty(LinkList L)
{
	if(L->next != NULL)
		return true;
	else
		return false;
}

单链表判空

bool ListEmpty(LinkList L)
{
	if(L->next != NULL)
		return true;
	else
		return false;
}

构造单链表—头插法,逆序建表

void CreateList_head(LinkList &L, int n)//头插法,逆序建表 
{
	LNode *p;
	printf("头插法逆序建立单链表	输入%d个元素:", n);
	for(int i = n; i > 0; i --)
	{
		p = (LinkList)malloc(sizeof(LNode));
		scanf("%d", &p->data);
		p->next = L->next;
		L->next = p;
	}
}

构造单链表—尾插法,正序建表

void CreateList_tail(LinkList &L, int n)//尾插法,正序建表
{
	LNode *p;
	LNode *r = L;
	printf("尾插法正序建立单链表	输入%d个元素:", n);
	for(int i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(LNode));//生成新结点
		scanf("%d", &p->data);
		r->next = p;
		r = p;
	} 
	r->next = NULL;
}

单链表中插入元素

bool ListInsert(LinkList &L, int i, int e)
{
	int j;
	LNode *p, *s;
	p = L; 
	j = 0;
	while(p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if(!p || j > i - 1)//属于什么情况---i小于1或者大于表长加一
		return false;
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p ->next;
	p->next = s;
	return true;
}

单链表中删除元素

bool ListDelete(LinkList &L, int i, int &e)
{
	LNode *p, *q;
	int j;
	p = L; 
	j = 0;
	while(p->next && j < i - 1)
	{
		p = p->next;
		j ++;
	}
	if(!(p->next) || j > i - 1)return false;//删除位置不合理
	q = p->next;
	p->next = q->next;
	e = q->data;
	free(q);
	return true;
}

求单链表的长度

int ListLength(LinkList L)
{
	LNode *p;
	int length = 0;
	p = L->next;
	while(p)
	{
		length++;
		p = p->next;
	}
	return length;
}

单链表按序查找

bool GetElem(LinkList L, int i, int &e)
{
	LNode *p;
	p = L->next;
	int j = 1;
	while(p && j < i)
	{
		p = p->next;
		j++;
	}
	if(!p || j > i)
		return false;
	e = p->data;
	return true;
}

单链表按值查找

bool GetElem_value(LinkList L, int e, int &pos)//按值查找 
{
	LNode *p;
	p = L->next;
	pos = 1;
	while(p != NULL && p->data != e)
	{
		p = p->next;
		pos ++;
	}
	if(p == NULL)
		return false;
}

找出指定元素的前驱
若cur_e是L 的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无意义

bool PriorElem(LinkList L, int cur_e, int &pre_e)
{
	LNode *pre = L;
	LNode *p = L->next;
	if(p->data == cur_e)//cur_e是L的第一个数据元素
		return false;
	else
	{
		pre = p;
		p = p->next;//pre永远指向p的前一个结点
	}
	while(p && p->data != cur_e)
	{
		pre =p;
		p = p->next;
	}
	if(p)
	{
		pre_e = pre->data;
		return true;
	}
	else
		return false;//cur_e不是L 的数据元素
}

找出指定元素的后继
若cur_e是L 的数据元素,且不是最后一个,则用nxt_e返回它的后继,否则操作失败,nxt_e无意义

bool NextElem(LinkList L,int cur_e,int &nxt_e)
{
	LNode *p = L->next;
	LNode *q;
	while(p->next)
	{
		q=p->next;//q永远指向p的下一位置 
		if(p->data==cur_e)
		{
			nxt_e=q->data;
			return true;
		}
		p=q;
	}
	return false;
}

输出单链表

void Print(LinkList L) 
{
	LNode *p = L->next;
	while(p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
}

清空单链表

void ClearList(LinkList &L)
{
	LNode *p = L->next;
	LNode *q;
	while(p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}

销毁单链表

void DestroyList(LinkList &L)
{
	LNode *p;
	while(L)
	{
		p = L->next;
		free(L);
		L = p;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值