单链表c语言实现的形式

包括初始化,创建,查询,长度,删除,清空,销毁等操作

代码如下:

#include<stdio.h>
#include<stdlib.h>
//定义单链表的数据类型
typedef struct book
{
	char name[10];
	char code[10];
	float price;
}book; 
typedef book Book;

//定义单链表 
typedef struct LNode
{
	Book data;
	struct LNode *next;
}LNode,*LinkList;

//初始化
void InitLNode(struct LNode*L)
{
	L=(LNode*)malloc(sizeof(LNode));
	if (!L)
	{
		printf("分配空间出错,初始化失败!");
		exit(1);
	}
	L->next=NULL;
} 

//头插法,创建单链表 
LNode* creatList(void)
{
	LNode *head;
	LNode *s;
	LNode *p;
	Book c;
	head=(LNode*)malloc(sizeof(LNode));
	p=head;
	p->next=NULL;
    printf("请输入新节点的数据,当最后输入的值小于等于0时建表完成,该值不接入链表\n");
    scanf("%s%s%f",&c.name,&c.code,&c.price); 
	while (c.price>0)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->next=p->next;
		p->next=s;
		s->data=c;
	    printf("请输入书名,编码和价格:\n");
		scanf("%s%s%f",&c.name,&c.code,&c.price); 
	}
	printf("creatList函数执行,创建链表成功\n");
	return head;
}

//单链表的长度
int length(struct LNode *L)
{
	int i=0;
	LNode *p;
	p=L;
	while (p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
 }
  
 //单链表的插入
 LNode* insertheadList(struct LNode* L,int i,Book b)
 {
     LNode *s,*p;
 	p=L;
 	int j=0;
     if (i<=0)
    {
    	printf("插入越界!\n");
 	    exit(1);
    }
     while (p->next!=NULL)
    {
 		if (j==i-1)
	    {
 	    	s=(LNode*)malloc(sizeof(LNode));
 	 	    s->data=b;
 	    	s->next=p->next;
 		    p->next=s;
 		    printf("inserheadList函数执行,在第%d个位置插入了元素\n",j+1);
 	    	break;
       }
 	   p=p->next;
 	   j++;
    }
	return L;
  } 
  
//单链表查询
Book search(struct LNode*L,int i)
{
	int j;
	Book b;
	LNode *p;
	p=L;
	if (i<0)
	{
	   printf("查询的节点越界了!");
		exit(1); 
	}
	j=1;
    while (p->next!=NULL)
    {
   	    p=p->next;
   	    if (j==i)
	   {
   	    	b=p->data;
   	    	break;
	   }
   	    j++;
    }
	return b;
} 

//单链表的删除
Book DelList(struct LNode*L,int i)
{
	Book b;
	LNode *s,*p;
	p=L;
	int j;
	if (i<1)
	{
		printf("删除越界!\n");
		exit(1);
	}
	j=0;
	while (p->next!=NULL)
	{
	
		if (j==i-1)
		{
			s=p->next;
			b=s->data;
			p->next=s->next;
			//	printf("删除第%d个节点成功,删除的值为:name:%s,code:%s,price:%d\n",b.name,b.code,b.price);
			free(s);
		}
		p=p->next;
		j++;
	  
	}
	return b;
 } 
 
 //清空单链表
  void ClearList(struct LNode*L)
  {
  	LNode *p,*r;
  	p=L;
  	
  	while (p)
  	{
  		p=p->next;
  		r=p;
  		free(p);
  		p=r;
	  }
  	L->next=NULL;
   } 
   
//销毁单链表
 void DestroyList(struct LNode*L)
 {
 	LNode *p,*head;
 	head=L;
 	while (head)
 	{
 		p=head->next;
 		free(head);
 		head=p;
	}
 }
 
void main()
{
    LNode L,*Q; 
    Book b;
    int i;
    Q=&L;
 
    InitLNode(&L);
    
    L=*creatList();
    printf("请输入书本的name,code和price:\n");
    scanf("%s%s%f",&b.name,&b.code,&b.price);
    insertheadList(&L,1,b);
    int y=length(&L);
    printf("单链表的length:%d\n",y);
  //删除第一个元素
   Book bo= DelList(Q,1); 
   printf("删除了第1个元素,它的name:%s,code:%s,price:%f\n",bo.name,bo.code,bo.price);
   ClearList(Q);
  printf("清空单链表成功!\n");
  //按链表的存储顺序输出 
     i=1;
     while (Q->next!=NULL)
    {
         Book book=search(&L,i);
         Q=Q->next;
  	    printf("name:%s,code:%s,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
  	     i++;
    }
  
}