不带头结点单链表全代码(C/C++)

#include<iostream>
#include<algorithm>

using namespace std;
typedef struct LNode {
	int data;
	struct LNode* next;



}LNode, * LinkList;
//初始化单链表
bool InitList(LinkList& L)
{
	L = NULL;
	return true;

}
//头插法创建单链表
LinkList List_HeadInsert(LinkList& L)
{
	InitList(L);
	int x = 0;
	cin >> x;
	while (x != 99)
	{
		LNode* s;
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = L;
		L = s;
		cin >> x;
	}

	return L;

}
//按位查找,不带头节点
LNode* GetElem(LinkList L, int i)
{
	if (i < 1)
	{
		return false;
	}
	int j = 1;
	LNode* p = L;
	while (p&& j < i)
	{
		p = p->next;
		j++;

	}

	return p;
}
//按值查找
LNode* LocateElem(LinkList L, int e)
{
	LNode* p = L;
	while (p && p->data != e)
	{
		p = p->next;
	}
	return p;

}
//统计单链表的长度
int Length(LinkList)
{
	int len = 0;
	LNode* p = L;
	while (p)
	{
		len++;
		p = p->next;
	}
	return len;


}
//后插操作。在节点p之后插入元素e
bool InsertNextNode(LNode* p, int e)
{
	if (!p)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
		if (!s)
		{
			return false;
		}
		s->data = e;
		s->next = p->next;
		p->next = s;

		return true;
}
//不带头节点的插入操作,在第i个位置插入元素e
bool ListInsert(LinkList& L, int i, int e)
{
	if (i < 1)//位置错误
	{
		return false;
	}
	if (i == 1)//在第一个位置插入
	{
		LNode* s = (LNode*)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L = s;

		return true;
	}
	LNode* p;//不在第一个位置插入;
	p = L;
	int j = 1;
	while (p && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (!p)
	{
		return false;
	}
	return InsertNextNode(p, e);

}
//前插操作,在p节点前插入元素e
bool InsertPriorNode(LNode* p, int e)
{
	if (!p)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	if (!s)
	{
		return false;
	}
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;

	return true;
}
//前插操作,在p节点前插入节点s;
bool InsertPriorNode(LNode* p, LNode* s)
{
	if (!p || !s)
	{
		return false;

	}
	s->next = p->next;
	p -> next = s;
	swap(s->data, p->data);
		return true;

}
//删除位序为i的节点,e是i节点的值
bool ListDelete(LinkList& L, int i, int& e)
{
	if (L == NULL)
	{
		e = -1;
		return false;
	}
	if (i < 1)
	{
		return false;
	}
	if (i > 1)
	{
		LNode* p = GetElem(L, i - 1);//安值查找,找到数据域等于e的节点
		if (!p || !(p->next))
		{
			return false;
		}
		LNode* q = p->next;//q指针指向位序为i的节点
		e = q->data;//将数值复制给e,
		p->next = q->next;//p指针跳过q指针指向下一个节点
		free(q);//这时q指针变为一个空节点,将这个结点释放
	}
	else//i==1;
	{
		if (L->next == NULL)//只有一个头节点,直接将这个节点变为空,
		{
			e = L->data;
			L = NULL;
		}
		else//L->next!==NULL;//头节点后还有节点,将下一个节点变为头节点.
		{
			e = L->data;
			L = L->next;
		}
	}
	
	return true;
}
//删除指定节点P,核心在于找p的下一个节点,将下一个节点的值覆盖P节点,p指向下下一个节点。
bool DeleteNode(LNode* p)
{
	if (p->next == NULL)//bug,不能删除最后一个节点
	{
		return false;
	}
	LNode* q = p->next;
	p->data = q->data;
	p->next = q->next;
	free(q);
	return true;

}
//尾插法创建不带节点的单链表
LinkList List_Taillnsert(LinkList& L)
{
	InitList(L);
	int x = 0;
	cout << "请输入数据" << endl;
	cin >> x;
	LNode* s, * r = L;//r=L->next;
	
	while ( x!= 9999) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		s->next = NULL;
		if (L == NULL) {//第一次插入,L==NULL;
			L = s;//将覆盖L;
			r = s;//指针还是指向最后
		}
		else {//从第二此插入开始,L!=NULL
			r->next = s;//此次表尾指针指向最后
			r = s;//
		}
		cin >> x;
	}
	r->next = NULL;//退出的时候表尾指针指向NULL
	return L;
}

void print(LinkList L)//打印单链表
{
	LNode* s = L;
	while (s != NULL)
	{
		cout << s->data << " ";
		s = s->next;
	}
	cout << endl;

}
int main()
{
	LinkList L;
	List_HeadInsert(L);
	cout << "头插法的结果" << endl;
	print(L);




	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值