C语言链表的简单编写

代码分为3个部分,test.c ,head.h  list.c

list.c封装的函数

#include"head.h"

//创建一个空链表

Linklist list_creat()
{
     //申请一断空间
	 Linklist L;
	 L=(Linklist)malloc(sizeof(Lnode));
	 if(L==NULL)
	 {
        printf("apply is  fail\n");
		return L;
	 }
	 L->date=0;
	 L->next=NULL;
 
	 return L;
}

//尾插法
int  list_inset_tail(Linklist  L,int  value)
{
    Linklist p,s;
	p=L;
	s=(Linklist )malloc(sizeof(Lnode));
    s->date=value;
	while(p->next)
	{
        p=p->next;
	} 
    s->next=NULL;
	p->next=s;
    return 0;
}

/*
//尾插法也就是正常的输入和输出
Linklist list_inset_tail()
{
    Linklist L,r,p;
	int  value;
	L=(Linklist)malloc(sizeof(Lnode));
	if(L==NULL)
	{
       printf("apply  is fail\n");
	   return NULL;
	}
	L->date=0;
	L->next=NULL;
    r=L;
    while(1)
	{
    	printf("please input date:\n");
    	scanf("%d",&value);
		if(value==-1)
		{
           break;
		}
		p=(Linklist)malloc(sizeof(Lnode));//创建一个新结点
		if(p==NULL)
		{
			printf("apply  is  fail\n");
			return NULL;
		}
        p->date=value;
		p->next=NULL;
		r->next=p;
		r=p;
	}
	return L;

}*/

//通过位置来查找 
Linklist list_find(Linklist  L,int n)
{
    Linklist  p;
	int j=0;
	//p=L;//p指向头结点
	p=L->next;
	if(n<0)
	{
       printf("list  is  full\n");
	   return NULL;
	}
 /*   while(p->next&&j<n)//进行遍历
	{
        p=p->next;
		j++;
	}*/
	while(p&&j<n)
    {
	   p=p->next;
	   j++;
	}
/*	if(!p||j>n)//
	{
       printf("n值不合法\n");
	   return NULL;
	 }
	else
	{
       return p;
	}*/
    if(j==n)
	{
		return p;
	}
	else
	{
       printf("输入的n值太大\n");
	   return NULL;
	}
	

}

//按数值进行查找
Linklist  list_pos_find(Linklist L,int  value)
{
    Linklist  p;
	p=L->next;//指向首元结点
	while(p&&p->date!=value)
	{
        p=p->next;
	}
	return p;
}


//插入数据使用的头插法
int  list_inset_head(Linklist L,int  value)
{
   Linklist  p;//创建一个结点 
   p=(Linklist)malloc(sizeof(Lnode));
   if(p==NULL)
   { 
	   printf("apply is fail\n");
	   return -1;
   }
   p->date=value;
   p->next=L->next;
   L->next=p;
   return 0;
 }

//插入某个位置数据
int list_pos_inset(Linklist L,int i,int value)
{
     Linklist  p,s;
	 //先查找位置才能进行插入数据
	 if(i==0)//如果在0位置
	 {
        p=L;
	 }
	 else
	 {
         p=list_find(L,i-1);//按位置进行查找

	 }
     s=(Linklist)malloc(sizeof(Linklist));//创建一个结点
	 if(s==NULL)
	 {
         printf("apply  is  fail\n");
		 return 1;
	 }
	 else
	 {
          s->date=value;
		  s->next=p->next;
		  p->next=s;
  
	 }
	 return 0;

}
//在某个位置删除数据需要找到的它的前驱
int  list_del(Linklist L,int i)
{ 
	 Linklist p,q;
     if(i==0)//第一个元素
	 {
		p=L;
	 }
     else
	 {
        p=list_find(L,i-1);//按位置进行查找
     }
     if(p==NULL||p->next==NULL)
	 {
		 printf("del is  fail\n");
		 return 1;
     }
	 else
	 {
    	 q=p->next;//用于临时保存指针变量
    	 p->next=q->next;
	     free(q);//申请这个结点需要释放
		 q=NULL;
		 return 0;
	  }
}

