单链表是一种链式的存储结构,由若干个结点构成,每个结点包含数据域和指针域两个部分,下面对单链表实现头插,尾插,头删,尾删操作。
....SList.h
#pragam once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>
typedef int SLDataType;
typedef struct SListNode
{
SLDataType _data;
struct SListNode* _next;
}SListNode;
typedef struct SList
{
SListNode *_head;
}SList;
void SListInit (SList *plist,SLDataType x);
SListNode *Buynode (x);
void SListpushback (Slist *plist,SLDataType x);
void SListpushfront (SList *plist,SLDataType x);
void SListpopfront (SList *plist);
void SListpopback (SList *plist);
void SListPrint (SList *plist);
void SListDestory (SList *plist);
....list.c
#include "SList.h"
SList plist;
void SListInit (SList *plist,SLDataType x)//单链表的初始化
{
assert (plist);
plist->_head =NULL;
}
void SListPrint (SList *plist)//单链表的打印
{
assert (plist);
SListNode *cur = plist->_head;
while (cur != NULL)
{
printf ("%d->",cur->_data);
cur=cur->_next;
}
printf ("NULL\n");
}
void SListDestory (SList *plist)//单链表的销毁
{
assert (plist);
SListNode *cur = plist->_head;
SListNOde *dst=NULL;
while (cur!=NULL)
{
dst=cur->_next;
free(cur);
cur=dst;
}
plist->_head=NULL;
}
SListNode *Buynode (x)//设置一个产生新结点的函数
{
SListnode *pnode = (SListNode *)malloc (sizeof (SListNode));//该结点为指针类型
pnode->_data=x;
pnode->_next=NULL;
return pnode;
}
void SListpushback (Slist *plist,SLDataType x)//单链表的尾插
{//分为有结点和无结点两种情况
assert (plist);
SListNode *newnode = Buynode (x);
//无结点
SListNode *tail =plist->_head;
if (tail==NULL)
{
plist->_head=newnode;
}
else//有结点
{
while (tail->_next!=NULL)
{
tail=tail->_next;
}
tail->_next=newnode;
newnode->_next = NULL;
}
}
void SListpushfront (SList *plist,SLDataType x)//单链表的头插
{
assert (plist);
SListNode *newnode =Buynode (x);
SListNode *cur =plist->_head;
newnode->_next=cur;
plist->_head=newnode;
}
void SListpopfront (SList *plist)//单链表的头删
{
assert (plist);
SListNode *cur = plist->_head;
SlistNode *dst=NULL;
dst=cur->_next;
free (cur);
cur=dst;
plist->_head=cur;
}
void SListpopback (SList *plist)//单链表的尾删
{
assert (plist);
SListNode *tail =plist->_head;
if (tail->_next==NULL)
{
free (tail);
plist->_head = NULL;
}
while (tail->_next->_next!=NULL)
{
tail=tail->_next;
}
free (tail->_next);
tail->_next=NULL;
}
void test ( )
{
void SListInit (plist,8);
void SListpushback (plist,1);
void SListpushback (plist,2);
void SListpushback (plist,3);
void SListpushback (plist,4);
void SListpushback (plist,5);
void SListpushfront (plist,6);
void SListpopfront (plist);
void SListpopback (plist);
void SListPrint (plist);
void SListDestory (plist);
....test.c
#include "SList.h"
int main ( )
{
test ( );
systrm ("pause");
return 0;
}
上述运行结果为: