"Slist.h"
#pragma once
#define __Slist_H__
#ifdef __Slist_H__
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}Node, *PLinkList;
void InitSlist(PLinkList* ppList);
void PrintList(PLinkList pList);
void PushBack(PLinkList* ppList, DataType x);
void PushFront(PLinkList* ppList, DataType x);
int GetLength(PLinkList pList);
void PopFront(PLinkList* ppList);
void PopBack(PLinkList* ppList);
Node* Find(PLinkList pList, DataType x);
void Insert(PLinkList* ppList, Node* n, DataType x);
int Remove(PLinkList* ppList, Node* n);
#endif//用來結束__Slist_H__
"Slist.c"
#include "Slist.h"
//創建一個節點
PLinkList _CreateNode(DataType x)
{
PLinkList tmp = (PLinkList*)malloc(sizeof(Node));
tmp->data = x;
tmp->next = NULL;
return tmp;
}
void InitSlist(PLinkList* ppList)
{
assert(ppList);
*ppList = 0;
}
void PrintList(PLinkList pList)
{
PLinkList begin =pList;
while (begin != NULL)
{
printf("%d->", begin->data);
begin = begin->next;
}
printf("NULL\n");
}
void PushBack(PLinkList* ppList, DataType x)
{
assert(ppList);
PLinkList Head= *ppList;
// 1.空鏈表
// 2.一個及以上節點
if (*ppList == NULL)
{
*ppList = _CreateNode(x);
}
else
{
while (Head->next != NULL)
{
Head = Head->next;
}
PLinkList tmp = _CreateNode(x);
Head->next = tmp;
}
}
void PushFront(PLinkList* ppList, DataType x)
{
assert(ppList);
// 1.沒有節點
// 2.有多個節點
if (*ppList == NULL)
{
*ppList = _CreateNode(x);
}
else
{
PLinkList tmp = _CreateNode(x);
tmp->next = *ppList;
*ppList = tmp;
}
}
int GetLength(PLinkList pList)
{
int count = 0;
PLinkList begin = pList;
while (begin != NULL)
{
count++;
begin = begin->next;
}
printf("count is %d\n",count);
return count;
}
void PopFront(PLinkList* ppList)
{
assert(ppList);
if (*ppList == NULL)
{
printf("List Is Empty\n");
return;
}
PLinkList tmp = *ppList;
*ppList=(*ppList)->next;
free(tmp);
}
void PopBack(PLinkList* ppList)
{
assert(ppList);
PLinkList Last = *ppList;
if (*ppList == NULL)
{
printf("List Is Empty\n");
return;
}
else
{
// 1.一個節點情況
// 2.一個及以上節點的情況。
if (Last->next == NULL)
{
free(Last);
*ppList = NULL;
}
else
{
PLinkList begin = *ppList;
while (begin->next->next != NULL)
{
begin = begin->next;
}
free(begin->next);
begin->next = NULL;
}
}
}
Node* Find(PLinkList pList, DataType x)
{
PLinkList target = pList;
while (target != NULL)
{
if (target->data == x)
{
return target;
}
target = target->next;
}
printf("no this value\n");
return NULL;
}
void Insert(PLinkList* ppList, Node* n, DataType x)
{
PLinkList tmp;
if (*ppList == NULL)
{
*ppList == _CreateNode(x);
return;
}
tmp = _CreateNode(x);
tmp->next = n->next;
n->next = tmp;
}
int Remove(PLinkList* ppList, Node* n)
{
assert(ppList);
PLinkList begin = *ppList;
PLinkList prev = 0;
if (begin->next ==NULL&&(*ppList) == n)//只有一個節點且此節點恰好是要刪除的節點
{
free(*ppList);
*ppList = NULL;
return 0;
}
else if ((*ppList) == n)//至少兩個節點且第一個就是要找的節點
{
PLinkList tmp = *ppList;
*ppList = (*ppList)->next;
free(tmp);
return 0;
}
//多個節點
while (begin != NULL && begin != n)
{
prev = begin;
begin = begin->next;
}
if (begin != NULL)
{
prev->next = n->next;
free(n);
return 0;
}
return -1;
}
"main.c"
#include "Slist.h"
void Test1()
{
PLinkList pList;
InitSlist(&pList);
PushBack(&pList, 1);
PushBack(&pList, 2);
PushBack(&pList, 3);
PrintList(pList);
GetLength(pList);
PopBack(&pList);
PrintList(pList);
}
void Test2()
{
PLinkList pList;
InitSlist(&pList);
PushFront(&pList, 1);
PushFront(&pList, 2);
PushFront(&pList, 3);
PrintList(pList);
GetLength(pList);
PopFront(&pList);
PrintList(pList);
}
void Test3()
{
PLinkList pList;
InitSlist(&pList);
PushFront(&pList, 1);
PushFront(&pList, 2);
PushFront(&pList, 3);
PrintList(pList);
PLinkList ret = Find(pList,2);
if (ret != NULL)
{
Insert(&pList, ret, 8);//ret已經接收了想找的位置,所以在
//傳參時把想要插入的位置參數改爲ret
}
PrintList(pList);
}
void Test4()
{
PLinkList pList;
InitSlist(&pList);
PushFront(&pList, 1);
PushFront(&pList, 2);
PushFront(&pList, 3);
PLinkList ret = Find(pList, 2);
Remove(&pList, ret);
PrintList(pList);
}
void Test5()
{
PLinkList pList;
InitSlist(&pList);
PushBack(&pList, 1);
PushBack(&pList, 2);
PushBack(&pList, 2);
PushBack(&pList, 3);
EraseAll(&pList,2,1);
PrintList(pList);
}
void main()
{
//Test1();
//printf("\n");
//Test2();
//printf("\n");
//Test3();
//printf("\n");
//Test4();
//printf("\n");
Test5();
getchar();
}