線形テーブルチェーンストレージ構造のc言語実装


線形表鎖式ストレージ構造のc言語実現の操作
<1>チェーンストレージ構造のノードを定義します.
<2>線形テーブルの初期化
<3>空か否かの判定
<4>リストをクリア
<5>戻りLのデータ要素数
<6>Lのi番目のデータ要素の値をeで返す
<7>Lのうち1番目にeとの関係を満たすデータ要素のビットシーケンスを返し、なければ0を返す
<8>Lのi番目の位置より前に新しいデータ要素eを挿入し、Lの長さに1を加える
<9>Lのi番目のデータ要素を削除し、eでその値を返し、Lの長さを1引く
<10>Lの各データ要素を順次出力
<11>n個の要素の値をランダムに生成し、表ヘッダノード付き単鎖線形テーブルLを確立する(ヘッダ挿入法)
<12>ランダムにn個の要素の値を生成し、表頭接点付き単鎖線形表L(尾挿法)を確立する
 
<1>チェーンストレージ構造のノードを定義します.
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList; 

 
<2>線形テーブルの初期化
Status InitList(LinkList *L) 
{ 
    *L=(LinkList)malloc(sizeof(Node)); /*      ,  L       */
    if(!(*L)) /*        */
            return ERROR;
    (*L)->next=NULL; /*       */

    return OK;
}

 
<3>空か否かの判定
Status ListEmpty(LinkList L)
{ 
    if(L->next)
            return FALSE;
    else
            return TRUE;
}

 
<4>リストをクリア
Status ClearList(LinkList *L)
{ 
	LinkList p,q;
	p=(*L)->next;           /*  p        */
	while(p)                /*       */
	{
		q=p->next;
		free(p);
		p=q;
	}
	(*L)->next=NULL;        /*          */
	return OK;
}

 
<5>戻りLのデータ要素数
int ListLength(LinkList L)
{
    int i=0;
    LinkList p=L->next; /* p        */
    while(p)                        
    {
        i++;
        p=p->next;
    }
    return i;
}

 
<6>Lのi番目のデータ要素の値をeで返す
Status GetElem(LinkList L,int i,ElemType *e)
{
	int j;
	LinkList p;		/*      p */
	p = L->next;		/*  p    L       */
	j = 1;		/*  j     */
	while (p && jnext;  /*  p        */
		++j;
	}
	if ( !p || j>i ) 
		return ERROR;  /*   i       */
	*e = p->data;   /*    i       */
	return OK;
}

 
<7>Lのうち1番目にeとの関係を満たすデータ要素のビットシーケンスを返し、なければ0を返す
int LocateElem(LinkList L,ElemType e)
{
    int i=0;
    LinkList p=L->next;
    while(p)
    {
        i++;
        if(p->data==e) /*           */
                return i;
        p=p->next;
    }

    return 0;
}

 
<8>Lのi番目の位置より前に新しいデータ要素eを挿入し、Lの長さに1を加える
Status ListInsert(LinkList *L,int i,ElemType e)
{ 
	int j;
	LinkList p,s;
	p = *L;   
	j = 1;
	while (p && j < i)     /*    i    */
	{
		p = p->next;
		++j;
	} 
	if (!p || j > i) 
		return ERROR;   /*  i       */
	s = (LinkList)malloc(sizeof(Node));  /*       (C      ) */
	s->data = e;  
	s->next = p->next;      /*  p        s     */
	p->next = s;          /*  s   p    */
	return OK;
}

 
<9>Lのi番目のデータ要素を削除し、eでその値を返し、Lの長さを1引く
Status ListDelete(LinkList *L,int i,ElemType *e) 
{ 
	int j;
	LinkList p,q;
	p = *L;
	j = 1;
	while (p->next && j < i)	/*      i    */
	{
        p = p->next;
        ++j;
	}
	if (!(p->next) || j > i) 
	    return ERROR;           /*  i       */
	q = p->next;
	p->next = q->next;			/*  q      p    */
	*e = q->data;               /*  q       e */
	free(q);                    /*         ,     */
	return OK;
}

 
<10>Lの各データ要素を順次出力
Status ListTraverse(LinkList L)
{
    LinkList p=L->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    printf("
"); return OK; }

 
Status visit(ElemType c)
{
    printf("%d ",c);
    return OK;
}

 
<11>n個の要素の値をランダムに生成し、表ヘッダノード付き単鎖線形テーブルLを確立する(ヘッダ挿入法)
void CreateListHead(LinkList *L, int n) 
{
	LinkList p;
	int i;
	srand(time(0));                         /*          */
	*L = (LinkList)malloc(sizeof(Node));
	(*L)->next = NULL;                      /*                */
	for (i=0; idata = rand()%100+1;             /*      100      */
		p->next = (*L)->next;    
		(*L)->next = p;						/*        */
	}
}

 
<12>ランダムにn個の要素の値を生成し、表頭接点付き単鎖線形表L(尾挿法)を確立する
void CreateListTail(LinkList *L, int n) 
{
	LinkList p,r;
	int i;
	srand(time(0));                      /*          */
	*L = (LinkList)malloc(sizeof(Node)); /* L       */
	r=*L;                                /* r         */
	for (i=0; idata = rand()%100+1;           /*      100      */
		r->next=p;                        /*                 */
		r = p;                            /*                  */
	}
	r->next = NULL;                       /*          */
}

 
 
参照<>