头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SlistDataType;
//结点类型定义
typedef struct SlistNode
{
SlistDataType data;//数据域
struct SlistNode* next;//指向下一个结点的指针
}SlNode;
void SlistPushBack(SlNode** head,SlNode** tail, SlistDataType x);//尾插
//void SlistPushBack(SlNode** phead, SlistDataType x);//尾插
void SlistPopBack(SlNode** phead);//尾删
void SlistPushFront(SlNode** phead,SlistDataType x);//头插
void SlistPopFront(SlNode** phead);//头删
SlNode* SlistFind(SlNode* head, SlistDataType x);//找元素
SlNode* Slistinsert(SlNode* pos, SlistDataType x);//任意位置插入
SlNode* Slistdelete(SlNode* pos);//任意位置删除
void SlistPrint(SlNode* head);//打印
函数文件
#include "Slist.h"
void SlistPushBack(SlNode** phead, SlNode** ptail, SlistDataType x)//尾插-带尾节点
{
SlNode* NewNode = (SlNode*)malloc(sizeof(SlNode));
NewNode->data = x;
NewNode->next = NULL;
if ((*phead) == NULL)
{
(*phead)= NewNode;
(*ptail) = NewNode;
}
else
{
(*ptail)->next = NewNode;
(*ptail) = NewNode;
}
}
//void SlistPushBack(SlNode** phead, SlistDataType x)//尾插
//{
// SlNode* NewNode = (SlNode*)malloc(sizeof(SlNode));
// if (NewNode == NULL)
// {
// printf("申请结点失败\n");
// exit(-1);
// }
// NewNode->data = x;
// NewNode->next = NULL;
// SlNode* tail =(*phead);
// if ((*phead)== NULL)
// {
// (*phead) = NewNode;
// }
// else
// {
// while (tail->next != NULL)
// {
// tail = tail->next;
// }
// tail->next=NewNode;
// }
//
//
//
//}
void SlistPopBack(SlNode** phead)//尾删
{
if ((*phead) == NULL)
{
printf("错误,空链表");
exit(-1);
}
else if ((*phead)->next == NULL)
{
free(*phead);
(*phead) = NULL;
}
else
{
SlNode* current = (*phead);
SlNode* pre = NULL;
while (current->next != NULL)
{
pre = current;
current = current->next;
}
free(current);
pre->next = NULL;
}
}
void SlistPushFront(SlNode** phead, SlistDataType x)//头插
{
SlNode* newNode = (SlNode*)malloc(sizeof(SlNode));
newNode->data = x;
newNode ->next= NULL;
if (*phead == NULL)
{
(*phead) = newNode;
}
else
{
newNode->next = (*phead);
(*phead) = newNode;
}
}
void SlistPopFront(SlNode** phead)//头删
{
if ((*phead) == NULL)
{
printf("错误,链表为空\n");
exit(-1);
}
if((*phead)->next==NULL)
{
(*phead) = NULL;
}
else
{
(*phead) = (*phead)->next;
}
}
SlNode* SlistFind(SlNode* head, SlistDataType x)
{
SlNode* current = head;
while (current->data != x)
{
current = current->next;
}
return current;
}
SlNode* Slistinsert(SlNode* pos, SlistDataType x)
{
SlNode* newNode = (SlNode*)malloc(sizeof(SlNode));
newNode->data = x;
newNode->next = NULL;
newNode->next = pos->next;
pos->next = newNode;
}
SlNode* Slistdelete(SlNode* pos)
{
assert(pos);
if (pos->next != NULL)
{
SlNode* current = pos->next;
pos->next = current->next;
free(current);
current = NULL;
}
}
void SlistPrint(SlNode* head)//打印
{
SlNode* current = head;//申请一个遍历指针,因为头指针不能乱跑
while (current!= NULL)
{
printf("%d->", current->data);
current = current->next;//指针后移
}
printf("NULL");
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
测试文件
#include "Slist.h"
void test()//增删测试
{
SlNode* head=NULL;
SlNode* tail = head;
SlistPushFront(&head, 1);
SlistPushFront(&head, 2);
SlistPushFront(&head, 3);
SlistPushFront(&head, 4);
SlistPushFront(&head, 5);
SlistPrint(head);
printf("\n");
//要删元素4后面的3,首先拿到元素4的地址
SlNode* find= SlistFind(head, 4);
Slistdelete(find);
SlistPrint(head);
printf("\n");
}
int main()
{
test();//增删测试
return 0;
}
如果需要获取工程文件,请关注公众号【0与1】,并在后台回复【数据结构】