1.24作业

作业要求:单链表按任意元素查找,单链表按任意元素修改,单链表按任意元素删除,单链表排序,单链表释放内存。

程序代码:

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

enum{FALSE=-1,SUCCESS};

typedef int datatype;

//定义节点结构体,节点:数据域 指针域
typedef struct Node
{
	//数据域:存储数据元素
	datatype  data;
	//指针域:存储下一个节点的地址
	struct Node *next;
}*Linklist;
Linklist create();
Linklist insert_head(Linklist head ,datatype element);
void output(Linklist head);
Linklist insert_rear(Linklist head ,datatype element);
Linklist delete_head(Linklist head);
Linklist delete_rear(Linklist head);
Linklist insert_pos(Linklist head,int pos,datatype element);
Linklist delete_pos(Linklist head,int pos);
void find_pos(Linklist head,int pos);
void change_pos(Linklist head,int pos,datatype element);    
Linklist rev(Linklist head);
void find_npos(Linklist head,int pos);
void bubble(Linklist head);
int find_element(Linklist head,datatype key);
void change_element(Linklist head,datatype key,datatype element);
int delete_element(Linklist head,datatype key);
#endif

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	Linklist head=NULL;//定义单链表的头指针
	int n;
	datatype element;//插入的值
	printf("please input n:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("please input %d element:",i+1);
		scanf("%d",&element);
	//	head=insert_head(head,element);//头插
		head=insert_rear(head,element);//尾插
	}

	//单向链表遍历
	output(head);

	//单链表头删
	head=delete_head(head);
	output(head);


	//单链表尾删
	head=delete_rear(head);
	output(head);

	//单链表按任意位置插入
	int pos;
	printf("please input insert pos:");
	scanf("%d",&pos);
	printf("please input insert element:");
	scanf("%d",&element);
	head=insert_pos(head,pos,element);
	output(head);


	//单链表按任意位置删除
	printf("please input delete pos:");
	scanf("%d",&pos);
	head=delete_pos(head,pos);
	output(head);


	//单链表按任意位置查找
	printf("please input find pos:");
	scanf("%d",&pos);
	find_pos(head,pos);


	//单链表按任意位置修改
	printf("please input change pos:");
	scanf("%d",&pos);
	printf("please input change element:");
	scanf("%d",&element);
	change_pos(head,pos,element);
	output(head);



//单链表按任意元素查找

	datatype key;
	printf("please input key:");
	scanf("%d",&key);
	pos=find_element(head,key);
	printf("%d\n",pos);



//单链表按任意元素修改

	printf("please input which you want change:");
	scanf("%d",&key);
	printf("please input change element:");
	scanf("%d",&element);
	change_element(head,key,element);
	output(head);



//单链表按任意元素删除

	printf("please input which you want delete:");
	scanf("%d",&key);
	delete_element(head,key);
	output(head);

//单链表逆值

	head=rev(head);
	output(head);


//单链表查找倒数第n个

	printf("please input npos:");
	scanf("%d",&pos);
	find_npos(head,pos);


//单链表排序

	bubble(head);
	output(head);
	
//空间释放

	head=free_speace(head);

	return 0;

}

test.c

#include "head.h"
//堆区申请空间
Linklist create()
{
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	if(NULL==s)
		return NULL;
	//成功初始化
	s->data=0;
	s->next=NULL;
	return s;
}
//头插
Linklist insert_head(Linklist head ,datatype element)
{
	//创建节点s
	Linklist s=create();
	s->data=element;
	//判断链表是否为空
	if(NULL==head)
	{
		head=s;
	}
	else
	{
		s->next=head;
		head=s;
	}
	return head;
}
//尾插
Linklist insert_rear(Linklist head ,datatype element)
{
	//创建节点s
	Linklist s=create();
	s->data=element;
	//判断链表是否为空
	if(NULL==head)
	{
		head=s;
	}
	else//存在多个节点
	{
		Linklist p=head;
		while(p->next!=NULL)
		{
			p=p->next;
		}
		p->next=s;
	}
	return head;
}

