数据结构 单向链表7.20

 

目录

作业1:完成尾删函数:int list_delete_tail(Linklist *L);

作业2:完成按位置修改函数 : int list_update_pos(Linklist *L, int pos, datatype e);

作业3:完成按值修改函数: int list__update_value(Linklist *L, datatype old_e, datatype new_e);

作业4:完成链表反转函数:void list_reverse(Linklist *L);

运行结果

 全部增删改查的代码  linklist.c


作业1:完成尾删函数:int list_delete_tail(Linklist *L);

//尾删
int list_delete_tail(Linklist *L)
{
    
	if(NULL ==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}

	int temp=L->len-1;
	Linklist *q=find_node(L,temp);
	Linklist *p=q->next;
	q->next = p->next;
     
	free(p);
	p=NULL;
	L->len--;
	printf("尾删成功\n");

	return 0;
}

作业2:完成按位置修改函数 : int list_update_pos(Linklist *L, int pos, datatype e);

//按位置修改
int list_update_pos(Linklist *L,int pos,datatype e)
{
	if(NULL ==L || pos<0 || pos>L->len)
	{
      printf("修改失败\n");
	  return -1;
	}

	Linklist *q=L;
	for(int i=1;i<=pos;i++)
	{
		q=q->next;
	}
	q->data=e;
	printf("按位置查找成功\n");
	return 0;

}

作业3:完成按值修改函数: int list__update_value(Linklist *L, datatype old_e, datatype new_e);

//按值修改
int list_update_value(Linklist *L,datatype old_e,datatype new_e)
{

	if(NULL == L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;

	}
	Linklist *q=L->next;
	for(int i=1;i<=L->len;i++)
	{
		if(q->data == old_e)
		{
           q->data = new_e;
		}
		q=q->next;
	}
	printf("按值修改成功\n");
	return 0;
}

作业4:完成链表反转函数:void list_reverse(Linklist *L);

//反转
void list_reverse(Linklist *L)
{
  

	if(NULL == L || list_empty(L))
	{
		printf("反转失败\n");
		return;
    }
		Linklist *q=L->next;
		L->next=NULL; 
		while(q != NULL)
		{
		    list_insert_head(L,q->data);
			q=q->next;
		}
	 printf("翻转成功\n");

}

运行结果:

 全部增删改查的代码  linklist.c

#include<stdio.h>
#include"linklist.h"
#include<stdlib.h>



//创建
Linklist *list_create()
{
	Linklist* L=(Linklist*)malloc(sizeof(Linklist));
	if(NULL == L)
	{
		printf("创建失败\n");
		return NULL;
	}

	//初始化
	L->len = 0;
	L->next = NULL;
    
	printf("创建成功\n");
	return L;
}



//判空
int list_empty(Linklist *L)
{
	//1表示空 0表示非空
	return NULL==L->next ? 1: 0;
}

//头插
int  list_insert_head(Linklist *L,datatype e)
{
	//判断条件
	if(NULL == L)
	{
		printf("所给链表不合法!\n");
		return -1;
	}
	//申请节点
	Linklist *P=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==P)
	{
		printf("节点申请失败\n");
		return -1;
	}
	//将要插入的数据放入节点
	P->data = e;
	P->next = NULL;
	//完成头插
	P->next = L->next;
	L->next = P;
	//表的变化
	L->len++;
    printf("头插成功\n");
}


//遍历
void list_show(Linklist *L)
{
	if(NULL==L || list_empty(L))
    {
		printf("表空,遍历失败\n");
		return;
	}
	printf("元素:");
	Linklist *q=L->next;
	while(q!=NULL)
	{
		printf("%c\t",q->data);
		q=q->next;

	}
	printf("\n");

  
}


//定义申请节点函数
Linklist * node_buy(datatype e )
{
	Linklist *p=(Linklist *)malloc(sizeof(Linklist));
	if(NULL == p)
	{
		printf("节点申请失败\n");
		return NULL;
	}

	p->data =e;
	p->next = NULL;

	return p;
}

