【数据结构】双向非循环链表

#include <iostream>
using namespace std;


struct doubleNode
{
	int data;
	doubleNode *next;
	doubleNode *prior;
};


typedef doubleNode* LinkList;


void init(LinkList *List);
bool insert(LinkList *List, int location, int data);
void show_position(LinkList List);
void show_reverse(LinkList List);
bool Delete(LinkList *List, int location);




int main()
{
	LinkList List;
	init(&List);
	for (int i = 1; i <= 10; i++)
	{
		insert(&List, i, i * 10);
	}
	Delete( &List,11);
	show_position(List);
	show_reverse(List);
	system("pause");
	return 0;
}


void init(LinkList *List)
{
	LinkList s = (LinkList)malloc(sizeof(doubleNode));
	s->data = -1;
	s->next = 0;
	s->prior = 0;
	*List = s;
}


bool insert(LinkList *List,int location,int data)
{
	int j = 1;
	LinkList p = *List;


	if (location < 1)
	{
		cout << "erro" << endl;
		return false;
	}


	while (j < location&&p != NULL)
	{
		j++;
		p = p->next;
	}


	if (p == NULL)
	{
		cout << "insert erro" << endl;
		return false;
	}


	LinkList s = (LinkList)malloc(sizeof(doubleNode));
	s->data = data;
	s->prior = p;
	s->next = p->next;	
	if (p->next)//非循环双向链表,在表尾插入节点时,不进行改操作。原因是空指针。
	{
		s->next->prior = s;
	}
	p->next = s;
	return true;
}


//
void show_position(LinkList List)
{
	List = List->next;
	cout << "position direction display: ";
	while (List)
	{
		cout << List->data << " ";
		List = List->next;
	}
	cout << endl;
}


void show_reverse(LinkList List)
{
	while (List->next)
	{
		List = List->next;
	}
	cout << "reverse direction display: ";
	while (List->prior)
	{
		cout << List->data << " ";
		List = List->prior;
	}
	cout << endl;
}


bool Delete(LinkList *List, int location)
{
	int j = 1;
	LinkList p = *List;


	if (location < 1)
	{
		cout << "delete erro" << endl;
		return false;
	}


	while (j < location&&p->next != NULL)
	{
		p = p->next;
		j++;
	}


	if (p->next == NULL)
	{
		cout << "delete erro" << endl;
		return false;
	}


	p = p->next;//待删除指针
	p->prior->next = p->next;


	if (p->next)//如果不是删除尾节点
	{
		p->next->prior = p->prior;
	}
	free(p);


	return true;
}

插入操作:需要注意的是,如果是要在尾节点插入,不需要s->next->piror=s这一步,因为s->next为空。

删除操作:需要注意的是,如果是删除最后一个节点,不需要

p->next->prior = p->prior;

因为p->next是空指针

猜你喜欢

转载自blog.csdn.net/qq_35564841/article/details/81006249