//单向链表遍历
void output(Linklist head)
{
	Linklist p=head;
	if(NULL==head)
	{
		puts("empty");
		return;
	}
	while(p!=NULL)
	{
		printf("%-5d",p->data);
		p=p->next;
	}
	puts("");
}
//单链表头删
Linklist delete_head(Linklist head)
{
	if(NULL==head)
		return head;
	else
	{
		Linklist del=head;
		head=head->next;
		free(del);
		return head;
	}
}
//单链表尾删
Linklist delete_rear(Linklist head)
{
	if(NULL==head)
		return head;
	else if(NULL==head->next)
	{
		free(head);
		head=NULL;
		return head;
	}
	else
	{
		Linklist del=head;
		while(del->next->next!=NULL)
		{
			del=del->next;
		}
		free(del->next);
		del->next=NULL;
		return head;
	}
}
//对于链表长度的计算
int length(Linklist head)
{
	int len=0;
	Linklist p=head;
	while(p)
	{
		p=p->next;
		len++;
	}
	return len;
}
//单链表按任意位置插入
Linklist insert_pos(Linklist head,int pos,datatype element)
{
	if(pos<1||pos>length(head)+1)
	{
		puts("pos error");
		return head;
	}
	Linklist s=create();
	s->data=element;
	if(pos==1)
	{
		head=insert_head(head,element);
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	s->next=p->next;
	p->next=s;
	return head;
}
//单链表按任意位置删除
Linklist delete_pos(Linklist head,int pos)
{
	if(pos<1||pos>length(head)||NULL==head)
	{
		puts("pos error");
		return head;
	}
	if(pos==1)
	{
		head=delete_head(head);
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}
	Linklist del=p->next;
	p->next=del->next;
	free(del);
	del=NULL;
	return head;
}

//单链表按任意位置查找
void find_pos(Linklist head,int pos)
{
	if(pos<1||pos>length(head)||NULL==head)
	{
		puts("pos error");
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	printf("%d\n",p->data);
}



//单链表按任意位置修改
void change_pos(Linklist head,int pos,datatype element)
{
	if(pos<1||pos>length(head)||NULL==head)
	{
		puts("pos error");
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	p->data=element;
}



//单链表按任意元素查找
int find_element(Linklist head,datatype key)
{
	if(NULL==head)
	{
		puts("error");
	}
	Linklist p=head;
	int count=0;
	for(int i=0;i<length(head);i++)
	{
		count++;
		if(p->data==key)
		{
			return count;
		}
		p=p->next;
	}
	return FALSE;
}



//单链表按任意元素修改
void change_element(Linklist head,datatype key,datatype element)
{
	if(NULL==head)
	{
		puts("error");
	}
	Linklist p=head;
	for(int i=0;i<length(head);i++)
	{
		if(p->data==key)
		{
			p->data=element;
		}
		p=p->next;
	}
}


//单链表按任意元素删除

int delete_element(Linklist head,datatype key)
{
	if(NULL==head)
		return FALSE;
	int a=find_element(head,key);
	if(a==FALSE)
		return FALSE;
	else
	{
		delete_pos(head,a);
		return SUCCESS;
	}
}


//空间释放
Linklist free_speace(Linklist head)
{
	if(NULL==head)
		return head;
	Linklist p=head;
	while(p!=NULL)
	{
		p=delete_head(p);
	}
	head=NULL;
	return head;
}

//单链表逆值
Linklist rev(Linklist head)
{
	if(NULL==head)
		return head;
	Linklist p=head->next;
	head->next=NULL;
	while(p)
	{
		Linklist t=p;
		p=p->next;
		t->next=head;
		head=t;
	}
	return head;
}

//单链表查找倒数第n个
void find_npos(Linklist head,int pos)
{
	if(pos<1||pos>length(head)||NULL==head)
		return;
	Linklist p=head,q=head;
	for(int i=0;i<pos;i++)
	{
		p=p->next;
	}
	while(p)
	{
		p=p->next;
		q=q->next;
	}
	printf("%d\n",q->data);
}


//单链表排序
void bubble(Linklist head)
{
	if(NULL==head)
		return;
//	int len=length(head);
	for(int i=1;i<length(head);i++)
	{
		Linklist p=head;
		for(int j=0;j<length(head)-i;j++)
		{
			if(p->data>p->next->data)
			{
				int t=p->data;
				p->data=p->next->data;
				p->next->data=t;
			}
			p=p->next;
		}
	}
}

单链表按任意元素查找运行结果:

单链表按任意元素修改运行结果:

单链表按任意元素删除运行结果:

单链表排序运行结果:

课程总结:

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Super TreeView 1.24是一个强大的、高度可定制的树状视图控件。它是基于TreeView控件的扩展,提供了更多的功能和样式选择。 Super TreeView 1.24具有以下主要特点: 1. 多级树状结构:Super TreeView 1.24支持多级的树状结构,可以轻松创建具有父子关系的节点。这使得它成为展示复杂数据结构的理想选择。 2. 数据绑定:它可以与各种数据源进行绑定,包括数据库、XML文件等。通过数据绑定,我们可以轻松地将数据呈现为树状结构,而无需手动创建和管理节点。 3. 界面样式定制:Super TreeView 1.24提供了丰富的样式选择,允许用户自定义节点的外观和样式。我们可以更改节点的背景颜色、字体、图标等,以实现各种不同的视觉效果。 4. 交互功能:它支持各种交互操作,例如展开/折叠节点、选中节点、拖放节点等。这些功能使得用户能够轻松地与树状结构进行交互,并对树的状态进行操作。 5. 编辑功能:Super TreeView 1.24还具有编辑功能,允许用户在树状结构中直接编辑节点的文本内容。这对于需要在运行时动态更新节点的应用程序非常有用。 总之,Super TreeView 1.24是一个功能强大且高度可定制的树状视图控件。它提供了多种功能和样式选择,使用户能够轻松地创建、管理和操作树形数据结构。无论是在桌面应用程序还是Web应用程序中,Super TreeView 1.24都是一个强大而实用的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值