//main.c
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include "slist.h"
/*
for(cur=head;cur;cur=cur->next)
{
cur;
}
for(cur=head->next;cur!=head;cur=cur->next)
{
cur;
}
for(cur=head;cur;cur=cur->next)
{
cur;
}
*/
void listtest()
{
SList test;
SListInit(&test);
SListPushFront(&test, 10);
SListPushFront(&test, 1);
SListPushFront(&test, 2);
SListPushFront(&test, 3);
SListPushFront(&test, 6);
SListNode* cur = SListFind(&test, 2);
SListInsertAfter(cur, 20);
SListEraseAfter(cur);
SListPrint(&test);
}
int main()
{
listtest();
system("pause");
return 0;
}
//slist.c
#include<stdio.h>
#include<stdlib.h>
#include <assert.h>
#include "slist.h"
void SListInit(SList* plist)
{
plist->_head = NULL;
}//链表初始化,头结点赋成空;
void SListDestory(SList* plist)
{
SListNode *tmp;//链表节点
while (plist->_head)
{
tmp = plist->_head;//不断任命新头,释放旧头
plist->_head = plist->_head->_next;
free(tmp);
}
}
void SListPushFront(SList* plist, SLTDataType x)
{
//链表头压,得到指向链表头结点的指针;
SListNode *cur = (SListNode *)malloc(sizeof(SListNode));//给链表结点(结构体)开辟空间
cur->_data = x;//赋值
cur->_next = plist->_head;//将这个结点的指针指向NULL
plist->_head = cur;//将结点此时的地址复制个头指针,让它记住
//所以先进入的会后移,和进栈一样,先进后出
}
void SListPopFront(SList* plist)
{
//头删
SListNode *tmp;
if (plist->_head)
{
tmp = plist->_head;
plist->_head = plist->_head->_next;//每个链表的第一个是它的头,头可以是很多的指针
//next指向的是头结点之后的结点,将这个结点的cur赋值给头指针,即改变了头指针的指向,
free(tmp);//释放掉第一个cur
}
}
SListNode* SListFind(SList* plist, SLTDataType x)
{
SListNode* cur;//基于堆内存的操作,用的时候自己开辟,因为他们都是指针
//这个块是个结构体,初始化这个结构体之后,它有一个int型变量和一个指针,指针可以指向下一个
//块,而初始化这个块的时候定义的是指针指向,指针就是他的位置,所以它有三个是手柄,结构体
//变量指针,int,_next指针,
for (cur = plist->_head; cur; cur = cur->_next)
//链表遍历
{
if (cur->_data==x)
{
return cur;
}
}
}
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
//尾插
assert(pos);
SListNode* cur = (SListNode*)malloc(sizeof(SListNode));
cur->_data = x;
cur->_next = pos->_next;
pos->_next = cur;//一个链表结点有三个元素,分别是数据,他自己类型的指针,和他自身的指针
}
void SListEraseAfter(SListNode* pos)
{
assert(pos);
SListNode* tmp = pos->_next;
pos->_next = tmp->_next;
free(tmp);
}
void SListPrint(SList* plist)
{
assert(plist);
SListNode* cur;
for (cur=plist->_head;cur;cur=cur->_next)
{
printf("%d->", cur->_data);
}
printf("NULL\n");
}
//slist.h
#ifndef _SLIST_H
#define _SLIST_H
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType _data;
struct SListNode* _next;
}SListNode;//链表节点,这是链表当中的单个块,包含了一个要存储的变量,和一个指针,当给_data
//赋值的时候需要动态开辟个内存,因此链表使用的是堆空间
typedef struct SList
{
SListNode* _head;
}SList;//链表,用它来初始化 SList test;plist=&test;用来记录头结点;
void SListInit(SList* plist);
void SListDestory(SList* plist);
//SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
SListNode* SListFind(SList* plist, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x);
// 在pos的前面进行插入
void SListEraseAfter(SListNode* pos);
//void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
//void TestSList();
#endif _SLIST_H
单链表的初始化
单链表的头删
单链表的尾插
单链表的尾删