#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node
{
int m_nVal;
Node *next;
};
Node *Create()
{
bool bFlag = true;
Node *pHead = NULL,
*pTemp = NULL,
*pCur = NULL;
int nValue;
pHead = (Node*)malloc(sizeof(Node));
if (NULL == pHead)
{
return NULL;
}
pHead->next = NULL;
pCur = pHead;
while(bFlag)
{
pTemp = (Node*)malloc(sizeof(Node));
if(NULL == pTemp)
{
return NULL;
}
cout<<"输入链表信息,输入0时退出"<<endl;
scanf("%d", &nValue);
if (nValue != 0)
{
pTemp->m_nVal = nValue;
pTemp->next = NULL;
pCur->next = pTemp;
cout<<(pTemp->m_nVal)<<endl;
pCur = pTemp;
}
else
bFlag = false;
}
pHead = pHead->next;
pCur->next = NULL;
return pHead;
}
int length(Node *head)
{
if (NULL == head)
{
return 0;
}
Node *pCur = head;
int i = 0;
//第一次指向第一个节点,并将其next数据赋值给变量
//第n次指向第n个节点,并将其next指针赋值给变量
//当检测到为尾节点时,其next指针为NULL退出循环
while(pCur)
{
pCur = pCur->next;
i++;
}
return i;
}
bool print(Node *head)
{
if (NULL == head)
{
return false;
}
Node *pCur = head;
cout << "链表信息"<<endl;
while(pCur)
{
cout << pCur->m_nVal << endl;
pCur = pCur->next;
}
return true;
}
//删除链表中第num个节点
Node *del(Node *head, int pos)
{
if (NULL == head || pos < 1 || pos > length(head))
{
return NULL;
}
Node *pCur = head;
if (1 == pos)
{
pCur = pCur->next;
free(head);
return pCur;
}
for (int i=1; i<pos-1; i++)
{
pCur = pCur->next;
}
//pCur定位到待删除点的前一个节点
pCur->next = pCur->next->next;
return pCur;
}
//在第pos个节点后增加一个节点
Node *addafterpos(Node *pHead, int pos, int val)
{
if (NULL == pHead || pos < 1 || pos > length(pHead) + 1)
{
return NULL;
}
Node *pTemp = pHead;
Node *pNew = (Node*)malloc(sizeof(Node));
if (NULL == pNew)
{
return NULL;
}
pNew->m_nVal = val;
pNew->next = NULL;
if (pos == length(pHead))
{
//注意循环条件是pTemp->next
while(pTemp->next)
{
pTemp = pTemp->next;
}
pTemp->next = pNew;
return pHead;
}
for (int i=1; i<pos; i++)
{
pTemp = pTemp->next;
}
pNew->next = pTemp->next;
pTemp->next = pNew;
return pHead;
}
//第pos个节点前插入节点数据为val
Node *insertbefore(Node *pHead, int pos, int val)
{
if (NULL == pHead || pos < 1 || pos > length(pHead))
{
return NULL;
}
Node *pTemp = pHead;
Node *pNew = (Node*)malloc(sizeof(Node));
if (NULL == pNew)
{
return NULL;
}
pNew->next = NULL;
pNew->m_nVal = val;
//表头位置插入
if (1 == pos)
{
pNew->next = pHead;
return pNew;
}
for (int i=1; i<pos-1; i++)
{
pTemp = pTemp->next;
}
//pTemp指向了第pos-1个节点
pNew->next = pTemp->next;
pTemp->next = pNew;
return pHead;
}
//需要完善单链表的逆置,以及排序
int main(int argc, char* argv[])
{
Node *pHead;
int len;
pHead = Create();
len = length(pHead);
cout << "Len:" << len << endl;
print(pHead);
pHead = del(pHead, 1);//删除节点1
print(pHead);
pHead = addafterpos(pHead,5,1);//在第五个节点后插入节点,其值为5
print(pHead);
pHead = insertbefore(pHead, 1,1);//在第一个节点前插入节点,其值为1
print(pHead);
getchar();
return 0;
}
C语言实现单链表的各种操作
最新推荐文章于 2021-09-22 16:27:00 发布