带头节点的单链表

// 带头节点的单链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef  int ElemType;
typedef  int Status;
typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode, * LinkList;
void init(LinkList& l)//初始化
{
	l = new LNode;
	l->next = NULL;

}
void createhead(LinkList& l,int n)//头插法
{
	init(l);
	int c;
	for (int i=0;i<n;i++)
	{
		cin >> c;
		LinkList p = new LNode;
		p->data = c;
		p->next = l->next;
		l->next = p;
	}

}
void createtail(LinkList& l, int n)//tail插法
{
	l = new LNode;//生成头节点
	l->next = NULL;
	LinkList r = l;//尾指针r,见李冬梅36页教材
	for (int i=0;i<n;i++)
	{
		int c; cin >> c;
		LinkList p = new LNode;
		p->data = c; p->next = NULL;//p节点成为最后的节点,所以为空,如果p->next指针不初始化则为野指针(野指针重点)
		r->next = p; r = p;

	}
}
void traverse(LinkList& l)//l为头指针
{
	LinkList p = l->next;
	while (p)
	{
		cout << p->data<<endl;
		p = p->next;
	}
}
int length(LinkList& l)
{
	LinkList p = l->next; int count = 0;
	while (p)
	{
		count++; p = p->next;
	}
	return count;
}
int empty(LinkList& l)
{
	if (l->next == NULL)
		return 0;
	else return 1;
}
void destory(LinkList& l)//这是连头节点也要删除
{
	LinkList p;
	while (l)
	{
		p = l->next;
		delete l;
		l = p;
	}
}
void clearlist(LinkList& l)//保存头节点,从首元节点开始删除
{
	LinkList q = l->next;
	l->next = NULL;
	while (q)
	{
		LinkList p = q->next; delete q; q = p;
	}
}
void getElem(LinkList& l,int i, ElemType& e)//找出链表中第i个值
{
	LinkList p = l->next;
	int count = 1;
	while (p&&count<i)
	{
		count++;
		p = p->next;
	}
	if (!p || count > i) return;//(!p)i>n||i<=0(今天这个地方学到了,开心!!!!)
	e = p->data;
	cout << e;
}
LinkList locate(LinkList& l,ElemType& e)
{
	LinkList p = l->next;
	while (p && p->data != e)
	{
		p = p->next;
	}
	return p;//查找成功返回值为e的节点地址p,查找失败p为null
}
int insert(LinkList& l, int i, ElemType e)
{
	LinkList p = l; int count = 0;//
	//LinkList p = l->next; int count = 1;//可以尝试下,发现这样写在第一个位置无法插入(是错的,所以注意细节)
	while (p && count < i - 1)
	{
		p = p->next; count++;
	}
	if (!p || count > i - 1)return 0;//i>n+1或者i<1(今天这个地方学到了,开心!!!!)
	LinkList s = new LNode;
	s->data = e;
	s->next = p->next; p->next = s;
}
void del(LinkList& l, int i)
{
	LinkList p = l; int count = 0;//道理同插入
	while (p && count < i - 1)//查找第i-1个节点,p指向该节点
	{
		count++; p = p->next;
	}
	if (!(p->next == NULL) || (count > i - 1))return;//i>n或i<1,删除位置不合理
	LinkList q = p->next;
	p->next = q->next;
	delete q;
}
//下面2个的函数,重点体会跟踪指针和工作指针,这在单链表常用
int prior(LinkList& l, ElemType cur_e, ElemType &pre_e)//这个稍微复杂点
{
	LinkList q, p = l->next;
	while (p && p->next)//循环条件写的真好!!!!!!
	{
		q = p->next;//q记录p的后继节点
		if (q->data == cur_e)
		{
			pre_e = p->data; return 1;
		}
		p = p->next;
	}
	return 0;
}
int next(LinkList& l, ElemType& cur_e, ElemType pre_e)
{
	LinkList p = l->next;
	while (p && p->next)
	{
		if (p->data == pre_e)
		{
			cur_e = p->next->data; return 1;
		}
		p = p->next;
	}
	return 0;
}

int main()
{
	LinkList l;
	createtail(l, 4);
	ElemType e;
	//insert(l,1,8);
	//getElem(l, 2, e);
	traverse(l);
    std::cout << "Hello World!\n";
	//cout << length(l);
	ElemType pre_e;
	prior(l, 3,pre_e);
	cout<< pre_e;
}
void bubblesort(LinkList& l,int length)
{
	LinkList p, pre;
	pre = p = l->next;
	int flag = 1;//flag=1
	for (int i=0;i<length-1&&(flag==1);i++)//
	{
		flag = 0;//flag=0,如果本趟排序没有发生交换,不会进行下趟排序
		pre = p = l->next;//从首元节点开始
		while (p)
		{
			pre = p;
			p = p->next;
			if (pre->data > p->data)//交换数据域
			{
				int temp = p->data; p->data = pre->data;
				pre->data = temp;
				flag = 1;
			}
			if (p->next == NULL)break;//最后一个节点,观察prior和next两个函数

		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值