先頭ノードでない単一チェーンテーブルの基本操作


ノードの定義
typedef struct LNode{
	int data;			//            
	struct LNode *next; //         
}LNode,*LinkList;   //LinkList   LNode *,      ,      

初期化
//          
bool InitList(LinkList &L){
	L = NULL;  //  
	return true;
}

に判決を下す
//         
bool Empty(LinkList L){
	return (L==NULL);
}

テーブルの長さを求める
//     
int length(LinkList L){
	int len = 0;
	LNode *p = L;
	while(p != NULL){
		p = p->next;
		len++;
	}
	return len;
}

ビット順に挿入
//     (     )
bool ListInsert(LinkList &L,int i,int e){
	if(i<1)
		return false;
	if(i==1){		//                 
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = e;
		s->next = L;
		L=s;		//        
		return true;
	}
	LNode *p;
	int j=1;
	p = L;
	while(p!=NULL && j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

ビット順に削除
//     (     )
bool ListDelete(LinkList &L,int i,int &e){
	if(i<1)
		return false;
	if(i==1){
		LNode *r;
		r=L;
		e=r->data;
		L=r->next;
		free(r);
		return true;
	}
	LNode *p;
	int j=1;
	p=L;
	while (p!=NULL && j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL)
		return false;
	if(p->next==NULL)	// i-1         
		return false;
	LNode *q=p->next;
	e = q->data;
	p->next=q->next;
	free(q);
	return true;
}

ノードの挿入を指定
//        
bool InsertNextNode(LNode *p,int e){
	if(p==NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if (s==NULL)	//      
		return false;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

ノードプリプラグの指定
//        
bool InsertPriorNode(LNode *p,int e){
	if(p==NULL)
		return false;
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s==NULL)
		return false;
	s->next = p->next;
	p->next = s;		//   s  p  
	s->data = p->data;  // p      s 
	p->data = e;		// p      e
	return true;
}