实现的功能:
1、打印
2、创建
3、释放
4、头插、头删
5、尾插、尾删
6、插入、删除
7、查找
8、修改
Linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;
typedef struct SListNode
{
struct SListNode* _next;
DataType _data;
}SListNode;
SListNode* BuySListNode(DataType x); //创建新节点
void SListPrint(SListNode** pHead); //打印链表
void SListDestory(SListNode** ppHead); //销毁链表
void SListPushFront(SListNode** ppHead, DataType x); //头插
void SListPushBack(SListNode** ppHead, DataType x); //尾插
void SListPopBack(SListNode** ppHead); //尾删
void SListPopFront(SListNode** ppHead); //头删
SListNode* SListFind(SListNode*pHead, DataType x); //查找
void SListInsest(SListNode** ppHead, SListNode* pos, DataType x); //插入
void SListChange(SListNode**pphead,SListNode *pos,DataType x); //链表的修改
void SListErase(SListNode** ppHead, SListNode* pos); //清空链表
#endif //
Linklist.c(实现)
#include"LinkList.h"
void SListPrint(SListNode** pHead)
{
SListNode *cur=*pHead;
assert(pHead);
while(cur)
{
printf("%d ",cur->_data);
cur=cur->_next;
}
printf("\n");
}
SListNode* BuySListNode(DataType x)
{
SListNode*node=(SListNode*)malloc(sizeof(SListNode));//为头结点开辟空间
node->_data=x;//数据域赋值
node->_next=NULL;//指针域为空
return node;//创建好头结点并返回
}
void SListPushBack(SListNode* *ppHead, DataType x)
{
if(*ppHead==NULL)
{
*ppHead=BuySListNode(x);
}
else
{
SListNode* tail=*ppHead;
while (tail->_next)
{
tail=tail->_next;
}
tail->_next=BuySListNode(x);
}
}
void SListPopBack(SListNode** ppHead)
{
assert(ppHead);
if(*ppHead==NULL)
{
printf("此链表为空\n");
return;
}
else if((*ppHead)->_next==NULL)
{
free(*ppHead);
*ppHead=NULL;
}
else
{
SListNode *prev=NULL;
SListNode *tail=*ppHead;
while(tail->_next)
{
prev=tail;
tail=tail->_next;
}
prev->_next=NULL;
free(tail);
}
}
void SListPushFront(SListNode** ppHead, DataType x)
{
assert(ppHead);
if(*ppHead==NULL)
{
*ppHead=BuySListNode(x);
}
else
{
SListNode*newNode=BuySListNode(x);
newNode->_next=*ppHead;
*ppHead=newNode;
}
}
void SListPopFront(SListNode** ppHead)
{
assert(ppHead);
if(*ppHead==NULL)
{
printf("此链表为空\n");
return;
}
else if((*ppHead)->_next==NULL)
{
free(*ppHead);
*ppHead=NULL;
}
else
{
SListNode*next= (*ppHead)->_next;
free(*ppHead);
*ppHead=next;
}
}
void SListInsest(SListNode** ppHead, SListNode* pos, DataType x)
{
SListNode* newNode = BuySListNode(x);
SListNode* prev=*ppHead;
assert(ppHead&&pos);
if(pos==*ppHead||*ppHead==NULL)
{
newNode->_next=*ppHead;
*ppHead=newNode;
}
else
{
while (prev->_next != pos)
{
prev = prev->_next;
}
// prev newNode pos
newNode->_next = pos;
prev->_next = newNode;
}
}
void SListDestory(SListNode** ppHead)//销毁链表
{
SListNode* tem=NULL;
assert(ppHead);
if(*ppHead==NULL)
{
return;
}
else
{
while (*ppHead != NULL)
{
tem = (*ppHead)->_next;
free(*ppHead);
*ppHead = NULL;
}
}
}
SListNode* SListFind(SListNode *pHead, DataType x)
{
SListNode* cur = pHead;
while (cur)
{
if (x==cur->_data )
{
return cur;
}
cur = cur->_next;
}
return NULL;
}
void SListErase(SListNode** ppHead, SListNode* pos)
{
SListNode*prev=*ppHead;
assert(ppHead);
if(*ppHead==NULL)
{
printf("空链表\n");
return;
}
else if(pos==prev)
{
prev=prev->_next;
free(prev);
prev=NULL;
}
else
{
while(prev->_next!=pos)
{
prev=prev->_next;
}
prev->_next=pos->_next;
free(pos);
}
}
void SListChange(SListNode**pphead,SListNode *pos,DataType x)
{
SListNode* cur=* pphead;
assert(pphead&&pos);
while(cur)
{
if(cur==pos)
{
cur->_data=x;
return;
}
else
cur=cur->_next;
}
}
test.c(测试)
#include"LinkList.h"
void test1()//尾插尾删
{
SListNode*list=NULL;
SListPushBack(&list,1);
SListPushBack(&list,2);
SListPushBack(&list,3);
SListPushBack(&list,4);
SListPrint(&list);
printf("\n");
SListPopBack(&list);
SListPopBack(&list);
SListPopBack(&list);
SListPopBack(&list);
SListPopBack(&list);
SListPrint(&list);
}
void test2()//头插尾删
{
SListNode*list=NULL;
SListPushFront(&list,1);
SListPushFront(&list,2);
SListPushFront(&list,3);
SListPushFront(&list,4);
SListPrint(&list);
printf("\n");
SListPopFront(&list);
SListPopFront(&list);
SListPrint(&list);
}
void test3()//插入
{
SListNode* pos = NULL;
SListNode* list = NULL;
SListPushBack(&list, 1);
SListPushBack(&list, 2);
SListPushBack(&list, 3);
SListPushBack(&list, 4);
SListPushBack(&list, 5);
SListPrint(&list);
pos = SListFind(list, 3);
SListInsest(&list, pos, 30);
SListPrint(&list);
/*SListErase(&list, pos);
SListPrint(&list);*/
SListChange(&list,pos,21);
SListPrint(&list);
SListDestory(&list);
SListPrint(&list);
}
void test4()//查找
{
SListNode* list = NULL;
SListPushFront(&list, 1);
SListPushFront(&list, 2);
SListPushFront(&list, 3);
SListPrint(&list);
printf("%p\n",SListFind(list,2));
printf("%p\n",SListFind(list,1));
printf("%p\n",SListFind(list,3));
}
int main()
{
/*test1();*/
/*test2();*/
/*test4();*/
test3();
system("pause");
return 0;
}