ユニバーサルチェーンテーブル

1985 ワード

著者らは,c/c++を用いて汎用チェーンテーブルを構築する方法を紹介した.c言語で作成した各チェーンテーブル操作関数は、特定のチェーンテーブルタイプに対して作成されます.新しいチェーンテーブルタイプが現れるたびに、これらの操作の論理は似ていますが、チェーンテーブル操作関数を実装します.c++で汎用プログラミングを使用すると、すべてのタイプのチェーンテーブル操作関数、すなわちテンプレート関数を記述できます.一方、汎用チェーンテーブルはチェーンテーブルテンプレートよりも牛が追い詰められており、汎用チェーンテーブルではチェーンテーブルノード間のタイプが異なる場合があります.実は汎用チェーンテーブルというものはとっくにあり、linuxのカーネル実装では汎用チェーンテーブルが構築されています.ネットで勝手に検索するとソースコードが見つかりますが、いろいろなマクロを見るのはちょっと煩わしいです.私が上述した文章の中でもう一つの実現構想を提供して、比較的に簡単です.詳しく知りたいなら原文を見てください.私は小さなプログラムを書いてテストしました.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct ListStruct{
	struct ListStruct *next;
};
typedef struct ListStruct List,*pList;

struct Node{
	char *City;
	int Temp;
};
typedef struct Node node,* pNode;

pList Head;


/* function declarations for pListed lists*/

void CreateList(void);
void FreeNode(pList);
void ShowNode(void);
#include "list.h"

#define GETPNODE(p) ((pNode)(p+1))
#define GETCOUNT (*(int *)(Head+1))

void AddToList(void *data,int datasize)
{
	pList pn=(pList)malloc(datasize+sizeof(List));
	void* p=(void*)(pn+1);
	memcpy(p,data,datasize);
	pn->next=Head->next;
	Head->next=pn;
	GETCOUNT++;
}

void CreateList(void)
{
	Head=(pList)malloc(sizeof(List)+sizeof(int));
	Head->next=NULL;
	GETCOUNT=0;
}

void FreeNode(pList n)
{
	free(GETPNODE(n)->City);
	free(n);
}

void ShowNodes(void)
{
	pList pn;
	if(GETCOUNT)
	{
		printf("there are %d nodes
",GETCOUNT); for(pn=Head->next;pn;pn=pn->next) { printf("%-20s:%3d",GETPNODE(pn)->City,GETPNODE(pn)->Temp); printf("
"); } } else printf("Empty List
"); } int main(int argc,char*argv[]) { node n; int size = sizeof(node); char buffer[50]; CreateList(); do{ scanf("%s",buffer); scanf("%d",&n.Temp); n.City=strdup(buffer); AddToList(&n,size); }while(n.Temp!=0); ShowNodes(); scanf("%s",buffer); }