//实现函数中的数据倒置使用头指针
void   list_up_down(Linklist L)
{
    Linklist q,p;
	p=L->next;//指向首元结点
	L->next=NULL;

	while(p)
    { 
	   q=p;
       p=p->next;
       
	   q->next=L->next;
	   L->next=q;
	 }

}

//删除头结点
int  list_del_head(Linklist L)
{
	int value;
    Linklist s,p;
	p=L;
	s=p->next;
	value=s->date;
	p->next=s->next;
    free(s);
	s=NULL;
	return value;

}

//删除尾结点
int list_del_tail(Linklist  L)
{
     int value;
	 Linklist  p,s;
	 p=L;
	 while(p->next->next!=NULL)
	 {
	    p=p->next;
	 }
	 s=p->next;
	 value=s->date;
	 free(s);
	 s=NULL;
	 p->next=NULL;
	 return value;

}


//遍历
void  list_show(Linklist  L)
{
    while(L->next)//判断指针是否为空
	{
	    printf("%d  ",L->next->date);
		L=L->next;//指针指向下一个结点
	}
}

head.h同文件

#ifndef  __HEAD_H
#define  __HEAD_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//创建一个结构体
typedef struct list {
     int      date;
	 struct list *next;
}Lnode,*Linklist;

//函数的声明
Linklist list_creat();
int  list_inset_head(Linklist L,int value);
void list_show(Linklist L);
int  list_inset_tail(Linklist  L,int value);
//Linklist   list_inset_tail();
Linklist   list_find(Linklist L,int n);
Linklist   list_pos_find(Linklist  L,int value);
int  list_pos_inset(Linklist L,int i,int value);
int  list_del(Linklist L,int i);
void list_up_down(Linklist L);
int  list_del_head(Linklist L);
int  list_del_tail(Linklist L);
int  list_del_date(Linklist L);
int  list_update_pos(Linklist L,int pos,int value);
void list_change_old(Linklist L,int oldate,int newdate);
#endif

test.c

#include"head.h"
int main(int  argc ,char *argv[])
{
    Linklist L;
//	int x1,x2'
 //   int x;
	L=list_creat();
	list_inset_tail(L,10);
    list_inset_tail(L,20);
    list_inset_tail(L,30);
    list_inset_tail(L,40);
    list_inset_tail(L,50);
    list_show(L);

   
	list_change_old(L,20,100);
	list_show(L);

/*	list_update_pos(L,2,80);
	list_show(L);*/

   /*list_del_date(L);
	list_show(L);*/

/*	list_del_head(L);
	list_show(L);

	list_del_tail(L);
	list_show(L);*/
/*	list_inset_head(L,10);
	list_inset_head(L,20);
	list_inset_head(L,30);
	list_inset_head(L,40);
	list_inset_head(L,50);
	list_show(L);*/
  
/*	list_up_down(L);
	list_show(L);*/

   /* printf("intput is a value:");
	scanf("%d",&x);
	list_del(L,x);
	list_show(L);*/
/*	printf("input  is two value:");
	scanf("%d %d",&x1,&x2);
	list_pos_inset(L,x1,x2);
	list_show(L);*/
 /*   
    printf("input is  a value:");
	scanf("%d",&x);
    p=list_find(L,x);
	if(p==NULL)
	{
       printf("is not find\n");
	}
	else
	{
    	printf("%d\n",p->date);
    }*/
 /*   L=list_inset_tail();
	list_show(L);*/
    /* printf("input is  a value\n");
	scanf("%d",&x);
    p=list_find(L,3);
	printf("%d\n",p->date);
    */

   /* L=list_inset_tail();
	list_show(L);*/
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值