c語言實現單鏈表的所有介面
阿新 • • 發佈:2018-12-01
此次工程還是使用了3個原始檔slist.h(標頭檔案原始碼),slist.c(實現介面的具體程式碼),test.c(單鏈表邏輯)
slist.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SLTDataType;
typedef struct ListNode
{
SLTDataType _data;
struct ListNode* _next;
}ListNode;
typedef struct SList
{
ListNode* _head;
}SList;
void SListInit(SList* plist);
void SListDestory(SList* plist);
void SListPrint(SList* plist);
void SListPushFront(SList* plist, SLTDataType x);
ListNode* BuySListNode(SLTDataType x);
void SListPopFront(SList* plist);
void SListPushBack(SList* plist, SLTDataType x);
void SListpopBack (SList* plist);
ListNode* FindNode(SList* plist,SLTDataType x);
void SListInsertAfter(ListNode* pos, SLTDataType x);
void SListInsertFront(SList* plist,ListNode* pos, SLTDataType x);
void SListEraseAfter(SList* plist,ListNode* pos);
void SListRemove(SList* plist, SLTDataType x);
slist.c
#include "slist.h"
void SListInit(SList* plist)
{
assert(plist);
plist -> _head = NULL;
}
void SListDestory(SList* plist)
{
ListNode* cur = plist -> _head;
assert(plist);
while(cur != NULL)
{
ListNode* next = cur -> _next;
free(cur);
cur = next;
}
plist -> _head = NULL;
}
void SListPrint(SList* plist)
{
ListNode* cur = plist ->_head ;
assert(plist);
while(cur != NULL)
{
printf("%d->",cur ->_data);
cur = cur -> _next;
}
}
void SListPushFront(SList* plist, SLTDataType x)
{
ListNode* newnode = BuySListNode(x);
assert(plist);
newnode ->_next = plist ->_head ;
plist ->_head = newnode;
}
ListNode* BuySListNode(SLTDataType x)
{
ListNode* pnode = (ListNode*)malloc(sizeof(ListNode));
pnode ->_data = x;
pnode ->_next = NULL;
return pnode;
}
void SListPopFront(SList* plist)
{
ListNode* next = plist ->_head ->_next ;
free(plist ->_head );
plist ->_head = next;
}
void SListPushBack(SList* plist, SLTDataType x)
{
ListNode* tail = plist ->_head;
ListNode* newnode = BuySListNode(x);
while(tail ->_next != NULL)
{
tail = tail ->_next;
}
tail ->_next = newnode;
}
void SListpopBack(SList* plist)
{
ListNode* cur = plist ->_head;
if(plist ->_head ->_next == NULL)
{
free(plist ->_head );
plist ->_head = NULL;
}
while(cur ->_next ->_next != NULL)
{
cur = cur ->_next ;
}
free(cur ->_next);
cur ->_next = NULL;
}
ListNode* FindNode(SList* plist,SLTDataType x)
{
ListNode* cur = plist ->_head;
while(cur != NULL)
{
if(cur ->_data == x)
{
return cur;
}
cur = cur ->_next ;
}
return cur;
}
void SListInsertAfter(ListNode* pos, SLTDataType x)
{
ListNode* newnode = BuySListNode(x);
newnode ->_next = pos ->_next ;
pos ->_next = newnode;
}
void SListInsertFront(SList* plist,ListNode* pos, SLTDataType x)
{
ListNode* newnode = BuySListNode(x);
ListNode* cur = plist ->_head ;
assert(plist);
if(pos == plist ->_head )
{
SListPushFront(plist,x);
return;
}
while(cur ->_next != pos )
{
cur = cur ->_next ;
}
newnode ->_next = cur ->_next ;
cur ->_next = newnode;
}
void SListEraseAfter(SList* plist,ListNode* pos)
{
ListNode* cur = plist ->_head ;
if(pos == plist ->_head )
{
SListPopFront(plist);
return;
}
while(cur ->_next != pos)
{
cur = cur ->_next ;
}
cur ->_next = pos ->_next ;
free(pos);
pos ->_next = NULL;
}
void SListRemove(SList* plist, SLTDataType x)
{
ListNode* cur = NULL;
ListNode* del = NULL;
ListNode* front = NULL;
assert(plist);
if (plist->_head == NULL)
{
printf("此連結串列為空連結串列\n");
return;
}
cur = plist ->_head;
front = cur;
while (cur != NULL)
{
if (cur->_data == x)
{
if (cur == plist ->_head ) //考慮第一個節點的情況
{
del = cur;
front = cur->_next; //記得要移動front
plist ->_head = cur->_next;
free(del);
}
else //刪除非第一個節點
{
del = cur;
front->_next = cur->_next;
free(del);
}
cur = front; //讓cur移動到當前的front進行操作
}
else
{
front = cur;
cur = cur->_next ;
}
}
}
test.c
#include"slist.h"
int main()
{
SList list;
ListNode* pos = NULL;
SListInit(&list);
SListDestory(&list);
SListPushFront(&list,1);
SListPushFront(&list,1);
SListPushFront(&list,1);
SListPushFront(&list,2);
SListPushFront(&list,3);
SListPopFront(&list);
SListPushBack(&list,4);
SListpopBack(&list);
pos = FindNode(&list,2);
SListInsertAfter(pos , 4);
SListInsertFront(&list, pos , 6);
SListEraseAfter(&list,pos);
SListRemove(&list,1);
SListPrint(&list);
return 0;
}