首なし一方向非循環チェーンの添削を実現しました.


無頭一方向の非循環チェーン表:
構造は簡単で、普通は単独でデータを保存するために使われません.
実際には、ハッシュ・テーブル、図のリードなど、他のデータ構造のサブ構造としてのものが多い.
次に、無頭一方向の非循環チェーンの添削を見てみます.
SList.h(関数宣言)
#ifndef _SLIST_H_
#define _SLIST_H_

#include
#include
#include
#include


//                 

typedef int SLTDataType;

typedef struct SListNode{
	SLTDataType data;
	struct SListNode*next;

}SListNode;

typedef struct SList{
	SListNode* head;
}SList;

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(SList* pos, SLTDataType x);
void SListEraseAfter(SList* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);


#endif/*_SLIST_H_*/
SList.c(関数実装)
#include"SList.h"
#include


SListNode* BuySListNode(SLTDataType x)//    
{
	SListNode* res = 
	res = (SListNode*)malloc(sizeof(SListNode));
	if (res == NULL)
	{
		printf("      ");
		return NULL;
	}
	res->data = x;
	res->next = NULL;
	return res;
}

void SListInit(SList* plist)
{
	plist->head=NULL;
}

void SListPushFront(SList* plist, SLTDataType x)//  
{
	SListNode* tmp = BuySListNode(x); 
	if (tmp != NULL)
	{
		tmp->next = plist->head;
		plist->head = tmp;
	}
}
void SListPopFront(SList* plist)//  
{
	if (NULL != plist->head)
	{
		SListNode* pt = plist->head;
		plist->head = pt->next;
		free(pt);
	}
}

void SListInsertAfter(SListNode* pos, SLTDataType x)
{
	SListNode* tmp = BuySListNode(x);
	tmp->next = pos->next;
	pos->next = tmp;
}
void SListEraseAfter(SListNode* pos)//  pos+1    
{
	SListNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
}

SListNode* SListFind(SList* plist, SLTDataType x)//     
{
	SListNode* tmp=plist->head;
	while (tmp!= NULL)
	{
		if (tmp->data == x)
			return tmp;
		else
			tmp = tmp->next;
	}
	return NULL;
}

void SListRemove(SList* plist, SLTDataType x)//    x   
{
	while (plist->head != NULL&&plist->head->data == x)
	{
		SListPopFront(plist);
	}
	if (plist->head == NULL)
	{
		return;
	}
	SListNode* ph = plist->head;
	SListNode* pt = ph->next;
	while (NULL != pt)
	{
		if (pt->data == x)
		{
			pt = pt->next;
			SListEraseAfter(ph);
			ph->next = pt;
			continue;
		}
		pt = pt->next;
		ph = ph->next;
	}

}
		
void SListPrint(SList* plist)
{
	SListNode* pt = plist->head;
	while (NULL != pt)
	{
		printf("%d->", pt->data);
		pt = pt->next;
	}
	printf("
"); } void SListDestory(SList* plist) { if (plist->head != NULL) { SListNode*pt = plist->head; while (pt!=NULL) { SListNode* t=pt; pt = pt->next; free(t); } plist->head = NULL; } }
mail.c(テスト関数)
#include"SList.h"

int main()
{
	SList test;

	SListInit(&test);

	SListPushFront(&test, 1);
	SListPushFront(&test, 2);
	SListPushFront(&test, 3);
	SListNode* tmp = test.head->next->next;
	SListInsertAfter(tmp, 4);
	SListInsertAfter(tmp, 4);
	SListInsertAfter(tmp, 5);
	SListInsertAfter(tmp, 6);
    //  
    SListPrint(&test);
	SListRemove(&test, 6);
	SListPrint(&test);
	//  
	SListDestory(&test);

	system("pause");
	return 0;
}