1. 程式人生 > >c語言實現單鏈表的所有介面

c語言實現單鏈表的所有介面

此次工程還是使用了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;
}