SeqListD.c
#include"SeqListD.h"
void InitList(PNode* pHead)
{
assert(pHead);
*pHead=NULL;
}
Node *BuyNode(DataType data)
{
Node *pNewNode=(Node*)malloc(sizeof(Node));
if(pNewNode!=NULL)
pNewNode->_data=data;
pNewNode->_pNext=NULL;
return pNewNode;
}
void PushBack(PNode* pHead, DataType data)
{
assert(pHead);
if(*pHead==NULL)
*pHead=BuyNode(data);
else
{
Node*pTailNode=*pHead;
while(pTailNode->_pNext)
{
pTailNode=pTailNode->_pNext;
}
pTailNode->_pNext=BuyNode(data);
}
}
void PrintList(PNode pHead)
{
Node*pCurNode=pHead;
while(pCurNode)
{
printf("%d->",pCurNode->_data);
pCurNode=pCurNode->_pNext;
}
printf("NULL\n");
}
void PopBack(PNode* pHead)
{
Node*pTailNode=*pHead;
if(NULL==pTailNode)//本來就爲空
{
return;
}
else if(NULL==pTailNode->_pNext)//只有一個結點
{
free(pTailNode);
pTailNode=NULL;
}
else//有好多個結點
{
while(pTailNode->_pNext->_pNext)
{
pTailNode=pTailNode->_pNext;
}
free(pTailNode->_pNext);
pTailNode->_pNext=NULL;
}
}
void PushFront(PNode* pHead, DataType data)
{
assert(pHead);
if(NULL==*pHead)//空鏈表
{
*pHead=BuyNode(data);
}
else
{
Node* pNewNode=BuyNode(data);
pNewNode->_pNext=*pHead;
*pHead=pNewNode;
}
}
void PopFront(PNode* pHead)
{
Node* pDelNode=*pHead;
assert(pHead);
if(NULL==*pHead)
{
return;
}
else if(NULL==pDelNode->_pNext)
{
free(pDelNode);
pDelNode=NULL;
}
else
{
*pHead=pDelNode->_pNext;
free(pDelNode);
}
}
Node* Find(PNode pHead, DataType data)
{
Node*pCurNode=pHead;
while(pCurNode)
{
if(pCurNode->_data==data)
{
return pCurNode;
}
pCurNode=pCurNode->_pNext;
}
return NULL;
}
void Insert(PNode pos, DataType data)
{
Node*pNewNode=BuyNode(data);
if(NULL==pos)
{
return;
}
if(NULL==pNewNode)
return;
pNewNode->_pNext=pos->_pNext;
pos->_pNext=pNewNode;
}
void Erase(PNode* pHead, PNode pos)
{
assert(pHead);
assert(pos);
if((NULL==*pHead)&&(pos==NULL))
{
return;
}
else if(*pHead==pos)
{
PopFront(pHead);
}
else
{
Node*pNewNode=*pHead;
while(pNewNode->_pNext!=pos)
{
pNewNode=pNewNode->_pNext;
}
pNewNode->_pNext=pos->_pNext;
free(pos);
}
}
void PrintFromTail2Head(PNode pHead)
{
if(pHead!=NULL)
{
PrintFromTail2Head(pHead->_pNext);
printf("%d->",pHead->_data);
}
}
void DeleteNotTailNode(PNode pos)
{
Node*pDelNode;
if(NULL==pos || pos->_pNext==NULL)
return;
pDelNode=pos->_pNext;
pos->_data=pDelNode->_data;
pos->_pNext=pDelNode->_pNext;
free(pDelNode);
}
void Remove(PNode* pHead, DataType data)
{
Node* pPreNode = Find(*pHead,data);
assert(pHead);
if(pPreNode == NULL)
{
return;
}
else
{
Erase(pHead,pPreNode);
}
}
void RemoveAll(PNode* pHead, DataType data)
{
Node* pPreNode = Find(*pHead,data);
while(pPreNode)
{
Node* pPreNode = Find(*pHead,data);
assert(pHead);
if(pPreNode == NULL)
{
return;
}
else
{
Erase(pHead,pPreNode);
}
}
}
size_t Size(PNode pHead)
{
int count=0;
Node* pPreNode=pHead;
while(pPreNode)
{
count++;
pPreNode=pPreNode->_pNext;
}
printf("%d\n",count);
}
int Empty(PNode pHead)
{
if(pHead==NULL)
{
return 1;
}
else
{
return 0;
}
}
PNode Back(PNode pHead)
{
Node* pCurNode=pHead;
while(pCurNode->_pNext)
{
pCurNode=pCurNode->_pNext;
}
return pCurNode;
}
PNode Front(PNode pHead)
{
Node* pCurNode=pHead;
return pCurNode;
}
void Text1()
{
Node* Node,Node1;
int ret=0;
InitList(&Node);
PushBack(&Node, 1);
PushBack(&Node, 2);
PushBack(&Node, 3);
PushBack(&Node, 4);
//PopBack(&Node);
PushFront(&Node, 5);
PushBack(&Node, 2);
PushBack(&Node, 2);
PushFront(&Node, 6);
// PopFront(&Node);
//Insert(Node, 4);
//Erase(&Node,Node);
//DeleteNotTailNode(Node->_pNext);
// Remove(&Node, 2);
RemoveAll(&Node,2);
PrintList(Node);
// PrintFromTail2Head(Node);
Size(Node);
ret = Empty(Node);
if(ret=0)
{
printf("鏈表爲空\n");
}
else
{
printf("鏈表不爲空\n");
}
printf("%x\n",Back(Node));
printf("%x\n",Front(Node));
}
int main()
{
Text1();
system("pause");
return 0;
}
SeqListD.h
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
#define NULL 0
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node, *PNode;
//////////////////////////////////////////
// 初始化單鏈表
void InitList(PNode* pHead);
// 在單鏈表的尾部插入一個節點
void PushBack(PNode* pHead, DataType data);
// 刪除單鏈表的最後一個節點
void PopBack(PNode* pHead);
// 在單鏈表的頭部插入值爲data的結點
void PushFront(PNode* pHead, DataType data);
// 刪除單鏈表的第一個結點
void PopFront(PNode* pHead);
// 在單鏈表中查找值爲data的結點,找到了返回該結點的地址,否則返回NULL
Node* Find(PNode pHead, DataType data);
// 在單鏈表pos位置後插入值爲data的結點
void Insert(PNode pos, DataType data);
// 在單鏈表中刪除位置爲pos的結點
void Erase(PNode* pHead, PNode pos);
// 移除單鏈表中第一個值爲data的結點
void Remove(PNode* pHead, DataType data);
// 移除單鏈表中所有值爲data的結點
void RemoveAll(PNode* pHead, DataType data);
// 獲取單鏈表總結點的總個數
size_t Size(PNode pHead);
// 判斷結點是否爲空
int Empty(PNode pHead);
// 返回單鏈表的最後一個結點的位置
PNode Back(PNode pHead);
// 返回單鏈表的第一個結點的位置
PNode Front(PNode pHead);
// 構建一個新節點
Node* BuyNode(DataType data);
// 正向打印單鏈表
void PrintList(PNode pHead);
///////////////面試題//////////////////////////////
// 逆序打印單鏈表
void PrintFromTail2Head(PNode pHead);
// 刪除單鏈表的非尾結點(不能遍歷單鏈表)
void DeleteNotTailNode(PNode pos);
c++基礎值鏈表基本操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.