线性表 (更新中)

以下是学习知识点的记录,方便自己复习,若有错误,请前辈们指正,谢谢!



用结构体类型定义顺序表:

#define listsize 100

typedef int typedata;                 //typedata相当于int的别名,像一个人的外号和名字都是指那个人

typedef struct 
{
	typedata data[listsize];    //相当于 int data [listsize]
	int length;
} Seqlist;   

创建结构体对象:

Seqlist *seqlist =new Seqlist();


添加数据:

void sequencelist::addSeqlist(int num)
{
	seqlist->data[seqlist->length] = num;
	seqlist->length++;
}


获取长度:

int sequencelist::getLength()
{
	return seqlist->length;
}


获取某个点的数据:

int sequencelist::getData(int num)
{
	int lengh = seqlist->length;
	if (num<0 || num>lengh)
	{
		cout << "错误:" << "位置 " << num << "无效" << endl;
		return 0;
	}
	else
	{
	 return seqlist->data[num];
	}
}

插入数据:

int sequencelist::insertSeqlist(int values, int index)
{
	int length = seqlist->length;
	if (length>=listsize)
	{
		cout << "错误:" << "溢出" << endl;
		return 0;
	}
	else if (index<0||index>length)
	{
		cout << "错误:" << "插入位置 "<< index << "无效" << endl;
		return 0;
	}
	else
	{
		for (int i = 0; i < length - index; i++)
		{
			seqlist->data[length - i] = seqlist->data[length - i - 1];
		}
		seqlist->data[index] = values;
		seqlist->length++;
		return 1;
	}
}

替换某点的数据:

void sequencelist::setSeqlist(int values,int num)
{
	if (num<0 ||(num>seqlist->length))
	{
		cout << "错误:" << "该位置 " << num << "无效" << endl;
		return;
	}
	seqlist->data[num] = values;
}

删除某个点:

int sequencelist::deleteSeqlist(int index)
{
	int lengh = seqlist->length;
	if (index<0 || index>lengh)
	{
		cout << "错误:" << "位置 " << index << "无效" << endl;
		return 0;
	}
	else
	{
		for (int i = 0; i < lengh - index; i++)
		{
			seqlist->data[index + i] = seqlist->data[index + i + 1];
		}
		seqlist->length--;
		return 1;
	}
}

删除所有数据:

void sequencelist::deleteAllSeqlist()
{
	int length = seqlist->length;
	for (int i = 0; i < length; i++)
	{
		seqlist->data[i] = NULL;
		seqlist->length--;
	}
}

代码整合:https://share.weiyun.com/28820443cac6e38afb9393c649ad1a21



用结构体类型定义链表:


.h文件:

typedef struct node
{
	char data;
	struct node *next;
}linkelist;

linkelist *head, *last, *p;



1、 当head指针为NULL时,建立新空间,并把空间0的地址给head指针,由于开始只有一个空间,所以last = head,last也指向head指向的空间0。
2、 head的空间0被建立之后,开始建立下一个空间1给p指针,由于last指向了和head相同的空间0,所以用last->next = p;将p空间1的地址给head空间0的next指针,然后让last指向p指向的空间1。
3、再新建一个空间2,并将地址给p指针,此时last指向了上一个的空间1,而p指向了刚建立的空间2,所以last->next = p;将新空间2的地址给上一个空间1的next指针,然后再让last指向p空间2的位置。

.cpp文件:


添加数据:

void addlist(char data)
{
	if (head == NULL)
	{
		head = (linkelist*)malloc(sizeof(linkelist));
		head->next = NULL;
		last = head;
	}
		p = (linkelist*) malloc(sizeof(linkelist));
		p->data = data;
		p->next = NULL;
		last->next = p;
		last = p;
}

获取某点的数据:

char getlist(int num)
{
	linkelist *temp = head->next;
	for (int i = 0; i < num; i++)
	{
		temp = temp->next;
	}
	return temp->data;
}

获取某个数据的位置:

int getindex(char num)
{
	int i = 0;
	linkelist *temp = head->next;
	while (temp->data != num)
	{
		i++;
		temp = temp->next;
	}
	return i;
}

向指定位置插入数据:

void insertlist(int index, char values)
{
	linkelist *temp = head;
	linkelist *np = (linkelist*)malloc(sizeof(linkelist));
	for (int i = 0; i < index; i++)
	{
		temp = temp->next;
	}
	np->data = values;
	np->next = NULL;
	np->next = temp->next;
	temp->next = np;
}

得到链表的长度:

int getlenght()
{
	int lenght = 1;
	linkelist *temp = head->next;
	while (temp->next!=NULL)
	{
		lenght++;
		temp = temp->next;
	}
	return lenght;
}

替换指定位置的数据:

void setlist(int index, char values)
{
	linkelist *temp = head->next;
	for (int i = 0; i < index; i++)
	{
		if (temp->next != NULL)
		{
			temp = temp->next;
		}
		else
		{
			printf("(%d)该位置不存在\n",index);
			return;
		}
	}
	temp->data = values;
}