//尾插
int list_insert_tail(Linklist *L,datatype e)
{

	if(NULL== L)
	{
		printf("所给链表不合法\n");
		return -1;
	}
    Linklist *p=node_buy(e);
	Linklist *q=L;
	while(q->next != NULL)
	{
		q=q->next;
	}
	q->next=p;
	L->len++;
	printf("尾插成功\n");
	return 0;
		
}


//任意插
int list_insert_pos(Linklist *L,int pos,datatype e)
{

	//判断逻辑
	
	if(NULL ==L || pos<1 || pos>L->len+1)
	{
      printf("插入失败\n");
	  return -1;
	}
	//申请节点存放数组
	Linklist *p=node_buy(e);
	//查找要插入的位置的前驱节点
	Linklist *q=find_node(L,pos-1);
	p->next=q->next;
	q->next =p;

	L->len++;
	printf("插入成功\n");
	return 0;
}



//按位置查找
Linklist *find_node(Linklist *L,int pos)
{
	if(NULL ==L || pos<0 || pos>L->len)
	{
      printf("查找失败\n");
	  return NULL;
	}

	//查找节点
	Linklist *q=L;
	for(int i=1;i<=pos;i++)
	{
		q=q->next;
	}
	return q;
}



//头删
int list_delete_head(Linklist *L)
{
	if(NULL ==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;

	}


	Linklist *p=L->next;
	L->next = p->next;
	free(p);

	L->len--;
	printf("头删成功\n");

	return 0;
}


//尾删
int list_delete_tail(Linklist *L)
{
    
	if(NULL ==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}

	int temp=L->len-1;
	Linklist *q=find_node(L,temp);
	Linklist *p=q->next;
	q->next = p->next;
     
	free(p);
	p=NULL;
	L->len--;
	printf("尾删成功\n");

	return 0;
}



//任意删
int list_delete_pos(Linklist *L,int pos)
{
    if(NULL ==L || list_empty(L) || pos<1 || pos>L->len)
	{
		printf("删除失败\n");
		return -1;
	}

	Linklist *q = find_node(L,pos-1);
	Linklist *p = q->next;
	q->next = p->next;

	free(p);
	p=NULL;
    L->len--;

	printf("删除成功\n");
	return 0;
}

//按值查找
int list_search_value(Linklist *L,datatype e)
{
	if(NULL == L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;

	}
	Linklist *q=L->next;
	for(int i=1;i<=L->len;i++)
	{
		if(q->data == e)
		{
           return i;
		}
		q=q->next;
	}
	return 0;
}


//销毁链表
void list_free(Linklist *L)
{
	if(NULL == L)
	{
		return;
	}
	while(L->next != NULL)
	{
		list_delete_head(L);
	}

	free(L);
	L=NULL;

	printf("释放成功\n");
	return;

}

//按位置修改
int list_update_pos(Linklist *L,int pos,datatype e)
{
	if(NULL ==L || pos<0 || pos>L->len)
	{
      printf("修改失败\n");
	  return -1;
	}

	Linklist *q=L;
	for(int i=1;i<=pos;i++)
	{
		q=q->next;
	}
	q->data=e;
	printf("按位置查找成功\n");
	return 0;




}



//按值修改
int list_update_value(Linklist *L,datatype old_e,datatype new_e)
{

	if(NULL == L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;

	}
	Linklist *q=L->next;
	for(int i=1;i<=L->len;i++)
	{
		if(q->data == old_e)
		{
           q->data = new_e;
		}
		q=q->next;
	}
	printf("按值修改成功\n");
	return 0;
}




//反转
void list_reverse(Linklist *L)
{
  

	if(NULL == L || list_empty(L))
	{
		printf("反转失败\n");
		return;
    }
		Linklist *q=L->next;
		L->next=NULL; 
		while(q != NULL)
		{
		    list_insert_head(L,q->data);
			q=q->next;
		}
	 printf("翻转成功\n");

}


版权声明:本文为weixin_51103493原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。