7.8数据结构单向链表

linkList.h 

linkList.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__

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

//类型重定义,用于存储数据的类型
typedef int DataType;

//定义一个节点的结构体类型
typedef struct Node
{
	union
	{
		int len;
		DataType data;
	};
	struct Node *next;
}linkList,*linkListPtr;

linkListPtr link_create();//创建链表

int empty(linkListPtr H);//链表判空

linkListPtr create_node(DataType e);//申请节点,封装数据
//头插
int head_add(linkListPtr H,DataType e);
//遍历,打印输出链表每个节点数据域的值
void show(linkListPtr H);
int tail_add(linkListPtr H,DataType e);//尾插
int idex_add(linkListPtr H,DataType e,int idex);//任意位置插入
int head_del(linkListPtr H);//头删
int tail_del(linkListPtr H);//尾删
int idex_del(linkListPtr H,int idex);//任意位置删除
int idex_change(linkListPtr H,DataType e,int idex);//按位置修改
int val_change(linkListPtr H,DataType e,int value);//按值修改
linkListPtr val_search(linkListPtr H,int value);//按值查找 
void rev(linkListPtr H);//反转
void free_list(linkListPtr H);//销毁链表
#endif

 linkList.c

#include"linkList.h"

linkListPtr link_create()
{ 
	//堆区申请空间
	linkListPtr H = (linkListPtr)malloc(sizeof(linkList));
	if(NULL == H)
	{
		printf("创建链表失败\n");
		return NULL;
	}
//申请成功,将头结点的数据域归0,指针域指向NULL
	H->len = 0;
	H->next = NULL;
	printf("创建链表成功\n");
	return H;
}
//判空
int empty(linkListPtr H)
{
	if(NULL == H)
	{
		printf("判空失败!\n");
		return -1;
	}
	return H->len == 0;
	//return H->next == NULL;
}
//申请节点,封装数据
linkListPtr create_node(DataType e)
{
	linkListPtr p = (linkListPtr)malloc(sizeof(linkList));
	if(NULL==p)
	{
		printf("申请节点失败\n");
		return NULL;
	}
	p->data = e;
	p->next = NULL;
	return p;
}
//头插
int head_add(linkListPtr H,DataType e)
{
	if(NULL == H)
	{
		printf("头插失败!\n");
		return 0;
	}
	linkListPtr p = create_node(e);
	p->next = H->next;
	H->next = p;
	H->len++;
	return 1;
}
//遍历
void show(linkListPtr H)
{
	if(NULL==H || empty(H))
	{
		printf("遍历失败!\n");
		return;
	}
	//定义一个遍历的指针
	linkListPtr q = H;
	for(int i=0;i<H->len;i++)
	{
		q = q->next;
		printf("%d ",q->data);
	}
	printf("\n");
}
//尾插
int tail_add(linkListPtr H,DataType e)
{
	if(NULL==H)
	{
		printf("尾插失败!\n");
		return 0;
	}
	linkListPtr p = create_node(e);
	linkListPtr q = H;
	for(int i=0;i<H->len;i++)
	{
		q = q->next;
	}
	//尾插
	q->next = p;
	H->len++;
}
int idex_add(linkListPtr H,DataType e,int idex)
{
	if(NULL == H || idex<1 ||idex>H->len+1)
	{
		printf("插入失败!\n");
		return 0;
	}
	linkListPtr p = create_node(e);
	linkListPtr q = H;
	for(int i=0;i<idex-1;i++)
	{
		q = q->next;
	}
	//插入
	p->next = q->next;
	q->next = p;
	H->len++;
	return 1;
}
//头删
int head_del(linkListPtr H)
{
	if(NULL == H || empty(H))
	{
		printf("头删失败");
		return 0;
	}
	linkListPtr q = H->next;
	H->next = H->next->next;
	free(q);
	q = NULL;
	H->len--;
	return 1;
}
int tail_del(linkListPtr H)
{
	if(NULL == H || empty(H))
	{
		printf("尾删失败!\n");
		return 0;
	}
	linkListPtr q = H;
	for(int i=0;i<H->len-1;i++)
	{
		q = q->next;
	}
	linkListPtr p = q->next;//最后一个节点
	q->next = p->next;
	free(p);
	p = NULL;//避免野指针
	H->len--;
	return 1;
}
int idex_del(linkListPtr H,int idex)
{
	if(NULL==H || empty(H) || idex<1 ||idex>H->len )
	{
		printf("删除失败!\n");
		return 0;
	}
	linkListPtr q = H;//定义要删除的节点的前一个节点
	for(int i=0;i<idex-1;i++)
	{
		q = q->next;
	}
	linkListPtr p = q->next;//要删除的节点
	q->next = p->next;
	free(p);
	p = NULL;
	H->len--;
	return 1;
}
//按位置修改
int idex_change(linkListPtr H,DataType e,int idex)
{
	if(NULL==H || empty(H) || idex<1 || idex>H->len)
	{
		printf("修改失败!\n");
		return 0;
	}
		linkListPtr p = H;
	for(int i=0;i<idex;i++)
	{
		p = p->next;
	}
	if(p->data == e)
	{
		return 0;
	}
	p->data = e;
	return 1;	
}
//按值修改
int val_change(linkListPtr H,DataType e,int value)
{
	if(NULL==H || empty(H))
	{
		printf("修改失败!\n");
		return 0;
	}
	linkListPtr p = H;
	for(int i=0;i<H->len;i++)
	{
		p = p->next;
		if(p->data == value)
		{
			p->data = e;
		}
	}
	return 1;
}
//按值查找
linkListPtr val_search(linkListPtr H,int value)
{
	if(NULL==H || empty(H))
	{
		printf("查找失败!\n");
		return NULL;
	}
	linkListPtr p = H;
	for(int i=0;i<H->len;i++)
	{
		p = p->next;
		if(p->data == value)
		{
				return p;
		}
	}
}
void rev(linkListPtr H)
{ 
	if(NULL==H || NULL==H->next)//判断链表是否合法,头结点的指针域
		return;
	//定义两个指针,分别指向头节点的指针域和第一个普通节点的指针域
	linkListPtr p = H->next;
	linkListPtr q = H->next->next;

	while(q!=NULL)
	{
		p->next = q->next;//把p的指针域移向q的指针域
		q->next = H->next;//把q的指针域移向头结点的指针域
		H->next = q;//把头结点的指针域指向q
		q = p->next;//把q指向p的指针域
	}
}
//销毁链表
void free_list(linkListPtr H)
{
	if(NULL== H)
	{
		printf("销毁失败!\n");
		return;
	}
	linkListPtr p = H;
	while(p)
	{
		H = H->next;
		free(p);
		p = H;
	}
	printf("销毁成功!\n");
}

main.c 

#include "linkList.h"

int main()
{ 
	//创建链表
	linkListPtr H = link_create();
	//头插
	head_add(H, 10);
	head_add(H, 20);
	head_add(H, 30);
	head_add(H, 40);
	head_add(H, 50);
	show(H);           //遍历
	tail_add(H, 1);    //尾插
	tail_add(H, 2);
	tail_add(H, 3);
	tail_add(H, 4);
	tail_add(H, 5);
	show(H);
	idex_add(H,55,2);   //任意位置插入
	show(H);
	head_del(H); //头删
	show(H);
	tail_del(H);//尾删
	show(H);
	idex_del(H,3);//任意位置删除
	show(H);
	idex_change(H,100,2);//按位置修改
	show(H);
	val_change(H,300,20);//按值修改
	show(H);
	//按值查找
	printf("查找到链表中值1的地址是%p\n",val_search(H,1));//按值查找
	rev(H);//链表反转
	show(H);
	free_list(H);	
}

 运行截图

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值