单链表的一些基本功能实现
1.写头文件的文档
#ifndef _COMMON_
#define _COMMON_
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#define DataType int
typedef struct SListNode
{
DataType data;//单链表的数据域
struct SListNode* next;//单链表的指针域
}SListNode;
typedef struct SList
{
SListNode *First;
SListNode *Last;
size_t size;
}SList;//链表中的头和尾指针 都要用结构体定义类型.
SListNode* _Buynode(DataType x);
void InitList(SList* plist);
bool SListpushback(SList* plist,DataType x);
void SListshowlist(SList* plist);
bool SListpushfront(SList* plist,DataType x);
bool SListPopBack(SList* plist, DataType x);
SListNode* SListFindByVal(SList* plist, DataType x);
bool SListDeleByVal(SList* plist, DataType x);
bool SListPopFront(SList* plist, DataType x);
SListNode* ReservrList(SList* plist);
int SListLength(SList* plist);
void SListClear(SList* plist);
void DestorySList(SList* plist);
void InsertByVal(SList* plist,DataType x);
#endif
2.主函数的测试
#include"common.h"
int main()
{
SList mylist;
InitList(&mylist);
DataType select = 1;
DataType input = 0;
DataType ret = 0;
while (select)
{
printf("*****************************************\n");
printf("*****1.push_back 2.push_front***********\n");
printf("*****3.show_list 0. exit ***********\n");
printf("*****5.pop_back 6.pop_front ***********\n");
printf("*****7.FindByVal 8. reserve *********\n");
printf("*****9.DeleByVal 10.Length**************\n");
printf("*****11.Clear 12.InsertByVal*********\n");
printf("*****13.Destory **************\n");
printf("*****************************************\n");
printf("请选择>");
scanf_s("%d", &select);
if (select == 0)
{
break;
}
switch (select)
{
case 1:
printf("请输入你要插入的数据>");
while (scanf_s("%d",&input),input!=-1)
{
SListpushback(&mylist,input);
}
break;
case 2:
printf("请输入你要插入的数据>");
while (scanf_s("%d", &input), input != -1)
{
SListpushfront(&mylist, input);
}
break;
case 3:
SListshowlist(&mylist);
break;
case 5:
printf("请输入你要删除的数据>");
SListPopBack(&mylist, input);
break;
case 6:
printf("请输入你要删除的数据>");
SListPopFront(&mylist, input);
break;
case 7:
printf("请输入你要查找的数字>");
SListFindByVal(&mylist, input);
break;
case 8:
ReservrList(&mylist);
break;
case 9:
printf("请输入你要删除数据>");
SListDeleByVal(&mylist,input);
break;
case 10:
ret = SListLength(&mylist);
printf("%d\n", ret);
break;
case 11:
SListClear(&mylist);
break;
case 12:
printf("请输入你要插入的数据>");
scanf_s("%d", &input);
InsertByVal(&mylist, input);
break;
case 13:
DestorySList(&mylist);
break;
default :
printf("输入不合法>");
break;
}
}
return 0;
}
3.函数的实现
#include"common.h"
SListNode* _Buynode(DataType x)
{
SListNode* S = (SListNode*)malloc(sizeof(SListNode));
assert(S != NULL);
if (S == NULL)
return NULL;
S->next = NULL;
S->data = x;
return S;
}
void InitList(SList* plist)
{
SListNode *S = _Buynode(0);
plist->First = plist->Last = S;
plist->size = 0;
}
bool SListpushback(SList* plist,DataType x)
{
SListNode* S = _Buynode(x);
if (S == NULL)
return false;
plist->Last->next = S;
plist->Last = S;
plist->size++;
return true;
}
bool SListpushfront(SList* plist,DataType x)
{
assert(plist != NULL);
SListNode* p = _Buynode(x);
if (p == NULL)
return false;
p->next = plist->First->next;
plist->First->next = p;
if (plist->size == 0)
plist->Last = p;
plist->size++;
return true;
}
void SListshowlist(SList* plist)
{
SListNode* p = plist->First->next;
while (p != NULL)
{
printf("%d-->", p->data);
p = p->next;
}
printf("over.\n");
}
bool SListPopBack(SList* plist, DataType x)
{
SListNode* p = plist->First;
assert(plist != NULL);
if (plist->size == 0)
{
return false;
}
while (p->next!=plist->Last)
{
p = p->next;
}
p->next = NULL;
free(plist->Last);
plist->Last = p;
plist->size--;
return true;
}
bool SListPopFront(SList* plist, DataType x)
{
SListNode* p = plist->First->next;
if (plist->size == 0)
return false;
plist->First->next = p->next;
free(p);
plist->size--;
if (plist->size == 0)
plist->Last = plist->First;
return true;
}
SListNode* SListFindByVal(SList* plist, DataType x)
{
SListNode* p = plist->First->next;
/*while (p != NULL && p->data != x)
p = p->next;
return p;*/
while (p != NULL)
{
if (p->data == x)
{
return p;
}
p = p->next;
}
return NULL;
}
SListNode* ReservrList(SList* plist)
{
SListNode* q;
SListNode* p;
if (plist->First->next&&plist->First->next->next)
{
p = plist->First->next;
q = p->next;
p->next = NULL;
while (q)
{
p = q;
q = q->next;
p->next = plist->First->next;
plist->First->next = p;
}
return plist->First;
}
return plist->First;
}
int SListLength(SList* plist)
{
return plist->size;
}
void SListClear(SList* plist)
{
SListNode* p = plist->First->next;
while (p != NULL)
{
plist->First->next = p->next;
free(p);
p = plist->First->next;
}
plist->First = plist->Last = NULL;
plist->size = 0;
}
void DestorySList(SList* plist)
{
SListClear(plist);
free(plist->First);
plist->First = plist->Last = NULL;//防止在内存中成为野指针
}
void InsertByVal(SList* plist, DataType x)
{
SListNode* p = plist->First;
while (p->next != NULL&&x > p->next->data)
{
p = p->next;
}
SListNode* s = _Buynode(x);
if (p->next == NULL)
{
p->next = s;
plist->Last = s;
}
else
{
s->next = p->next;
p->next = s;
}
plist->size++;
}
bool SListDeleByVal(SList* plist, DataType x)
{
SListNode* q;
SListNode* p = plist->First;
while (p != NULL && p->next->data != x)
p = p->next;
if (p == NULL)
return false;
q = p->next;
if (p->next == plist->Last)
plist->Last = p;
p->next = q->next;
free(q);
return true;
}