记录自己所学,无详细讲解
无头单链表实现
1.项目目录文件
2.头文件 Slist.h
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
struct Slist
{
int data;
struct Slist* next;
};
typedef struct Slist Slist;
//初始化
void SlistInit(Slist** phead);
//新建一个节点
Slist* Buynode(int n);
//尾插
void SlistPushback(Slist** phead, int n);
//头插
void SlistPushfront(Slist** phead, int n);
//尾删
void SlistPopback(Slist** phead);
//头删
void SlistPopfront(Slist** phead);
//查询是否存在
Slist* IsFind(Slist** phead, int n);
// 修改某个节点
void SlistModify(Slist* pos, int n);
// 删除某个节点
void SlistDel(Slist**phead, Slist* pos);
//某个节点前插入
void SlistInsertfront(Slist** phead, Slist* pos, int n);
//某个节点后插入
void SlistInsertback(Slist** phead, Slist* pos, int n);
//销毁单链表
void SlistDestory(Slist** phead);
//打印
void SlistPrint(Slist** phead);
3.函数定义源文件 Slist.c
#include "Slist.h"
void SlistInit(Slist** phead)
{
*phead = NULL;
//(*phead)->next = NULL;
}
Slist* Buynode(int n)
{
Slist* newnode = (Slist*)malloc(sizeof(Slist));
assert(newnode);
newnode->next = NULL;
newnode->data = n;
return newnode;
}
void SlistPushback(Slist** phead, int n)
{
Slist* newnode = Buynode(n);
if (*phead == NULL)
{
*phead = Buynode(n);
printf("%d尾插成功\n", (*phead)->data);
}
else
{
Slist* cur = *phead;
while (cur->next!=NULL)
{
cur = cur->next;
}
cur->next = newnode;
printf("%d尾插成功\n", (newnode)->data);
}
}
void SlistPushfront(Slist** phead, int n)
{
Slist* newnode = Buynode(n);
if (*phead == NULL)
{
*phead = newnode;
printf("%d头插成功\n", (*phead)->data);
}
else
{
newnode->next = *phead;
*phead = newnode;
printf("%d头插成功\n", (*phead)->data);
}
}
void SlistPopback(Slist** phead)
{
assert(*phead);
Slist* cur = *phead;
if ((*phead)->next == NULL)
{
printf("%d尾删成功\n",(*phead)->data);
free(*phead);
*phead = NULL;
}
else
{
while ((cur->next)->next != NULL)
{
cur = cur->next;
}
printf("%d尾删成功\n", (cur->next)->data);
free(cur->next);
cur->next = NULL;
}
}
void SlistPopfront(Slist** phead)
{
assert(*phead);
printf("%d头删成功\n", (*phead)->data);
Slist* cur = *phead;
*phead = (*phead)->next;
free(cur);
cur = NULL;
}
Slist* IsFind(Slist** phead,int n)
{
assert(*phead);
Slist* cur = *phead;
while (cur != NULL)
{
if (cur->data == n)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void SlistModify(Slist* pos, int n)
{
if (pos == NULL)
{
printf("修改失败,未找到节点\n");
}
else
{
pos->data = n;
printf("修改成功\n");
}
}
void SlistDel(Slist** phead,Slist* pos)
{
assert(*phead);
if (pos == NULL)
{
printf("删除失败,未找到节点\n");
}
else if (*phead == pos)
{
Slist* cur = *phead;
*phead = (*phead)->next;
free(cur);
cur = NULL;
printf("删除节点成功\n");
}
else
{
Slist* cur = *phead;
while (cur->next!= pos)
{
cur = cur->next;
}
cur->next = pos->next;
free(pos);
pos = NULL;
printf("删除节点成功\n");
}
}
void SlistInsertfront(Slist** phead, Slist* pos, int n)
{
assert(*phead);
Slist* newnode = Buynode(n);
Slist* cur = *phead;
if (pos == NULL)
{
printf("插入失败,未找到节点\n");
}
else if (cur->next == NULL)
{
newnode->next = cur;
*phead = newnode;
printf("插入成功\n");
}
else if (cur == pos)
{
*phead = newnode;
newnode->next = cur;
printf("插入成功\n");
}
else
{
while (cur->next != pos)
{
cur = cur->next;
}
cur->next = newnode;
newnode->next = pos;
printf("插入成功\n");
}
}
void SlistInsertback(Slist** phead, Slist* pos,int n)
{
assert(*phead);
Slist* newnode = Buynode(n);
Slist* cur = *phead;
if (pos == NULL)
{
printf("插入失败,未找到节点\n");
}
else
{
while (cur != pos)
{
cur = cur->next;
}
Slist* ccur = cur->next;
cur->next = newnode;
newnode->next = ccur;
printf("插入成功\n");
}
}
void SlistDestory(Slist** phead)
{
Slist* cur = *phead;
Slist* ccur = cur;
while (cur != NULL)
{
ccur = cur;
cur = cur->next;
free(ccur);
ccur = NULL;
}
*phead = NULL;
}
void SlistPrint(Slist** phead)
{
assert(*phead);
Slist* cur = *phead;
while (cur != NULL)
{
printf("%3d", cur->data);
cur = cur->next;
}
}
4.函数调用测试源文件test.c
#include "Slist.h"
int main()
{
Slist * list;
SlistInit(&list);
SlistPushback(&list, 5);
SlistPushback(&list, 4);
SlistPushback(&list, 3);
SlistPushback(&list, 2);
SlistPushback(&list, 1);
SlistPushfront(&list,6);
SlistPushfront(&list,7);
//SlistPopback(&list);
//SlistPopback(&list);
//SlistPopfront(&list);
//SlistDel(&list,IsFind(&list, 1));
//SlistModify(IsFind(&list, 10), 9);
SlistInsertfront(&list, IsFind(&list, 7), 8);
SlistInsertback(&list, IsFind(&list, 8), 10);
//SlistPrint(&list);
SlistDestory(&list);
SlistPrint(&list);
}