数据结构DAY

 任意位置修改

 按元素查找

 按元素修改 

按元素插入 

 按元素删除

 逆置

头文件

#ifndef __1HEAD_H__
#define __1HEAD_H__



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


typedef int datatype;
//带头节点结构定义
typedef struct Node
{
	//数据域
	union{
		int len;//头节点数据域
		datatype data;//普通节点的数据域
	};
	//指针域:下一个节点的地址
	struct Node *next;
}*Linklist;


Linklist create_node(int flag);
int insert_head(Linklist L,datatype e);
void output(Linklist L);
Linklist insert_rear(Linklist L,datatype e,Linklist rear);
int delete_head(Linklist L);
int delete_rear(Linklist L);
int insert_pos(Linklist L,int pos,datatype e);
int delete_pos(Linklist L,int pos);
int update_pos(Linklist L,int pos,datatype e);
datatype search_pos(Linklist L,int pos);
int search_data(Linklist L,datatype e);
int update_data(Linklist L,datatype e,datatype key);
int insert_data(Linklist L,datatype e,datatype key);
int delete_data(Linklist L,datatype e);
void rev_linklist(Linklist L);

#endif

定义函数

#include "1head.h"

/*
 * function:    创建节点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回首地址,失败返回NULL
 */

Linklist create_node(int flag)
{
	Linklist L = (Linklist)malloc(sizeof(struct Node));
		if(NULL == L)
			return NULL;
	//对L进行初始化
	//对数据域清零
	if(1 == flag)
		L->len = 0;
	else if(0 == flag)
		L->data = 0;
	//对L的指针域指向NULL
	L->next = NULL;
}

/*
 * function:    链表头插
 * @param [ in] 
 * @param [out] 链表头节点,插入的值
 * @return      成功返回0,失败返回-1
 */

int insert_head(Linklist L,datatype e)
{
	//头节点是否创建成功
	if (NULL == L)
	{
		puts("头节点创建失败");
		return -1;
	}
	//创建节点s
	Linklist s = create_node(0);
	if (NULL == s)
	{
		puts("节点创建失败");
		return -1;
	}
	//s的数据域赋值
	s->data = e;
	//s的指针域赋值
	s->next = L->next;
	L->next = s;
	L->len++;
	return 0;
}

/*
 * function:    链表输出
 * @param [ in] 
 * @param [out] 链表
 * @return      无
 */

void output(Linklist L)
{
	//判断头节点是否创建成功
	//判断链表是否为空
	if(NULL == L || L->next == NULL)
		return;
	Linklist p = L;
/*	for (int i = 0; i < L->len; i++)
	{
		p = p->next;
		printf("%d\t",p->data);
	}
*/	while(p->next!=NULL)
	{
		p = p->next;
		printf("%d\t",p->data);
	}
	puts("");
}

/*
 * function:    链表尾插
 * @param [ in] 
 * @param [out] 头节点,插入的值,尾节点地址
 * @return      成功返回尾节点地址
 */

Linklist insert_rear(Linklist L,datatype e,Linklist rear)
{
	//判断头节点是否创建成功
	if (NULL == L)
		return NULL;
	Linklist s = create_node(0);
	if (NULL == s)
		return NULL;
	s->data = e;
	rear->next = s;
	rear = s;
	L->len++;
	return rear;
}

/*
 * function:    头删
 * @param [ in] 
 * @param [out] 链表
 * @return      成功返回0,失败返回-1
 */

int delete_head(Linklist L)
{
	if(NULL == L || NULL == L->next)
		return -1;
	Linklist q = L->next;
	L->next = q->next;
	free(q);
	q = NULL;
	L->len--;
	return 0;
}

/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 链表
 * @return      成功返回0,失败返回-1
 */

int delete_rear(Linklist L)
{
	//判断头节点是否创建成功
	//判断链表是否为空
	if (NULL == L || NULL == L->next)
		return -1;
	Linklist p = L;
	//尾删
	//循环到倒数第二个节点
	while (p->next->next!=NULL)
	{
		p = p->next;
	}
	//删除p->next
	free(p->next);
	p->next = NULL;
	L->len--;
	return 0;
}

/*
 * function:    任意位置插入
 * @param [ in] 
 * @param [out] 链表,位置,值
 * @return      成功返回0,失败返回-1
 */

int insert_pos(Linklist L,int pos,datatype e)
{
	if(NULL == L || pos < 1 || pos > L->len-1)
		return -1;
	Linklist p = L;
	for (int i = 0; i < pos-1; i++)
	{
		p = p->next;
	}
	Linklist s = create_node(0);
	s->data = e;
	s->next = p->next;
	p->next = s;
	L->len++;
	return 0;
}

/*
 * function:    任意位置删除
 * @param [ in] 
 * @param [out] 链表,位置
 * @return      成功返回0,失败返回-1
 */

int delete_pos(Linklist L,int pos)
{
	if (NULL == L || pos < 1 || pos > L->len)
		return -1;
	Linklist p = L;
	for (int i = 0; i < pos-1; i++)
	{
		p = p->next;
	}
	Linklist q = p->next;
	p->next = q->next;
	free(q);
	q = NULL;
	return 0;
}

/*
 * function:    任意位置修改
 * @param [ in] 
 * @param [out] 链表,位置,修改的值
 * @return      成功返回0,失败返回-1
 */