删除指定位置:

void deletelist(int index)
{
	linkelist *temp = head;
	linkelist *d;
	for (int i = 0; i < index; i++)
	{
		temp = temp->next;
	}
	if (temp->next->next != NULL)
	{
		d = temp->next;
		temp->next = temp->next->next;
		free(d);
	}
	else
	{
		d = temp->next;
		temp->next = NULL;
		free(d);
	}
	
}

代码整合: https://share.weiyun.com/f6e5ae6f657100d061800e399f8b0c29


用结构体类型定义双向循环链表:


.h文件

#pragma once

typedef struct node
{
	struct node *previous;
	int data;
	struct node *next;
}doublelist;

class doublelinkedlist
{
public:
	doublelinkedlist();
	~doublelinkedlist();
	void add(int values);
	int getlenght();
	int getvalues(int index);
	int getvalues2(int index);
	void insertlist(int index, int values);
	void deletelist(int index);
	void setvalues(int index, int values);
	void deleteAll();

private:
	doublelist *p, *head, *last;
	int length;
};


原理和单链表一样,就多了previous指针的指向


.cpp文件

添加数据:

void doublelinkedlist::add(int values)
{
	if (head == NULL)
	{
		head = (doublelist*)malloc(sizeof(doublelist));
		head->data = values;
		last = head;
		length++;
	}
	else
	{
		p = (doublelist*)malloc(sizeof(doublelist));
		p->data = values;
		p->previous = last;
		last->next = p;
		last = p;
		last->next = head;
		head->previous = last;
		length++;
	}
}

获取长度:

int doublelinkedlist::getlenght()
{
	return length;
}

获取指定位置的数据:

int doublelinkedlist::getvalues(int index)
{
	doublelist *temp = head;
	if (temp == NULL)
	{
		return 0;
	}
	else if (index>length-1|index<0)
	{
		printf("getvalues失败:%d无效位置\n", index);
	}
	for (int i = 0; i < index; i++)
	{
		temp = temp->next;
	}
	return temp->data;
}

获取指定位置的数据2:

int doublelinkedlist::getvalues2(int index)
{
	doublelist *temp = head;

	if (temp == NULL)
	{
		return 0;
	}
	else if (index<0)
	{
		printf("getvalues2失败:%d无效位置\n", index);
		return 0;
	}
	else if (index <= length / 2){
		for (int i = 0; i < index; i++)
		{
			temp = temp->next;
		}
		return temp->data;
	}
	else if (index<length)
	{
		temp = last;
		for (int i = 0; i < length - index - 1; i++)
		{
			temp = temp->previous;
		}
		return temp->data;
	}
	else
	{
		printf("getvalues2失败:%d无效位置\n", index);
		return 0;
	}
}


向指定位置插入数据:
void doublelinkedlist::insertlist(int index, int values)
{
	doublelist *temp = head->previous;

	if (index>length)
	{
		printf("insertlist失败:插入无效(%d)\n", index);
		return;
	}

	for (int i = 0; i < index; i++)
	{
		temp = temp->next;
	}
	p = (doublelist*)malloc(sizeof(doublelist));
	p->next = temp->next;
	temp->next->previous = p;
	p->data = values;
	p->previous = temp;
	temp->next = p;
	length++;

	if (index == 0)
	{
		head = p;
	}
	if (index == length - 1)
	{
		last = p;
	}
}

删除指定位置的数据:

void doublelinkedlist::deletelist(int index)
{
	doublelist *temp = head;
	for (int i = 0; i < index; i++)
	{
		temp = temp->next;
	}
	temp->previous->next = temp->next;
	temp->next->previous = temp->previous;

	if (index == 0)
	{
		head = temp->next;
	}
	if (index == length - 1)
	{
		last = temp->previous;
	}

	free(temp);
	length--;
}


设置指定位置的数据:

void doublelinkedlist::setvalues(int index, int values)
{
	if (index <= length / 2){
		doublelist *temp = head;
		for (int i = 0; i < index; i++)
		{
			temp = temp->next;
		}
		temp->data = values;
	}
	else if (index<length)
	{
		doublelist *temp = last;
		for (int i = 0; i < length - index - 1; i++)
		{
			temp = temp->previous;
		}
		temp->data = values;
	}
	else
	{
		printf("setvalues失败:%d无效位置\n", index);
		return;
	}
}

删除所有数据:

void doublelinkedlist::deleteAll()
{
	doublelist *temp = head;
	doublelist *r;
	int k = length;
	for (int i = 0; i < k; i++)
	{	
		r  =  temp;
		temp = temp->next;
		free(r);
		length--;
	}
	head = NULL;
	last = head;
}


代码整合: https://share.weiyun.com/14a57933286e5a54441dfc30cddbccf1


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值