线性表结构、类别以及功能的实现。

 一  线性表

1 顺序表:

typedef struct {

	int elem[100];

	int length;    //length是顺序表的长度

} SqList;

顺序表的长度是固定的,elem存放数据,存入一个数据length+1。

1.1 顺序表的创建

void Dnital(Sqlist &L)
{
	cout << "请输入线性表的长度" << endl;
	cin >> L.last;
	cout << "请输入元素" << endl;
	for (int i = 0; i < L.last; i++) 
	{
		cin >> L.str[i];
	}

}
1.1 顺序表的删除
void Delete(Sqlist &L)
{
	int a;
	cout << "请输入要删除的元素的位置" << endl;
	cin >> a;
	if (a > L.last || a < 1)         //如果大于当前的长度或者小于0则输入错误
	{
		cout << "输入错误" << endl;
	}
	else
	{
		L.str[a - 1] = 0;
		for (int i = a; i < L.last; i++)
		{
			L.str[i - 1] = L.str[i];
		}
	}
	L.last--;

}
1.1 顺序表的增加
void Insert(Sqlist &L)
{
	int t;
	cout << "请输入插入元素的位置" << endl;
	cin >> t;
	if (t < 1 || t>L.last)
	{
		cout << "未知错误" << endl;
	}
	else
	{
		for (int i = L.last - 1; i > t - 2; i--)
		{
			L.str[i + 1] = L.str[i];
		}
		cout << "输入插入元素的值" << endl;
		cin >> L.str[t-1];
		L.last++;
	}

}

2 单链表:
typedef struct LNode{

	int elem;

	struct LNode *next;

} LNode, *LinkList;

elem存放数据,*next是一个LNode类型的指针,存放下一个节点。
LNode是一个结点,*LinkList是头指针。
注意:头节点是指向第一个节点的,头结点内不存放数据,当有头结点的时候头指针指向头结点,没有头结点的时候指向第一个节点。
2.1 单链表的创建
void CreatList(LinkList &v, int n)
{//生成一个带头结点的有n个元素的单链表 
	int i;
	LinkList p;
	v = (LinkList)malloc(LEN);  //生成头结点
	v->next = NULL;
	cout << "请输入%d个字符:例如:abcdefg\n" << endl;
	getchar();
	for (i = n; i>0; --i)
	{
		p = (LinkList)malloc(LEN); //生成新结点
		scanf("%c", &p->data);
		p->next = v->next; //新结点的是最后一个结点,所以next为NULL
		v->next = p;//使v里面的next存放p
	}
}
2.2 单链表的删除
BOOL ListDelete(LinkList &v, int i, char &e)
{//在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False
	LinkList p, q;
	int j = 0;
	p = v;
	while (p->next&&j<i - 1)  //查找第i-1个元素位置
	{
		p = p->next; ++j;
	}
	if (!(p->next) || j>i - 1) return False; //查找失败
	q = p->next; p->next = q->next; //删除该元素    
	e = q->data;         //e取得该元素值
	free(q);           //释放该元素空间
	return True;
}
2.3单链表的增加
BOOL ListInsert(LinkList &v,int i,char e)
{//在单链表的第i各位置插入元素e,成功返回True,失败返回False
 LinkList p,s;
 int j=0;
 p=v;
 while(p&&j<i-1) {p=p->next;++j;} //查找第i-1个元素的位置
 if(!p||j>i-1) return False;  //没有找到
 s=(LinkList)malloc(LEN);     //生成一个新结点     
 s->data=e;            
 s->next=p->next;        //将新结点插入到单链表中 
 p->next=s;
 return True;
}

3 循环链表

循环链表和单链表一样,只不过循环链表的最后一个节点的next指向头结点。

4 双向链表

typedef struct DLNode {

	int elem;

	struct DLNode *prior;

	struct DLNode *next;

} DLNode, *DLinkList;
双向链表多了一个prior指针,指向前一个元素。
4.1 双向链表的增加
BOOL ListInsert(sLinkList &v, int i, char e)
{//在单链表的第i各位置插入元素e,成功返回True,失败返回False
	sLinkList p, s;
	int j = 0;
	p = v;
	while (p&&j<i - 1) { p = p->next; ++j; } //查找第i个元素的位置
	if (!p || j>i - 1) return False;  //没有找到
	s = (sLinkList)malloc(LEN);     //生成一个新结点     
	s->data = e;
	s->prior = p->prior;	        //将新结点插入到单链表中
	s->next = p->prior->next;
	s->next = p;
	p->prior = s;
	return True;
}

4.2 双向链表的删除
BOOL ListDelete(LinkList &v, int i, char &e)
{//在单链表中删除第i个元素,成功删除返回True,并用e返回该元素值,失败返回False
	LinkList p, q;
	int j = 0;
	p = v;
	while (p->next&&j<i - 1)  //查找第i-1个元素位置
	{
		p = p->next; ++j;
	}
	if (!(p->next) || j>i - 1) return False; //查找失败
	p->prior->next = p->next;   //把要删除元素的前一个结点的prior指向他的后面的节点
	p->next->prior = p->prior; //把他后面节点的next指向前面的节点
	free(p);           //释放该元素空间
	return True;
}
5 静态链表
typedef struct {

    int elem;

    int next;

} SLNode, slinklist[MAXSIZE];
结点里面的next存放的是下一个结点在数组中的位置。
数组的第一个元素和最后一个元素不放数据。
没有使用的数组元素称为备用链表,数组0,存放第一个备用链表。
备用链表最后一个元素存放第一个存放数组的下标。








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zero游戏开发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值