作业:单链表实现增删查改,以及链表数据的翻转

实现效果功能函数代码: 

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

//创建表
listlink *list_create()
{
	//申请一个头结点
	listlink *L=(listlink *)malloc(sizeof(listlink));
	if(NULL==L)
	{
		printf("申请失败\n");
		return NULL;
	}

	//结点初始化
	L->len=0;
	L->next=NULL;

	printf("创建成功\n");
	return L;
}

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

//遍历
void list_show(listlink *L)
{
	//判断逻辑
	if(NULL==L||list_empty(L))
	{
		printf("链表不合法或为空\n");
		return;
	}

	//定义指针指向第一个结点开始遍历
	printf("此时链表内的数据有>>>");
	listlink *q=L->next;
	while(q!=NULL)
	{
		printf("%-4c",q->data);
		q=q->next;
	}
	printf("\n");
}

//申请数据封装结点
listlink *list_buy_node(datatype e)
{
	//申请一个结点
	listlink *p=(listlink *)malloc(sizeof(listlink));
	if(NULL==p)
	{
		printf("申请失败\n");
		return NULL;
    }

	//申请成功,返回结点
	p->data=e;
	p->next=NULL;
	return p;
}

//按位置查找返回结点
listlink *list_search_pos(listlink *L,int pos)
{
	//判断逻辑
	if(NULL==L||pos<0||pos>L->len)
	{
		printf("查找失败\n");
		return NULL;
	}

	//定义指针指向头结点开始遍历
	listlink *q=L;
	for(int i=0;i<pos;i++)
	{
		q=q->next; //依次向后
	}
	//返回结点
	return q;
}


//任意位置添加数据
int list_insert_pos(listlink *L,int pos,datatype e)
{
	//判断逻辑
	if(NULL==L||pos<1||pos>L->len+1)
	{
		printf("添加失败\n");
		return 0;
	}

	//添加逻辑
	//申请结点数据封装
	listlink *p=list_buy_node(e);

	//找到对应位置结点前驱结点
	listlink *q=list_search_pos(L,pos-1);

	//进行插入操作
	p->next=q->next;
	q->next=p;

	//表长变化
	L->len++;
	printf("插入成功\n");
	return 1;
}

//任意位置删除数据
int list_delete_pos(listlink *L,int pos)
{
	//判断逻辑
	if(NULL==L||list_empty(L)||pos<1||pos>L->len)
	{
		printf("删除失败\n");
		return 0;
	}

	//找到删除位置对应前驱结点
	listlink *q=list_search_pos(L,pos-1);

	//删除操作
	//标记要删除的结点
	listlink *p=q->next;

	//孤立删除结点
	q->next=p->next;

	//释放结点
	free(p);
	p==NULL;
	printf("删除成功\n");
	L->len--;
	return 1;

}


//按位置修改数据
int list_updat_pos(listlink *L,int pos,datatype new_e)
{
	//判断逻辑
	if(NULL==L||pos<0||pos>L->len)
	{
		printf("修改失败\n");
		return 0;
	}

	//定义指针指向第一个结点开始遍历
	listlink *q=L->next;
	for(int i=1;i<pos;i++)
	{
		q=q->next; //依次向后
	}

	//修改新值
	q->data=new_e;
	printf("修改成功\n");
	return 1;
}



//链表数据翻转
void list_severse(listlink *L)
{
	//判断逻辑
	if(NULL==L||list_empty(L))
	{
		printf("翻转失败\n");
		return;
	}

	//翻转操作
	//定义一个指针指向第一个结点,替换头结点
	listlink *q=L->next;

	//独立头结点
	L->next=NULL;

	//再定义一个指针存放被独立结点
	listlink *p;

	while(q!=NULL) //循环依次释放第一个结点
	{
		p=q; //接受当前的第一个结点
		q=q->next; //依次向后移

		//将独立出来的结点对头结点进行头插操作
		p->next=L->next;  	
		L->next=p;
	}
	printf("翻转成功\n");
}

//链表销毁
void list_free(listlink *L)
{
	//定义指针指向头结点开始遍历
	listlink *q=L;
	while(q->next!=NULL)
	{
		list_delete_pos(L,1);  //依次删除
	}

	printf("销毁成功\n");
	free(q);
	q=NULL;
}

函数声明代码:

#ifndef __LISTLINK_H__
#define __LISTLINK_H__

typedef char datatype; //类型重定义

typedef struct node
{
	union
	{
		int len;//头结点数据域
		datatype data;//普通节点数据域
	};
	struct node *next;
}listlink;

//创建表
listlink *list_create();

//判空
int list_empty(listlink *L);

//遍历
void list_show(listlink *L);

//申请数据封装结点
listlink *list_buy_node(datatype e);

//头插
int list_insert_head(listlink *L,datatype e);
//任意位置添加数据
int list_insert_pos(listlink *L,int pos,datatype e);

//任意位置删除数据
int list_delete_pos(listlink *L,int pos);

//按位置查找数据返回结点
listlink *list_search_pos(listlink *L,int pos);

//按位置修改数据
int list_updat_pos(listlink *L,int pos,datatype new_e);

//按值修改数据
int list_updat_value(listlink *L,datatype e,datatype new_e);

//链表数据翻转
void list_severse(listlink *L);

//链表销毁
void list_free(listlink *L);


#endif

 主函数进行函数调用:

#include<stdio.h>
#include"listlink.h"
int main(int argc, const char *argv[])
{
	//创建表
	listlink *L=list_create();
	if(NULL==L)
	{
		printf("创建失败\n");
		return -1;
	}

	//调用添加函数
	list_insert_pos(L,1,'a');
	list_insert_pos(L,2,'b');
	list_insert_pos(L,3,'c');
	list_insert_pos(L,4,'d');
	list_insert_pos(L,5,'e');
	list_insert_pos(L,6,'f');
	list_insert_pos(L,7,'g');
	list_insert_pos(L,8,'h');
	list_insert_pos(L,9,'i');


	//调用遍历函数
	list_show(L);

	//调用删除函数
	list_delete_pos(L,1);
	list_show(L);
	
	//调用修改函数
	list_updat_pos(L,1,'B');
	list_updat_pos(L,2,'C');
	list_show(L);

	//调用翻转函数
	list_severse(L);
	list_show(L);

	//销毁链表
	list_free(L);
	L=NULL;
	list_show(L);

	return 0;
}

 实现效果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值