day15 单向链表

head.h

#ifndef __HEAD_H__
#define __HEAD_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;




void menue();//菜单
linklist create();//创建节点
void output(linklist L);//输出
int insert_head(linklist L,datatype e);//头插
int insert_rear(linklist L,datatype e);//尾插
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 remake_pos(linklist L,int pos,datatype e);//按位修改
int find_pos(linklist L,int pos);//按位置查询



int find_data(linklist L,datatype key);//按元素查找位置
int insert_data(linklist L,datatype key,datatype e);//按照元素插入值
int delete_data(linklist L,datatype key);//按元素删除
int remake_data(linklist L,datatype key,datatype e);//按元素修改



void linklist_rev(linklist L);//单项列表逆置
linklist free_space(linklist L);//释放空间

#endif

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	//创建头节点L
	linklist L = create(1);

	menue();
	int number;
	while(1)
	{
		printf("\n请输入您的选择:");
		scanf("%d",&number);
		switch(number)
		{
		case 1:
			{
				int n;
				datatype e;
				printf("请输入元素个数");
				scanf("%d",&n);
				for (int i=0;i<n;i++)
				{
					printf("请输入第%d个插入的元素:",i+1);
					scanf("%d",&e);
					insert_head(L,e);
				}
			}break;
		case 2:
			{
				output(L);
			}break;
		case 3:
			{
				int n;
				datatype e;
				printf("请输入元素个数");
				scanf("%d",&n);
				for (int i=0;i<n;i++)
				{
					printf("请输入第%d个插入的元素:",i+1);
					scanf("%d",&e);
					insert_rear(L,e);
				}
				
			}break;
		case 4:
			{
				delete_head(L);
			}break;
		case 5:
			{
				delete_rear(L);
			}break;
		case 6:
			{
				int pos;
				datatype e;
				printf("请输入插入的位置与值");
				scanf("%d %d",&pos,&e);
				insert_pos(L,pos,e);
			}break;
		case 7:
			{
				int pos;
				printf("请输入要删除元素的位置");
				scanf("%d",&pos);
				delete_pos(L,pos);
			}break;
		case 8:
			{
				int pos;
				datatype e;
				printf("请输入修改的位置与值");
				scanf("%d %d",&pos,&e);
				remake_pos(L,pos,e);
			}break;
		case 9:
			{
				int pos;
				printf("请输入要查找的位置");
				scanf("%d",&pos);
				find_pos(L,pos);
			}break;
		case 10:
			   {
			   	datatype key;
				printf("请输入要查找的元素");
				scanf("%d",&key);
				find_data(L,key);
			   }break;
		case 11:
			   {
			   	datatype key;
				datatype e;
				printf("请输入元素以及插入这个元素的值");
				scanf("%d %d",&key,&e);
				insert_data(L,key,e);
			   }break;
		case 12:
			   {
			   	datatype key;
				printf("请输入要删除的元素:");
				scanf("%d",&key);
				delete_data(L,key);
			   }break;
		case 13:
			   {
			   	datatype key;
				datatype e;
				printf("请输入元素以及修改这个元素的值");
				scanf("%d %d",&key,&e);
				remake_data(L,key,e);
			   }
		case 14://排序
			   {
			   	
			   }break;
		case 15://逆置
			   {
			   	linklist_rev(L);
			   }break;
		case 16://释放
			   {
			   	free_space(L);
			   }

		default:printf("输入错误,请重新输入\n");break;
		case 0:printf("退出程序\n");exit(0);		
		}
	}
	
}

test.c

#include "head.h"

void menue()
{
	
	puts("****************");
	puts("\t1,单项链表头插");
	puts("\t2,单项链表遍历");
	puts("\t3,单项链表尾插");
	puts("\t4,单向链表头删");
	puts("\t5,单向链表尾删");
	puts("\t6,单向链表按下表插入");
	puts("\t7,单向链表按下表删除");
	puts("\t8,单向链表按下表修改");
	puts("\t9,单向链表按下表查找");
	puts("\t10,按照元素查找位置");
	puts("\t11,按照元素插入值");
	puts("\t12,按照元素删除");
	puts("\t13,按照元素修改");
	puts("\t14,单向链表排序");
	puts("\t15,单向链表逆置");
	puts("\t16,单向链表释放空间");
	puts("****************");
}
/*
 * function:    创建节点
 * @param [ in] 头结点1 新节点0
 * @param [out] 
 * @return      
 */
