チェーンヘッダ挿入法の詳細


#include <stdio.h>
#include <malloc.h>

//       
typedef struct node
{
	int data;
	struct node *next;
}Node;
//       ,            
typedef struct nodectrl
{
	Node *head;
	int num;
}NodeCtrl;
//         ,            
NodeCtrl *CreateCtrl()
{
	NodeCtrl *nc = (NodeCtrl*)malloc(sizeof(NodeCtrl));

	if(nc == NULL)
	{
		puts("Create NodeCtrl failed!");
		return NULL;
	}
	//         ,         
	nc->head = NULL;
	nc->num = 0;

	return nc;
}
//          ,        (    )
int AddData(NodeCtrl *nc,int data)
{
	Node *p,*q;

	if(nc == NULL)
		return -1;
	//     Node  ,    data  
	q = (Node*)malloc(sizeof(Node));

	if(q == NULL)
		return -1;
	//    
	q->data = data;
	q->next = NULL;
	//        ,      
	p = nc->head;
	//    (   )
	if(p != NULL)
		q->next = nc->head;

	nc->head = q;
	//         ,         1
	nc->num++;

	return 0;
}
//      ,               
void Display(NodeCtrl *nc)
{
	Node *p = NULL;

	if(nc == NULL)
		return;

	printf("Current list has %d data!
",nc->num); //num , 0, , if(nc->num > 0) { // p = nc->head; // while(p != NULL) { printf("%d
",p->data); p = p->next; } } } // , , void FreeNodeCtrl(NodeCtrl *nc) { // ,q ,p Node *p,*q; if(nc == NULL) return; // num 0, 1 , if(nc->num > 0) { // p = nc->head; // while(p != NULL) { // p q = p; //p , q p p = p->next; // p free(q); } } // , 0 nc->head = NULL; nc->num = 0; // free(nc); } int main() { int i,data; NodeCtrl *nc1 = CreateCtrl(); NodeCtrl *nc2 = CreateCtrl(); for(i=0;i<3;i++) { scanf("%d",&data); AddData(nc1,data); } for(i=0;i<20;i++) AddData(nc2,i); Display(nc1); FreeNodeCtrl(nc1); return 0; }