线性表的链式储存结构及实现

typedef int ElemType;
struct NodeType
{
	ElemType data;					//数据域
	NodeType *next;					//指针域  存放本结构体类型结点的首地址
};

class LinkList
{
private:
	NodeType *Head;

public:
	LinkList();								//构造函数
	~LinkList();							//析构函数
	void create();							//创建一个非空链表
	void Display();							//显示链表的元素
	void insert(int i, ElemType x);			//在第i个结点插入插入元素
	void insert2(ElemType x, ElemType y);	//在数据域为x的结点前插入数据域为y的结点
	ElemType delet(int i);					//删除第i个结点的元素并返回该元素
	void delet2(ElemType x);                //删除表中值为x的元素并输出yes, 否则输出no
	void reverse();							//单链表的逆置
};
LinkList::LinkList()
{
	Head = new NodeType;

	Head->next = NULL;
	Head->data = 0;
	cout << "\n init" << endl;

}

//析构
LinkList::~LinkList()
{
	NodeType *p;
	p = Head->next;							//指向链表中第一个数据结点
	while (p != NULL)
	{
		Head->next = p->next;
		delete p;
		p = Head->next;

	}
}

//创建非空链表
void LinkList::create()
{
	NodeType *s;
	ElemType x;
	cout << "\n 请按倒序输入数据,以-999为结束标志。" << endl;
	cout << "\n data = ?"; cin >> x;							//先输入最后一个元素
	while (x != -999)
	{
		s = new NodeType;
		s->data = x;											//给当前结点的数据域赋值
		s->next = Head->next;									 //使s指向头结点指向的节点
		Head->next = s;											 //将s放在头结点的后面   /每次都放在Head的后面
		cout << "\n data = ?"; cin >> x;

	}
	cout << "\n 插入结束,链表生成" << endl;
}

void LinkList::Display()
{
	NodeType *p;
	p = Head->next;											//p指向第一个结点
	while (p != NULL)
	{
		cout << p->data << " ";							//输出第一个结点的数据
		p = p->next;									//指向第二个结点
	}
	cout << endl;

}

void LinkList::insert(int i, ElemType x)
{
	NodeType *p, *q, *s;
	int k = 1;									//不算头结点 从第一个结点开始查找
	q = Head;
	p = Head->next;
	while (k<i&&p!=NULL)			           //当K<i 并且p不为空时执行 p为空时说明前一次p已经指向了最后一个结点
	{
		q = p;
		p = p->next;
		k++;
	}
	if (k == i)
	{
		s = new NodeType;
		s->data = x;
		q->next = s;
		s->next = p;
		cout << "\n  插入成功,在第"<<i<<"个位置插入了数据域为"<<x<<"的结点" << endl;
	}
	else 
		cout << "\n  i<1或i太大,不存在" << endl;
		cout << "\n 插入结束" << endl;
}


ElemType LinkList:: delet(int i)
{
	NodeType *p, *q, *s;
	ElemType x;
	int k = 1;
	q = Head;													//q指向头结点

	p = Head->next;												//p指向第一个结点

	while (k < i&&p != NULL)
	{
	
		q = p;													//q指向p
		p = p->next;											//p指向p的后继结点
		k++; 
	}
	//循后得到第i个值

	if (p != NULL)         
	{
		x = p->data;												//得到第i个结点的数据域
		q->next = p->next;											//q指向p的后继结点
		delete p;													//删除p	
		cout << "\n  结点删除成功  删除了第"<<i<<"个结点" << endl;
	}
	else
	{
		cout << "\n  i<1或太大,i不存在" << endl;
		x = -1;
	}
	return x;

}
void LinkList::insert2(ElemType x, ElemType y)
{
	NodeType *p, *q, *s;
	s = new NodeType;
	s->data = y;

	q = Head;
	p = Head->next;
	
	while (p!=NULL&&p->data != x)
	{
		q = p;
		p = p->next;

	}
	if (p == NULL)
		cout << "\n  不存数据域为" << x << "的结点。 在表尾插入。" << endl;
		q->next = s;
		s->next = p;
		cout << "\n  向链表中插入了数据域为" << y << "的元素。" << endl;
}

void LinkList::delet2(ElemType x)
{
	NodeType *q, *p;

	q = Head;
	p = Head->next;

	while (p!=NULL&&p->data != x)
	{
		q = p;
		p = p->next;
	}
	if (p == NULL)
		cout << " \n No!" << endl;
	else
	{
		q->next = p->next;
		delete p;
		cout << " \n Yes!" << endl;
	}
}
void LinkList::reverse()
{
	NodeType *h, *p, *q;
	h = Head;            //h指向头结点
	p = h->next;			//p指向第一个结点
	h->next = NULL;        //断开头结点与后面的链接

	while (p != NULL)
	{
		q = p->next;				//q指向p的后继结点
		p->next = h->next;			//断开p与q的链接  使p指向头结点指向的结点
		h->next = p;				//头结点断开原来的链接 指向p
		p = q;						//将p和q指向相同的结点 即上次循环中p的下一个结点
	}
}

int main()
{
	LinkList h;
	h.create();
	h.Display();
	h.insert(5, 3);
	h.Display();
	h.insert2(25, 26);
	h.Display();
	h.delet(3);
	h.Display();
	h.delet2(25);
	h.Display();
	h.reverse();
	h.Display();
	std::cout << "Hello World!\n";
}

指针变量的一些主要操作
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael.Scofield

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值