数据结构5.17

main.c文件

#include"head1.h"
int main(int argc, const char *argv[])
{

	//创建头节点
	linklist L=create(0);//0 头结点 ;1 普通节点

	menu();
	int member;
	while(1)
	{
		printf("\n请输入你的选择:");
		scanf("%d",&member);
		switch(member)
		{
		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:
			{
				printf("%d\r\n",L->len);
				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,e;
				printf("请输入插入的位置和数值:");
	  			scanf("%d %d",&pos,&e);
				insert_pos(L,pos,e);
			}break;
		case 7:
			{
				int pos;
				printf("请输入删除的位置\n");
				scanf("%d",&pos);
			    delete_pos(L,pos);
			}break;
		case 8:
			{
				int pos;
				datatype e;
				printf("请输入修改的位置和值:");
				scanf("%d %d",&pos,&e);
				update_pos(L,pos,e);
			}break;
		case 9:
			{
				int pos;
				printf("请输入你要查找的位置:");
				scanf("%d",&pos);
				find_pos(L,pos);
			}break;
	
		case 10:
				{
					int key;
					printf("请输入您要查找的元素:");
					scanf("%d",&key);
					int count=find_data(L,key);
					printf("数值 %d 在第 %d 个结点\n",key,count);
				}break;
		case 11:
				{
					int e;
					printf("请输入要删除的值:");
					scanf("%d",&e);
					delete_data(L,e);
				}break;
		case 12:
				{
					datatype key,e;
					printf("请输入要修改的值和结果:");
					scanf("%d %d",&key,&e);
					updata_data(L,key,e);
				
				}break;
		case 13:
				{
					datatype key,e;
					printf("请输入选定的值和要插入的值:");
					scanf("%d %d",&key,&e);
					insert_data(L,key,e);
				
				}break;
defaault:
				{
					printf("\n您的输入还没有创建");
				}break;
	
		case 15:
				{
					linklist_rev(L);
				}break;
		case 16:
				L=free_space(L);break;
		case 0:printf("程序结束\n");exit(0);
		}
	}

	return 0;
}

2.test.c文件

#include"head1.h"

void menu()
{
	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("\t15,单项链表逆置");
	puts("\t16,单项链表空间释放");
	puts("\t0,程序结束");




	puts("*******************");
}

//创建头节点
linklist create(int flag)
{
	linklist L=(linklist)malloc(sizeof(struct Node));
	if(L==NULL)
	{
		return NULL;
	}
	//创建成功
	if(flag==0)
	{
		L->len=0;
	}
	else if(flag==1)
		L->data=0;

	L->next=NULL;
	return L;
}

//1.头部插入
int insert_head(linklist L,datatype e)
{
	if(L==NULL)
	{
		printf("头部插入失败\n");
		return -1;
	}
	//创建新节点s
	linklist s=create(1);
	if(s==NULL)
		return -1;
	//创建新节点s成功
	s->next=L->next;
	L->next=s;
	s->data=e;
	L->len++;
	return 0;
}

//2.遍历
void  output(linklist L)
{
	if(L==NULL||L->len==0)
	{
		printf("遍历失败!");
	}
	linklist k=L;
	while(k->next!=NULL)
	{
		k=k->next;
		printf("%d\t",k->data);
	}
}

//3.尾部插入
int  insert_rear(linklist L,datatype e)
{
	if(L==NULL)
	{
		printf("尾部插入失败!\n");
		return -1;
	}
	//找尾部
	linklist k=L;
	while(k->next!=NULL)
	{
		k=k->next;	
	}
	//创建尾部插入节点
	linklist s=create(1); 
	if(s=NULL)
		return -1;
	s->data=e;
	//链接s
	k->next=s;
	L->len++;
	return 0;
}

void delete_head(linklist L)
{
	if(L==NULL||L->len==0)
		printf("不能头删\n");
	//可以头删
	linklist q=L->next;
	L->next=q->next;
	free(q);
	q=NULL;
	L->len--;
}

//5.尾部删除
int  delete_rear(linklist L)
{
	if(L==NULL)
	{
		printf("尾部删除失败!\n");
		return -1;
	}
	//找尾部前一位
	linklist k=L;
	while(k->next->next!=NULL)
	{
		k=k->next;	
	}
	//
	free(k->next);
	k->next=NULL;
	L->len--;

	return 0;
}

