数据结构List

#include <iostream>
#include <cstdlib>


using namespace std;
typedef struct node{
	char m_nValue;
	struct node *m_pNext;
}Node,*pNode;

void CreateList(pNode *pHead)
{
	pNode pCurrent,	pTemp;


	pCurrent = pTemp = (pNode)malloc(sizeof(Node));
	printf("please input the data:");
	scanf_s("%c", &pTemp->m_nValue);
	*pHead = NULL;
	while (pTemp->m_nValue != '#')
	{
		if (NULL == *pHead)
		{
			*pHead = pCurrent;
		}
		else
		{
			pCurrent->m_pNext = pTemp;
		}
		pCurrent = pTemp;
		pTemp = (pNode)malloc(sizeof(Node));
		scanf_s("%c", &pTemp->m_nValue);
		pTemp->m_pNext = NULL;
	}
}




void AddToTail(pNode *pHead, char elem)
{
	pNode tempCell;
	tempCell = (pNode)malloc(sizeof(Node));
	if (NULL == tempCell)
	{
		printf(" malloc failed\n");
		exit(1); //指示程序在退出时将数字1返回给操作系统
	}
	tempCell->m_nValue = elem;
	tempCell->m_pNext = NULL;
	if (*pHead == NULL)
	{
		*pHead = tempCell;
	}
	else
	{
		pNode pTemp = *pHead;
		while (pTemp->m_pNext != NULL)
			pTemp = pTemp->m_pNext;
		pTemp->m_pNext = tempCell;
	}
}


void Insert(pNode pHead, int position, char elem)
{//在position位置上插入elem结点 以0为第一个位置
	pNode pCell;
	pNode pTemp;
	pTemp = pHead;
	int n = 0;
	while (n != position && pTemp->m_pNext != NULL)
	{
		pTemp = pTemp->m_pNext;
	}
	if (position > n)
	{
		printf("wrong position\n");
	}
	else
	{
		pCell = (pNode)malloc(sizeof(Node));
		if (NULL == pCell)
		{
			printf(" malloc failed\n");
			exit(1); //指示程序在退出时将数字1返回给操作系统
		}
		pCell->m_nValue = pTemp->m_nValue; //实现了在不改变头指针的情况下将元素插入到第0个位置
		pTemp->m_nValue = elem;		 
		pCell->m_pNext = pTemp->m_pNext;
		pTemp->m_pNext = pCell;
	}
}




// 判断链表是否为空
int IsEmpty(pNode pHead)
{
	return pHead->m_pNext == NULL;
}


// 判断当前位置是否为链表末尾
int IsLast(pNode pPosition)
{
	return pPosition->m_pNext == NULL;
}


// 查找元素
pNode find(pNode pHead, char x)
{
	pNode pTemp = pHead->m_pNext;
	while (pTemp != NULL && pTemp->m_nValue != x)
	{
		pTemp = pTemp->m_pNext;
	}
	return pTemp;
}




void RemoveNode(pNode *pHead, char x)
{// 移除第一个含有x的结点
	if (pHead == NULL || *pHead == NULL)
	{
		return;
	}
	pNode pToBeDeleted = NULL;
	if ((*pHead)->m_nValue == x)
	{
		pToBeDeleted = *pHead;
		*pHead = (*pHead)->m_pNext;
	}
	else
	{
		pNode pTemp = (*pHead);
		while (pTemp->m_pNext != NULL && pTemp->m_pNext->m_nValue != x)
		{
			pTemp = pTemp->m_pNext;
		}
		if (pTemp->m_pNext != NULL && pTemp->m_pNext->m_nValue == x)
		{
			pToBeDeleted = pTemp->m_pNext;
			pTemp->m_pNext = pTemp->m_pNext->m_pNext;
		}
	}
	if (pToBeDeleted != NULL)
	{
		delete pToBeDeleted;
		pToBeDeleted = NULL;
	}
}


void Delete(pNode *pHead, char x)
{//删除多个x的结点
	pNode p1,p2;
	p1 = *pHead;
	p2 = NULL;
	if (p1 == NULL)
	{
		return;
	}
	else
	{
		while (p1->m_nValue == x)
		{// 连续多个结点要删除的结点在头结点处
			(*pHead) = (*pHead)->m_pNext;
			free(p1);
			p1 = (*pHead);
		}		
		while (p1 != NULL)
		{
			p2 = p1;
			p2 = p2->m_pNext;
			while (p2->m_nValue == x && p2->m_pNext != NULL)
			{
				p1->m_pNext = p2->m_pNext;
				free(p2);
				p2 = p1;
				p2 = p2->m_pNext;
			}
			if (p2->m_pNext == NULL)
			{
				if (p2->m_nValue == x)
				{
					free(p2);
					p1->m_pNext = NULL;					
				}
				else
				{
					p1->m_pNext = p2;
				}
				break;
			}
			else
			{
				p1 = p2;
			}
			
		}


	}
}






void DeleteList(pNode *pHead)
{
	pNode pTemp, pCell;
	pCell = *pHead;
	*pHead = NULL;
	while (NULL != pCell)
	{
		pTemp = pCell->m_pNext;
		free(pCell);
		pCell = pTemp;
	}
}


void Reverse(pNode *pHead)
{
	if ((NULL == *pHead))
		return;  //边界检测  
	pNode pPre = NULL;    //先前指针  
	pNode pCur = *pHead;  //当前指针  
	pNode pNext = NULL;       //后继指针  
	while (pCur != NULL)
	{
		pNext = pCur->m_pNext;
		pCur->m_pNext = pPre;
		pPre = pCur;
		pCur = pNext;
	}
	*pHead = pPre;        //记录下新的头结点  
}




void PrintList(pNode pHead)
{
	pNode pTemp = pHead;  //pHead 虽然为Node* 也有相应的存储空间,但是他是头指针,m_nValue没有值
	while (pTemp != NULL && pTemp->m_pNext != NULL)
	{
		printf("%c ", pTemp->m_nValue);
		pTemp = pTemp->m_pNext;
	}
	printf("%c \n", pTemp->m_nValue);
}
int main()
{
	pNode myList = NULL;
	pNode pTemp = NULL;


	CreateList(&myList);
	Delete(&myList, 'b');
	AddToTail(&myList,'d');
	PrintList(myList);
	Insert(myList, 0, 'a'); //插入元素


	pTemp = find(myList, 'c');
	Delete(&myList, 'b');
	PrintList(myList);
	Reverse(&myList);
	PrintList(myList);
	DeleteList(&myList);
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dabenxiong_1/article/details/47820347
今日推荐