单链表的初始化、增删查改、遍历一次找中间结点、删除一个无头单链表的非尾结点(不给头结点)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct ListNode
{
struct ListNode* _next;
DataType _data;
}ListNode;
void InitList(ListNode* &pHead)
{
pHead=NULL;
}
ListNode* CreatNode(DataType x)
{
ListNode* tmp;
tmp=(ListNode*)malloc(sizeof(ListNode));
tmp->_data=x;
tmp->_next=NULL;
return tmp;
}
void PushFront(ListNode* &pHead,DataType x)
{
ListNode* NewNode;
if(pHead==NULL)
{
pHead=CreatNode(x);
return;
}
else
{
NewNode=CreatNode(x);
NewNode->_next=pHead;
pHead=NewNode;
}
}
void PushBack(ListNode* &pHead,DataType x)
{
ListNode* tmp=CreatNode(x);
if(pHead==NULL)
{
pHead=tmp;
return;
}
else
{
ListNode* p=pHead;
while(p->_next)
{
p=p->_next;
}
p->_next=tmp;
}
}
void PopFront(ListNode* &pHead)
{
if(pHead==NULL)
{
printf("链表为空");
return;
}
else
{
pHead=pHead->_next;
}
}
void PopBack(ListNode* &pHead)
{
if(pHead==NULL)
{
printf("链表为空\n");
system("pause");
exit(0);
}
else if(pHead->_next==NULL)
{
pHead=NULL;
}
else
{
ListNode* tmp=pHead;
while(tmp->_next->_next)
{
tmp=tmp->_next;
}
tmp->_next=NULL;
}
}
ListNode* Find(ListNode* pHead,DataType x)
{
if(pHead==NULL)
{
printf("链表为空\n");
system("pause");
exit(0);
}
else
{
ListNode* tmp=pHead;
while((tmp->_data!=x)&&(tmp->_next!=NULL))
{
tmp=tmp->_next;
}
if(tmp->_data==x)
{
return tmp;
}
else
{
printf("想找的数据不存在\n");
system("pause");
exit(0);
}
}
}
void Insert(ListNode* pos,DataType x)
{
ListNode* NewNode=CreatNode(x);
NewNode->_next=pos->_next;
pos->_next=NewNode;
}
void Erase(ListNode* &pHead,ListNode* pos)
{
while(pHead->_next!=pos)
{
pHead=pHead->_next;
}
pHead->_next=pos->_next;
}
//遍历一次找中间结点
ListNode* Cheak_MidNode(ListNode* pHead)
{
ListNode* p1=pHead;
ListNode* p2=pHead;
int count=0;
while(p1->_next)
{
p1=p1->_next;
count++;
if(count%2==0)
{
p2=p2->_next;
}
}
return p2;
}
//删除一个无头单链表的非尾节点(不给头节点)
void Delete_NoHeadNode(ListNode* pos)
{
pos->_data=pos->_next->_data;
pos->_next=pos->_next->_next;
}
void Print(ListNode* pHead)
{
while(pHead)
{
printf("%d->",pHead->_data);
pHead=pHead->_next;
}
printf("NULL\n");
}
void Print_Node(ListNode* pHead,ListNode* pos)
{
while(pHead!=pos)
{
pHead=pHead->_next;
}
printf("中间结点为:%d\n",pos->_data);
}
void Test1()
{
ListNode* pHead;
InitList(pHead);
/*PushFront(pHead,1);
PushFront(pHead,2);
PushFront(pHead,3);*/
PushBack(pHead,1);
PushBack(pHead,2);
PushBack(pHead,3);
/*PopFront(pHead);
PopFront(pHead);
PopFront(pHead);
PopFront(pHead);*/
/*PopBack(pHead);
PopBack(pHead);
PopBack(pHead);
PopBack(pHead);*/
Print(pHead);
}
void Test2()
{
ListNode* pHead;
InitList(pHead);
PushBack(pHead,1);
PushBack(pHead,2);
PushBack(pHead,3);
ListNode* pos=Find(pHead,2);
//ListNode* pos=Find(pHead,5);
Insert(pos,7);
Print(pHead);
Erase(pHead,pos);
Print(pHead);
}
void Test3()
{
ListNode* pHead;
InitList(pHead);
PushBack(pHead,1);
PushBack(pHead,2);
PushBack(pHead,3);
PushBack(pHead,4);
PushBack(pHead,5);
ListNode* pos=Cheak_MidNode(pHead);
Print(pHead);
Print_Node(pHead,pos);
}
void Test4()
{
ListNode* pHead;
InitList(pHead);
PushBack(pHead,1);
PushBack(pHead,2);
PushBack(pHead,3);
PushBack(pHead,4);
Print(pHead);
ListNode* pos=Find(pHead,3);
Delete_NoHeadNode(pos);
Print(pHead);
}
int main()
{
//Test1();
//Test2();
//Test3();
Test4();
system("pause");
return 0;
}
转载于:https://blog.51cto.com/10707460/1754730