ユニバーサルチェーンテーブル
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);
}