链表的创建、显示以及删除所有相同的数字

使用自己的方法完成了删除链表中所有相同的数字。

#include <iostream>
using namespace std;

typedef struct node_
{
	int value;
	struct node_ *next;
}Node;

typedef Node* pNode;

struct list_
{
	Node* node;
};

void AddNode(pNode* head_, int value);
void displayLinkedlist(pNode head);
void releaseLinkedList(pNode* head);
void deleteNumber(pNode* head,int number);

int main()
{
	pNode head = nullptr;

	int number;
	cout << "Please Enter a number(number = -1 exit): " << endl;
	cin >> number;
	while (number != -1)
	{
		AddNode(&head, number);
		cout << "Please Enter a number(number = -1 exit): " << endl;
		cin >> number;
	}
	displayLinkedlist(head);

	cout << "find the number you entered , and delete it: " << endl;
	cin >> number;
	pNode tempHead = head;
	deleteNumber(&tempHead, number);

	return 0;
}

void AddNode(pNode* head_, int value)
{
	Node *newNode = new Node;
	newNode->value = value;
	newNode->next = nullptr;

	// 看是不是第一个节点
	if (!(*head_))
	{
		if (newNode)
		{
			*head_ = newNode;
			(*head_)->next = nullptr;
		}
	}
	else
	{
		// 要记录最后一个节点---如何找到最后一个节点,遍历;
		pNode lastNode = *head_;
		while (lastNode->next)
		{
			lastNode = lastNode->next;
		}
		// 否则在头部后面插入一个:
		lastNode->next = newNode;
	}
	// 释放node;
}

void displayLinkedlist(pNode head)
{
	cout << "display the current linkedlist: " << endl;
	while (head->next)
	{
		cout << head->value << " ";
		head = head->next;
	}
	cout << head->value << endl;
}

void releaseLinkedList(pNode* head)
{
	// release the linked list
	pNode temp = nullptr;
	while (*head)
	{
		temp = *head;
		*head = (*head)->next;
		delete temp;
	}
	cout << "\n已经释放了内存" << endl;
}
void deleteNumber(pNode* head,int number)
{
	bool isFound = false;
	bool isFirst = false;
	pNode tempNode = nullptr;
	pNode tempHead = (*head);
	pNode postNode = (*head)->next;

	while (postNode)
	{
		// check first one:
		if ((*head)->value == number&&(*head)->next)
		{
			isFound = true;
			isFirst = true;
			cout << "found it!\n";
			break;
		}

		// maybe can't check last one;
		if (postNode->value == number)
		{
			// than found second same number: 
			isFound = true;
			cout << "Found number: " << number << endl;
			break;
		}
		(*head) = (*head)->next;
		postNode = (*head)->next;
	} // end while;

	if (!isFound)
	{
		cout << "can't found this number: " << number << endl;
		cout << "that mean has delete all number: " << number;
		// if continue to using linkinlist ,not realease...
		releaseLinkedList(&tempHead);
	}
	else
	{
		// delete the number
		// check is last or not:
		if (postNode->next&&!isFirst)
		{
			(*head)->next = postNode->next;
			displayLinkedlist(tempHead);
			tempNode = postNode;
			delete tempNode;

			// delete all same number: 【caution】 can cause delete more times ptr;
			deleteNumber(&tempHead, number);
		}
		else if(isFirst)                // check first one:
		{
			tempNode = (*head);
			(*head) = (*head)->next;
			displayLinkedlist(*head);
			delete tempNode;
			deleteNumber(head, number);
		}
		else
		{
			tempNode = (*head)->next;
			delete tempNode;
			(*head)->next = nullptr;
			displayLinkedlist(tempHead);
			deleteNumber(&tempHead, number);
		}

	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值