#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
using namespace Std;
To implement a single-linked list:
typedef int DATATYPE;
typedef struct LISTNODE
{
struct ListNode *_pnext;
DataType _data;
}listnode;
listnode* NewNode (DataType x)
{
ListNode *tem = (ListNode *) malloc (sizeof (ListNode));
Tem->_data = x;
Tem->_pnext = NULL;
return tem;
}
void Display (const listnode* phead)
{
while (Phead)
{
cout << phead->_data << "-";
Phead = phead->_pnext;
}
cout << Endl;
}
void Pushfront (listnode*& phead,datatype x)
{
if (Phead = = NULL)
{
Phead = NewNode (x);
}
Else
{
ListNode *cur = NewNode (x);
Cur->_pnext = Phead;
Phead = cur;
}
}
void Popfront (listnode*& phead)
{
if (phead! = NULL)
{
ListNode *del = Phead;
Phead = phead->_pnext;
Free (DEL);
}
}
void pushback (listnode*& phead, DataType x)
{
if (Phead = = NULL)
{
Phead = NewNode (x);
}
Else
{
ListNode *tem = Phead;
while (tem->_pnext! = NULL)
{
TEM = tem->_pnext;
}//>>>>>>>>>>>>>>> Loop to the end
ListNode *cur = NewNode (x);
Tem->_pnext = cur;
Cur->_pnext = NULL;
}
}
void Popback (listnode*& phead)
{
ListNode *tem = Phead;
while (tem->_pnext->_pnext! = NULL)
{
TEM = tem->_pnext;
}
Free (tem->_pnext);
Tem->_pnext = NULL;
}
listnode* Find (Listnode*phead, DataType x)
{
ListNode *tem = Phead;
while (tem->_pnext! = NULL)
{
if (Tem->_data = = x)
{
return tem;
}
TEM = tem->_pnext;
}
}
void Insert (listnode*& pos, DataType x)
{
ASSERT (POS);
listnode* cur = NewNode (x);
Cur->_pnext = pos->_pnext;
Pos->_pnext = cur;
DataType tem = pos->_data;
Pos->_data = cur->_data;
Cur->_data = tem;
}
void Erase (Listnode*&phead, listnode*& POS)//>>>>>>>
{
ASSERT (Phead);
ASSERT (POS);
ListNode *cur = Phead;
while (cur->_pnext->_data! = pos->_data)
{
Cur = cur->_pnext;
}
if (Cur->_pnext = = NULL)
{
cout << "This node is not found!" "<< Endl;
}
Else
{
Cur->_pnext = pos->_pnext;
Free (POS);
}
}
void Reverse (listnode*& phead)
{
listnode* cur = phead->_pnext;
Phead->_pnext = NULL;
while (cur! = NULL)
{
Pushfront (Phead, cur->_data);
listnode* tem = cur;
Cur = cur->_pnext;
Free (TEM);
}
}
listnode* Findmiddle (listnode*& phead)
{
listnode* first = Phead;
listnode* slow = phead;
while (first->_pnext! = NULL)
{
First = first->_pnext;
if (first->_pnext! = NULL)
{
First = first->_pnext->_pnext;
}
slow = slow->_pnext;
}
return slow;
}
void Eraselastnode (listnode*& pos)
{
ListNode *cur = pos->_pnext;
DataType tem = pos->_data;
Pos->_data = cur->_data;
Cur->_data = tem;
Pos->_pnext = cur->_pnext;
Free (cur);
}
Test Pushfront and Popfront
void Test1 ()
{
ListNode *phead = NULL;
Pushfront (Phead, 1);
Pushfront (Phead, 2);
Pushfront (Phead, 3);
Display (Phead);
Popfront (Phead);
Display (Phead);
}
Test Pushback Popback
void Test2 ()
{
ListNode *phead = NULL;
Pushback (Phead, 1);
Pushback (Phead, 2);
Pushback (Phead, 3);
Display (Phead);
Popback (Phead);
Display (Phead);
}
Test Insert Erase Reverse
void Test3 ()
{
ListNode *phead = NULL;
Pushback (Phead, 1);
Pushback (Phead, 2);
Pushback (Phead, 3);
ListNode *pos = Find (Phead, 2);
Display (Phead);
Insert (POS, 10);
Display (Phead);
Erase (Phead, POS);
Display (Phead);
Reverse (Phead);
Display (Phead);
}
Test Findmiddle Eraselastnode
void Test4 ()
{
ListNode *phead = NULL;
Pushback (Phead, 1);
Pushback (Phead, 2);
Pushback (Phead, 3);
Pushback (Phead, 4);
Pushback (Phead, 5);
Display (Phead);
ListNode *cur = Findmiddle (Phead);
cout << cur->_data << Endl;
ListNode *pos = Find (Phead, 2);
Eraselastnode (POS);
Display (Phead);
}
int main ()
{
Test1 ();
Test2 ();
Test3 ();
Test4 ();
System ("pause");
return 0;
}
This article is from "Narcissus" blog, please make sure to keep this source http://10704527.blog.51cto.com/10694527/1719274
Single linked list