/*
以前知道,要用链表需要自己定义结构,自己操作。
简便和复杂的方法有stl里面的list。
以后发现驱动里面有操作双链表的函数,
又发现用户层也有操作单链表函数(xp开始)。
好像这些操作都是在链表的末尾(头部)插入/删除,能否在中间(或者指定的位置)插入呢/删除?可以参考我写的用驱动(API)操作链表的思路.
本程序修改自msdn,只使用于SLIST_ENTRY是结构的第一个成员的,若要用于别的可以调整代码。
*/
#include <windows.h>
typedef struct _PROGRAM_ITEM {
SLIST_ENTRY ItemEntry;
ULONG Signature;
} PROGRAM_ITEM, *PPROGRAM_ITEM;
int main( )
{
PSLIST_HEADER pListHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER),MEMORY_ALLOCATION_ALIGNMENT);//crt函数
InitializeSListHead(pListHead);//结构清零而已,注意这个结构的第一个成员是:Alignment。
for(ULONG Count = 1; Count <= 10; Count += 1 )
{
PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
pProgramItem = (PPROGRAM_ITEM)_aligned_malloc(sizeof(PROGRAM_ITEM),MEMORY_ALLOCATION_ALIGNMENT);
pProgramItem->Signature = Count;
PSLIST_ENTRY pFirstEntry = InterlockedPushEntrySList(pListHead, &(pProgramItem->ItemEntry)); //插入到pListHead的头部,被插入的是后面的。
}
for(ULONG Count = 10; Count >= 1; Count -= 1 )
{
PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead);//从头移除
if( NULL == pListEntry ) return -1;
PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
pProgramItem = (PPROGRAM_ITEM)pListEntry;
printf("Signature is %d\n", pProgramItem->Signature);
_aligned_free(pListEntry);//crt函数。
}
PSLIST_ENTRY pListEntry = InterlockedFlushSList(pListHead);
PSLIST_ENTRY pFirstEntry = InterlockedPopEntrySList(pListHead);
if (pFirstEntry != NULL) return -1;
_aligned_free(pListHead);
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//改进的如下:
//加入了遍历的功能,最好加上临界区以支持多线程安全的访问.
/*
made by correy
made at 0:25 2014/2/16
email:kouleguan at hotmail dot com
homepage:http://correy.webs.com
参考资料:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686962(v=vs.85).aspx
*/
#include <windows.h>
typedef struct _PROGRAM_ITEM {
SLIST_ENTRY ItemEntry;
ULONG Signature;
} PROGRAM_ITEM, *PPROGRAM_ITEM;
typedef PSLIST_ENTRY (WINAPI * pRtlFirstEntrySList) (_In_ PSLIST_HEADER ListHead);//WINAPI
int main( )
{
pRtlFirstEntrySList RtlFirstEntrySList = (pRtlFirstEntrySList)GetProcAddress(LoadLibrary(L"ntdll.dll"), "RtlFirstEntrySList");
PSLIST_HEADER pListHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER),MEMORY_ALLOCATION_ALIGNMENT);//crt函数
InitializeSListHead(pListHead);//结构清零而已,注意这个结构的第一个成员是:Alignment。
USHORT us = QueryDepthSList(pListHead);//测试,个数是0.
PSLIST_ENTRY pFirstEntry;
//插入头部.
for(ULONG Count = 1; Count <= 10; Count += 1 )
{
PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
pProgramItem = (PPROGRAM_ITEM)_aligned_malloc(sizeof(PROGRAM_ITEM),MEMORY_ALLOCATION_ALIGNMENT);
pProgramItem->Signature = Count;
pFirstEntry = InterlockedPushEntrySList(pListHead, &(pProgramItem->ItemEntry)); //插入到pListHead的头部,被插入的是后面的。
}
us = QueryDepthSList(pListHead);//测试,个数是10.
//遍历.
for (pFirstEntry = RtlFirstEntrySList(pListHead) ; pFirstEntry != 0; pFirstEntry = pFirstEntry->Next)
{
//PPROGRAM_ITEM ppi = CONTAINING_RECORD(pFirstEntry, PROGRAM_ITEM, );
PPROGRAM_ITEM ppi = (PPROGRAM_ITEM)pFirstEntry;
printf("Signature is %d\n", ppi->Signature);
}
//删除.
for(ULONG Count = 10; Count >= 1; Count -= 1 )
{
PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead);//从头移除
if( NULL == pListEntry ) return -1;
PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
pProgramItem = (PPROGRAM_ITEM)pListEntry;
printf("Signature is %d\n", pProgramItem->Signature);
_aligned_free(pListEntry);//crt函数。
}
PSLIST_ENTRY pListEntry = InterlockedFlushSList(pListHead);//Removes all items from a singly linked list.
us = QueryDepthSList(pListHead);//测试,个数是0.
pFirstEntry = InterlockedPopEntrySList(pListHead);
us = QueryDepthSList(pListHead);//测试,个数是0.
if (pFirstEntry != NULL) {
return -1;
}
_aligned_free(pListHead);
return 1;
}
没有评论:
发表评论