链表:由节点组成。节点由数据域和指针域。链表的内存不一定是连续的。
首先我们需要使用结构体定义一个链表的结点
struct Node
{
int n;
Node *pnext;
};
创建一个n个节点的链表
Node* CreateList(int n)
{
Node *phead=nullptr,*prear=nullptr;
for (int i=0;i<n;i++)
{
Node *pnew=(Node*)malloc(sizeof(Node));
cin>>pnew->n;
pnew->pnext=nullptr;
if(0==i)
{
prear=phead=pnew;
}else
{
prear->pnext=pnew;
prear=pnew;
}
}
return phead;
}
根据数组的创建链表//前闭后开
Node* CreateList(int *pBegin,int *pEnd)
{
Node *phead=nullptr,*prear=nullptr;
for (int *p=pBegin;p!=pEnd;p++)
{
Node *pnew=(Node*)malloc(sizeof(Node));
pnew->n=*p;
pnew->pnext=nullptr;
if(p==pBegin)
{
prear=phead=pnew;
}else
{
prear->pnext=pnew;
prear=pnew;
}
}
return phead;
}
遍历链表
void PrintList(const Node *phead)
{
while(phead!=nullptr)
{
cout<<phead->n<<endl;
phead=phead->pnext;
}
}
插入一个节点
Node* InsterList(Node *phead,const Node *pnew,int pos)
{
Node *p=new Node;
p->n=pnew->n;
p->pnext=nullptr;
if(nullptr==phead)
{
phead=p;
}else
{
if(pos<=1)
{
p->pnext=phead;
phead=p;
}else
{
Node *pTemp=phead;
int i=1;
while(pTemp->pnext!=nullptr)
{
++i;
if(i>=pos)
break;
pTemp=pTemp->pnext;
}
p->pnext=pTemp->pnext;
pTemp->pnext=p;
}
}
return phead;
删除节点(删除一个节点或者一个都不删除)
Node* DelList(Node *phead,int n)
{
if(phead!=nullptr)
{
if(phead->n==n)
{
Node *ptemp=phead;
phead=phead->pnext;
free(ptemp);
ptemp=nullptr;
}else
{
Node *ptemp=phead;
while(ptemp->pnext!=nullptr)
{
if(ptemp->pnext->n==n)
{
Node *p=ptemp->pnext;
ptemp->pnext=p->pnext;
free(p);
p=nullptr;
break;
}
ptemp=ptemp->pnext;
}
}
}
return phead;
}
删除所有满足条件的节点
Node* DelList(Node *phead, int n, bool isDelAll) {
if (isDelAll) {
if (phead->n == n)
{
while (phead->n == n)
{
Node *ptemp = phead;
phead = phead->pnext;
free(ptemp);
ptemp = nullptr;
}
}
else
{
Node *ptemp = phead;
while (ptemp != nullptr && ptemp->pnext != nullptr)
{
if (ptemp->pnext->n == n)
{
Node *p = ptemp->pnext;
ptemp->pnext = p->pnext;
free(p);
p = nullptr;
continue;
}
ptemp = ptemp->pnext;
}
}
return phead;
}
else {
DelList(phead, n);
}
}
对于已经排序的链表,删除相同节点(同一个值只保留一个)
Node* DelSameNodeList(Node *phead) {
if (phead != nullptr) {
Node* ptemp = phead;
while (ptemp ->pnext != nullptr)
{
if (ptemp->n == ptemp->pnext->n)
{
Node *p = ptemp->pnext;
if (p->pnext == nullptr)
{
ptemp->pnext = nullptr;
}
else {
ptemp->pnext = p->pnext;
}
free(p);
p = nullptr;
continue;
}
ptemp = ptemp->pnext;
}
}
return phead;
}
链表排序(这里使用每个节点里面的值来进行交换)
Node* OrderList(Node *phead) {
if (phead != nullptr) {
int n = 0, i;
Node *p = phead;
while (p!=nullptr)
{
n++;
p = p->pnext;
}
for (p = phead,i = 1; i < n; i++, p = p->pnext)
for (Node *q = p->pnext; q != nullptr; q = q->pnext)
if (p->n < q->n)
{
int temp = p->n;
p->n = q->n;
q->n = temp;
}
}
return phead;
}
清空链表
void ClearList(Node** pphead)
{
while(*pphead!=nullptr)
{
Node *ptemp=*pphead;
*pphead=(*pphead)->pnext;
free(ptemp);
ptemp=nullptr;
}
}
主函数
int main()
{
Node *phead=CreateList(5);
cout<<"******************"<<endl;
phead = OrderList(phead);
PrintList(phead);
return 0;
}