//common.h
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
#include <assert.h>
#include <vld.h>
#pragma warning(disable:4996)
#endif _COMMON_H_
//slist.h
#ifndef _SLIST_H_
#define _SLIST_H_
#include "common.h"
// slist.h
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data;
struct SListNode* next;
}SListNode;
// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos);
// 单链表的销毁
void SListDestory(SListNode** plist);
///
// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x)
{
SListNode* s = (SListNode*)malloc(sizeof(SListNode));
s->data = x;
s->next = NULL;
return s;
}
// 单链表打印
void SListPrint(SListNode* plist)
{
SListNode* p = plist;
while (p != NULL)
{
printf("%d->", p->data);
p = p->next;
}
printf("over\n");
}
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x)
{
SListNode* p = BuySListNode(x);
if (*pplist == NULL)
{
*pplist = p;
}
else
{
SListNode* tail = *pplist;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = p;
}
}
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x)
{
assert(pplist);
SListNode* p = BuySListNode(x);
p->data = x;
p->next = *pplist;
*pplist = p;
}
// 单链表的尾删
void SListPopBack(SListNode** pplist)
{
assert(pplist);
SListNode* p = *pplist;
SListNode* prev = NULL;
if (p == NULL){//结点为空
return;
}
else{
while (p->next != NULL){
prev = p;
p = p->next;
}
if (prev == NULL){
*pplist = NULL;
}
else{
prev->next = NULL;
}
free(p);
}
}
// 单链表头删
void SListPopFront(SListNode** pplist)
{
assert(pplist);
SListNode* p = *pplist;
if (p == NULL){
return;
}
else{
*pplist = p->next;
free(p);
}
}
//单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x)
{
SListNode* p = plist;
while (p)
{
if (p->data == x)
return p;
p = p->next;
}
return NULL;
}
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x)
{
assert(pos);
SListNode* next = pos->next;
SListNode* p = BuySListNode(x);
pos->next = p;
p->next = next;
}
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos)
{
assert(pos);
SListNode* next = pos->next;
if (next != NULL)
{
SListNode* nextnext = next->next;
free(next);
pos->next = nextnext;
}
}
// 单链表的销毁
void SListDestory(SListNode** plist)
{
assert(plist);
while (*plist != NULL){
SListPopFront(plist);
}
}
#endif _SLIST_H_
//main.c
#include "slist.h"
int main()
{
int input = 0;
SListNode* list = NULL;
SListNode* tmp = NULL;
do{
printf("*****************************************\n");
printf(" 1.push_back 2.pop_back \n");
printf(" 3.push_front 4.pop_front \n");
printf(" 5.show 6.find_val \n");
printf(" 7.insert_pos 8.erase_pos \n");
printf(" 9.destory 0.exit \n");
printf("*****************************************\n");
int select = 0;
printf("请选择:>");
scanf("%d", &select);
switch (select){
case 0:
printf("退出!\n");
return 0;
case 1:
printf("请输入数据(以-1结束):>");
while (scanf("%d", &input) && input != -1){
SListPushBack(&list, input);
}
printf("尾插成功!\n");
break;
case 2:
SListPopBack(&list);
printf("删除成功!\n");
break;
case 3:
printf("请输入数据(以-1结束):>");
while (scanf("%d", &input) && input != -1){
SListPushFront(&list, input);
}
printf("头插成功!\n");
break;
case 4:
SListPopFront(&list);
printf("删除成功!\n");
break;
case 5:
SListPrint(list);
break;
case 6:
printf("请输入要查找的值:>");
scanf("%d", &input);
tmp = SListFind(list, input);
if (tmp){
printf("存在!\n");
}
else{
printf("不存在!\n");
}
break;
case 7:
printf("插入到哪个数之后:>");
scanf("%d", &input);
tmp = SListFind(list, input);
printf("请输入要插入的值:>");
scanf("%d", &input);
SListInsertAfter(tmp, input);
printf("插入成功!\n");
break;
case 8:
printf("请输入要删除的值的前一个数:>");
scanf("%d", &input);
tmp = SListFind(list, input);
SListEraseAfter(tmp);
printf("删除成功!\n");
break;
case 9:
SListDestory(&list);
printf("摧毁成功!\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
system("pause");
system("cls");
} while (1);
system("pause");
return 0;
}
单链表的增删查改(C语言实现)
最新推荐文章于 2023-08-02 21:23:42 发布