int update_pos(Linklist L,int pos,datatype e)
{
	if (NULL == L || pos < 1 || pos > L->len)
		return -1;
	Linklist p = L;
	for (int i = 0; i < pos; i++)
	{
		p = p->next;
	}
	p->data = e;
	return 0;
}

/*
 * function:    按位置查找
 * @param [ in] 
 * @param [out] 链表,位置
 * @return      成功返回查找位置的值,失败返回-1
 */

datatype search_pos(Linklist L,int pos)
{
	if (NULL == L || pos < 1 || pos > L->len)
		return -1;
	Linklist p = L;
	for (int i = 0; i < pos; i++)
	{
		p = p->next;
	}
	datatype e = p->data;
	return e;

}

/*
 * function:    按元素查找
 * @param [ in] 
 * @param [out] 链表,元素
 * @return      成功返回查找元素的位置
 */

int search_data(Linklist L,datatype e)
{
	if(NULL == L || NULL == L->next)
		return -1;
	Linklist p = L;
	int pos = 0;
	while (p->next!=NULL)
	{
		p = p->next;
		pos++;
		if(e == p->data)
			return pos;
	}
	return -1;
}

/*
 * function:    按元素修改
 * @param [ in] 
 * @param [out] 链表,查找元素,修改的值
 * @return      
 */

int update_data(Linklist L,datatype e,datatype key)
{
	if (NULL == L || NULL == L->next)
	{ 	puts("输入错误");
		return -1;
	}
	Linklist p = L;
	while (p->next!=NULL)
	{
		p = p->next;
		if(e == p->data)
			p->data = key;
	}
	return -1;
}

/*
 * function:    按元素插入
 * @param [ in] 
 * @param [out] 链表,查找元素,插入的元素
 * @return      
 */

int insert_data(Linklist L,datatype e,datatype key)
{
	int pos = search_data(L,e);
	if (pos == -1)
	{
		puts("修改错误");
		return -1;
	}
	else
		insert_pos(L,pos,key);
	return 0;
}

/*
 * function:    按元素删除
 * @param [ in] 
 * @param [out] 链表,要删除的元素
 * @return      
 */

int delete_data(Linklist L,datatype e)
{
	int pos = search_data(L,e);
	if (pos == -1)
	{
		puts("错误");
		return -1;
	}
	else
		delete_pos(L,pos);
	return 0;
}

/*
 * function:    单链表逆置
 * @param [ in] 
 * @param [out] 链表
 * @return      
 */

void rev_linklist(Linklist L)
{
	if(NULL == L || NULL == L->next)
		return;
	Linklist p = L->next;
	L->next = NULL;
	while(p!=NULL)
	{
		Linklist t = p;
		p = p->next;
		t->next = L->next;
		L->next = t;
	}
}

 主函数

#include "1head.h"

int main(int argc, const char *argv[])
{
	//1表示头节点,0表示普通节点
	Linklist L = create_node(1);
	int n;
	datatype e;
	Linklist rear = L;
	printf("请输入n的值:");
	scanf("%d",&n);
/*	for (int i = 0; i < n; i++)
	{
		printf("请输入插入的值:");
		scanf("%d",&e);
		insert_head(L,e);
	}

	//尾插
*/	for (int i = 0; i < n; i++)
	{
		printf("请输入插入的值:");
		scanf("%d",&e);
		rear = insert_rear(L,e,rear);
	}
	output(L);
	//头删
/*	delete_head(L);
	delete_head(L);
	delete_head(L);
	puts("头删");
	output(L);
*/
	//尾删
/*	delete_rear(L);
	delete_rear(L);
	delete_rear(L);
	output(L);
*/
	//按位置插入
#if 0
	int pos;
	printf("请输入插入的位置:");
	scanf("%d",&pos);
	printf("请输入插入的值:");
	scanf("%d",&e);
	insert_pos(L,pos,e);
	output(L);
#endif
#if 0
	//按任意位置删除
	int pos;
	printf("请输入删除的位置:");
	scanf("%d",&pos);
	delete_pos(L,pos);
	output(L);

#endif
#if 0
	//按任意位置修改
	int pos;
	printf("请输入修改的位置:");
	scanf("%d",&pos);
	printf("请输入修改的值:");
	scanf("%d",&e);
	update_pos(L,pos,e);
	output(L);
#endif	
#if 0
	//按任意位置查找
	int pos;
	printf("请输入查找的位置:");
	scanf("%d",&pos);
	e = search_pos(L,pos);
	printf("查找的位置对应的元素为:%d\n",e);
#endif	

#if 0
	//按元素查找
	printf("请输入查找的元素:");
	scanf("%d",&e);
	int pos = search_data(L,e);
	if(pos == -1)
		printf("查找失败\n");
	else
		printf("查找的元素对应的位置为:%d\n",pos);
#endif	
#if 0
	//按元素修改
	datatype key = 0;
	printf("请输入查找的元素:");
	scanf("%d",&e);
	printf("请输入修改的元素:");
	scanf("%d",&key);
	update_data(L,e,key);
	output(L);
#endif
#if 0
	//按元素插入
	datatype key = 0;
	printf("请输入查找的元素:");
	scanf("%d",&e);
	printf("请输入插入的元素:");
	scanf("%d",&key);
	insert_data(L,e,key);
	output(L);
#endif	
#if 0
	//按元素删除
	printf("请输入删除的元素:");
	scanf("%d",&e);
	delete_data(L,e);
	output(L);
#endif	
#if 1
	//单链表逆置
	rev_linklist(L);
	printf("逆置后链表为:\n");
	output(L);
#endif	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值