linklist create(int flag)
{
	//创建头节点
	linklist L=(linklist)malloc(sizeof(struct Node));
	if(L==NULL)
	{
		return NULL;
	}
	//成功
	//对头结点L的数据域初始化
	if(flag == 1)
	{
	L->len = 0;
	}
	//创建新节点
	else if(flag == 0)
	{
	L->data = 0;
	}
	//对头结点的指针初始化
	L->next = NULL;
	return L;
}

/*
 * function:    头插
 * @param [ in] 链表  插入的值
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int insert_head(linklist L,datatype e)
{
	//1、判断链表是否创建
	if(L ==NULL)
	{
		puts("头插失败");
		return -1;
	}
	//2、头插
	//创建一个新的节点s
	linklist s = create(0);
	if (s == NULL)
	{
		return -1;
	}
	//新节点创建成功
	//s的数据域赋值
	s->data = e;
	s->next = L->next;
	L->next = s;
	L->len++;
	return 0;
}


/*
 * function:    循环输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(linklist L)
{
	//1.判断链表是否创建
	//2.判断链表是否为空
	if(L ==NULL || L->len ==0)
	{
		puts("遍历失败");
	}
	//3.遍历
	//
	linklist p=L;
	while(p->next != NULL)
	{
		p =p->next;
		printf("%d\t",p->data);
	}
	puts("");
}
	
 
/*
 * function:    尾部插入
 * @param [ in] 
 * @param [out] 链表 插入的值
 * 
 * @return      
 */
int insert_rear(linklist L,datatype e)
{
	//判断链表是否创建
	if(L == NULL)
	{
		return -1;
	}
	//尾部插入
	//循环尾部节点
	linklist p = L;
	while(p->next != NULL)
	{
		p = p->next;
	}
	//在最后插入s
	linklist s = create(0);
	if(s == NULL)
	{
		return -1;
	}
	s->data = e;
	p->next = s;
	L->len++;
	return 0;
}

/*
 * function:    头部插入
 * @param [ in] 
 * @param [out] 链表
 * @return      
 */
int delete_head(linklist L)
{
	//判断链表是否创建
	//判断链表是否为空
	if(L == NULL || L->next == NULL)
	{
		puts("删除失败,链表未创建或链表为空");
		return -1;
	}
	linklist q = L->next;
	L->next = q->next;
	free(q);
	q = NULL;
	L->len--;
	puts("头删成功");
	return 0;
}

/*
 * function:    尾部删除
 * @param [ in] 
 * @param [out] 链表
 * @return      
 */
int delete_rear(linklist L)
{
	//判断链表是否创建
	//判断链表是否为空
	if(L == NULL || L->len ==0)
	{
		puts("删除失败,链表未创建或链表为空");
		return -1;
	}
	linklist p = L;
	while(p->next->next != NULL)
	{
		p = p->next;
	}
	free(p->next);
	p->next = NULL;
	L->len--;
	puts("尾删成功");
	return 0;
}

/*
 * function:    按位置插入值
 * @param [ in] 
 * @param [out] 链表 插入的位置 插入的值
 * @return      
 */
int insert_pos(linklist L,int pos,datatype e)
{
	//判断链表是否创建
	//判断位置是否合法
	if(L == NULL || pos<1 || pos>L->len+1)
	{
		printf("插入失败\n");
		return -1;
	}
	//循环到pos-1,起名为p
	linklist p =L;
	for (int i=0;i<pos-1;i++)
	{
		p = p->next;
	}
	linklist s= create(0);
	if (s == NULL)
	{
		return -1;
	}
	s->data =e;
	s->next = p->next;
	p->next =s;
	L->len++;
	printf("插入成功\n");
	return 0;
	
}