//6.按照位置插入
int insert_pos(linklist L,int pos,int e)
{
	if(L==NULL||pos<1||pos>L->len+1)
	{
		printf("插入失败!\n");
		return -1;
	}
	//找寻位置
	linklist k=L;
	for(int i=0;i<pos-1;i++)
	{
		k=k->next;
	}
	//创建节点
	linklist s=create(1);
	if(s==NULL)
		return -1;
	//创建成功
	s->data=e;
	s->next=k->next;
	k->next=s;
	L->len++;
	printf("按照位置插入成功\n");
	return 0;

}

//7.按照位置删除
int delete_pos(linklist L,int pos)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len)
	{
		printf("按照位置删除失败\n");
		return -1;
	}
	//可以删除
	//找寻位置
	linklist k=L;
	for(int i=0;i<pos-1;i++)
	{
		k=k->next;
	}
	linklist m=k->next;
	k->next=m->next;
	free(m);
	m=NULL;
	L->len--;
	printf("按照位置删除成功\n");
	return 0;
}

//8.按照位置修改
int update_pos(linklist L,int pos,datatype e)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len)
	{
		printf("按照位置修改失败\n");
		return -1;
	}
	//找寻位置
	linklist k=L;
	for(int i=0;i<pos;i++)
	{
		k=k->next;
	}
	//找到位置
	k->data=e;
	printf("按照位置修改成功\n");
	return 0;
}

//9.按照位置查找
int find_pos(linklist L,int pos)
{
	if(L==NULL||L->len==0||pos<1||pos>L->len)
	{
		printf("按照位置查找失败\n");
		return -1;
	}
	//找寻位置
	linklist k=L;
	for(int i=0;i<pos;i++)
	{
		k=k->next;
	}
	//找到位置
	printf("位置%d所存的值是%d\n",pos,k->data);
	return 0;
}


//10.按照元素查找
int find_data(linklist L,int key)
{
	if(L==NULL||L->len==0)
	{
		printf("查找失败!\n");
		return -1;
	}
	//可以查找
	//循环比较
	linklist k=L;
	int count=0;
	while(k->next!=NULL)
	{
		k=k->next;
		count++;
		if(k->data==key)
		{
			return count;
		}
	}
	return -1;
}

//11.按照元素删除
void delete_data(linklist L,int e)
{
	//1.找到元素位置
	int count =find_data(L,e);
	//2.按照位置删除
	delete_pos(L,count);
	printf("值 %d 删除成功",e);
}

//12.按照数值修改
void updata_data(linklist L,datatype key,datatype e)
{

	//1.找到元素位置
	int count =find_data(L,key);
	//2.修改数值
	update_pos(L,count,e);
}


//13.按照数值插入
void insert_data(linklist L,datatype key,datatype e)
{

	//1.找到元素位置
	int count =find_data(L,key);
	//2.插入数值
	insert_pos(L,count,e);
}




//逆置
void linklist_rev(linklist L)
{
	if(L==NULL||L->next==NULL)
		printf("逆置失败!\n");
	//头结点和普通节点分开
	linklist p=L->next;
	L->next=NULL;
	//开始逆置
	while(p!=NULL)
	{
		linklist t=p;
		p=p->next;
		t->next=L->next;
		L->next=t;
	}
	printf("逆置成功!\n");
}

//空间释放
linklist free_space(linklist L)
{
	if(L==NULL)
	{
		printf("空间释放失败!\n");
		return NULL;
	}
	int n=L->len;
	for(int i=0;i<n;i++)
	{
		delete_head(L);
	}
	free(L);
	L=NULL;
	printf("空间释放成功\n");
	return L;

}







3.head.h文件


#ifndef NNN
#define NNN

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

typedef int datatype;

typedef struct Node
{
	//数据域
	union
	{
		int len;//头结点数据域 链表长度
		int data;//其他节点的数据域 数据元素
	};
	//指针域:下一个节点地址
	struct Node *next;
}*linklist;


linklist create(int flag);
void menu();
int insert_head(linklist L,datatype e);
void  output(linklist L);
int  insert_rear(linklist L,datatype e);
void delete_head(linklist L);
int  delete_rear(linklist L);

//按照位置
int insert_pos(linklist L,int pos,int e);
int delete_pos(linklist L,int pos);
int update_pos(linklist L,int pos,datatype e);
int find_pos(linklist L,int pos);




//按照数值
int find_data(linklist L,int key);
void delete_data(linklist L,int e);
void updata_data(linklist L,datatype key,datatype e);
void insert_data(linklist L,datatype key,datatype e);





//逆置 释放
void linklist_rev(linklist L);
linklist free_space(linklist L);







#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值