#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;
}