/*
 * function:    按位删除
 * @param [ in] 
 * @param [out] 链表 位置pos
 * @return      
 */
int delete_pos(linklist L,int pos)
{
	//判断链表是否创建
	//判断链表是否为空
	//判断位置是否合法
	if(L == NULL || L->next == NULL || pos<1 || pos>L->len)
	{
		puts("删除失败");
		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;
	L->len--;
}

/*
 * function:    按照位置修改
 * @param [ in] 
 * @param [out] 链表 位置pos 值e
 * @return      
 */
int remake_pos(linklist L,int pos,datatype e)
{
	//判断链表是否创建
	//判断位置是否合法
	if(L == NULL || pos<1 || pos>L->len+1)
	{
		printf("插入失败\n");
		return -1;
	}
	linklist p =L;
	for(int i=0;i<pos;i++)
	{
		p = p->next;
	}
	p->data = e;
	printf("修改成功\n");
	return 0;
}

/*
 * function:    按位置查询
 * @param [ in] 
 * @param [out] 链表 位置pos
 * @return      
 */
int find_pos(linklist L,int pos)
{
	if(L == NULL || pos<1 || pos >L->len)
	{
		printf("查询失败\n");
		return -1;
	}
	linklist p = L;
	for (int i =0;i<pos;i++)
	{
		p=p->next;
	}
	printf("第%d个元素为%d\n",pos,p->data);
	return 0;
}


/*
 * function:    按元素查找
 * @param [ in] 
 * @param [out] 链表 查找的值
 * @return      成功返回位置
 */
int find_data(linklist L,datatype key)
{
	//判断链表是否创建
	//判断链表是否为空
	if(L ==NULL || L->len == 0)
	{
		printf("查找失败\n");
		return -1;
	}
	linklist p=L;
	int count = 0;
	while(p->next != NULL)
	{
		p = p->next;
		count++;
		if(p->data == key)
		{
			return count;
		}
	}
	return 0;
}

/*
 * function:    按元素插入
 * @param [ in] 链表 已有元素key 插入元素e 
 * @param [out] 
 * @return      
 */
int insert_data(linklist L,datatype key,datatype e)
{
	int pos = find_data(L,key);
	if(pos == -1)
	{
		puts("按元素插入失败");
		return -1;
	}
	insert_pos(L,pos,e);
	printf("按元素插入成功\n");
	return 0;
}

/*
 * function:    按元素删除
 * @param [ in] 
 * @param [out] 链表 要删除的元素key
 * @return      
 */
int delete_data(linklist L,datatype key)
{
	int pos = find_pos(L,key);
	if (pos = -1)
	{
		puts("删除失败");
		return -1;
	}
	delete_pos(L,pos);
	puts("删除成功");
	return 0;
}

/*
 * function:    按元素修改
 * @param [ in] 
 * @param [out] 链表 原元素 修改元素
 * @return      
 */
int remake_data(linklist L,datatype key,datatype e)
{
	int pos = find_pos(L,key);
	if(pos = -1)
	{
		puts("修改失败");
		return -1;
	}
	remake_pos(L,pos,e);
	puts("修改成功");
}

/*
 * function:    逆置
 * @param [ in] 链表
 * @param [out]
 * @return      无
 */
void linklist_rev(linklist L)
{
    //1,判断链表是否创建
    //2,判断链表是否为空
    if(L==NULL || L->next==NULL)
    {
        return ;
    }
    //3逆置
    linklist p=L->next;
    L->next=NULL;
    while(p!=NULL)
    {
        linklist t=p;
        p=p->next;
        //把t节点头插到L节点的后面
        t->next=L->next;
        L->next=t;
    }
}

/*
 * function:    释放空间
 * @param [ in] 
 * @param [out] 链表
 * @return      
 */
linklist free_space(linklist L)
{
    if(L==NULL)
    {
        return NULL;
    }
    //释放
    int n=L->len;
    for(int i=0;i<n;i++)
    {
        delete_head(L);
    }
    free(L);
    L=NULL;
    return L;
}
ubun

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值