当前位置: 首页 > news >正文

算法设计学习5

实验目的及要求:
目标是使学生学会分析数据对象的特点,掌握数据组织的方法和在计算机中的存储方式,能够对具体问题中所涉及的数据选择合适的逻辑结构、存储结构,进而在此基础上,对各种具体操作设计高效的算法,培养良好的程序设计技能。

实验设备环境:
1.微型计算机
2.DEV C++(或其他编译软件)

实验步骤:
任务一:
设头指针为 head,并设带头结点单链表中的元素递增有序,编写算法,将元素 x 插入带头结点单链表的适当位置上。要求: 插入后保持单链表元素的递增有序。 
[算法思想] 从单链表的第一个元素结点开始,将元素 x 与每个结点的 data 域逐个进行比较。当 data 域的值小于等于元素 x 的值时,进行下一个结点的比较;否则就找到了插入结点的合适位置,此时申请新结点把元素 存入 data 域,然后把新结点插入; 如果比较到最后一个结点,仍有 data 域的值小于等于元素 x 的值,则把新结点插入单链表尾。
代码如下:

#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"LinList.h"
void LinListInsert(SLNode *head,DataType x){
	SLNode *curr,*pre,*q;
	curr=head->next;
	pre=head;
	while(curr!=NULL&&curr->data<=x){
		pre=curr;
		curr=curr->next;
	} 
	q=(SLNode*)malloc(sizeof(SLNode));
	q->data=x;
	q->next=pre->next;
	pre->next=q; 
}
int main(void){
    SLNode *head;
    int i,x,a;
    ListInitiate(&head);//初始化 
    printf("请输入递增有序的元素:\n");
    for(i=0;i<10;i++){//插入元素 
        scanf("%d",&a);
        ListInsert(head,i,a);
    }
    printf("请输入要插入的元素:\n");
    scanf("%d",&x);
    
    LinListInsert(head,x);
    
    printf("插入后的链表元素:\n");
    for(i=0;i<ListLength(head);i++){
        ListGet(head,i,&x);
        printf("%d   ",x);
    }
    Destroy(&head);
}
头文件:

typedef struct Node{
	DataType data;
	struct Node *next;
}SLNode;
void ListInitiate(SLNode**head){
	*head=(SLNode *)malloc(sizeof(SLNode));
	(*head)->next=NULL;
}
int ListLength(SLNode *head){
	SLNode *p=head;
	int size=0;
	while(p->next!=NULL){
		p=p->next;
		size++;
	}
	return size;
}
int ListInsert(SLNode *head,int i,DataType x){
	SLNode *p,*q;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("插入元素位置参数错!");
		return 0;
	}
	q=(SLNode *)malloc(sizeof(SLNode));
	q->data=x;
	q->next=p->next;
	p->next=q;
	return 1;
}
int ListDelete(SLNode *head,int i,DataType *x){
	SLNode *p,*s;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&p->next->next!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("删除元素位置参数错!");
		return 0;
	}
	s=p->next;
	*x=s->data;
	p->next=p->next->next;
	free(s);
	return 1;
}
int ListGet(SLNode *head,int i,DataType *x){
	SLNode *p;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&j<i){
		p=p->next;
		j++;
	}
	if(j!=i){
		printf("取出元素位置参数错!");
		return 0;
	}
	*x=p->data;
	return 1;
}
void Destroy(SLNode **head){
	SLNode *p,*p1;
	p=*head;
	while(p!=NULL){
		p1=p;
		p=p->next;
		free(p1);
	}
	*head=NULL;
}

任务二:
设 head 为单链表的头指针,并设单链表带有头结点,编写算法,将单链表中的元素按照元素的值递增有序地进行就地排序。[说明] 就地排序是指在不增加新结点的基础上,通过修改原有单链表的指针域来达到排序的目的。
[算法思想] 在例 2-6 算法的基础上再增加一重循环,即可实现全部元素的排序。因为此时的排序过程没有申请新的结点空间,所以这样的排序算法满足就地排序,即不增加新的内存空间的设计要求。
具体实现过程是: 把头指针 head 所指单链表置空(即初始时 head 所指单链表仅包含一个头结点), 把去掉头结点的原单链表(设由指针 p 指示)中的元素逐个重新插入 head 所指单链表中每次插入都从 head 所指单链表的第一个元素结点开始,逐个比较 head 所指单链表每个结点的 data 域和 p 所指单链表的当前第一个元素结点的 data 域,当前者小于或等于后者时,用 head 所指单链表的下一个结点进行比较;否则就找到了插入结点的合适位置,从 p 所指单链表中取下当前第一个元素结点插入 head 所指单链表的合适位置。这样的过程一直进行到 p 所指单链表为空时结束
代码如下:

#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"LinList.h"
void LinListSort(SLNode *head){
	SLNode *curr,*pre,*p,*q;
	p=head->next;
	head->next=NULL;
	while(p!=NULL){
		curr=head->next;
		pre=head;
		while(curr!=NULL&&curr->data<=p->data){
			pre=curr;
			curr=curr->next;
		}
		q=p;
		p=p->next;
		q->next=pre->next;
		pre->next=q; 
	} 
}
int main(void){
    SLNode *head;
    int i,x,a;
    ListInitiate(&head);
    printf("请输入链表中的元素:\n");
    for(i=0;i<10;i++){
        scanf("%d",&a);
        ListInsert(head,i,a);
    }
    
    LinListSort(head);
    
    printf("排序后链表中的元素:\n");
    for(i=0;i<ListLength(head);i++){
        ListGet(head,i,&x);
        printf("%d   ",x);
    }
    Destroy(&head);
}
头文件:

typedef struct Node{
	DataType data;
	struct Node *next;
}SLNode;
void ListInitiate(SLNode**head){
	*head=(SLNode *)malloc(sizeof(SLNode));
	(*head)->next=NULL;
}
int ListLength(SLNode *head){
	SLNode *p=head;
	int size=0;
	while(p->next!=NULL){
		p=p->next;
		size++;
	}
	return size;
}
int ListInsert(SLNode *head,int i,DataType x){
	SLNode *p,*q;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("插入元素位置参数错!");
		return 0;
	}
	q=(SLNode *)malloc(sizeof(SLNode));
	q->data=x;
	q->next=p->next;
	p->next=q;
	return 1;
}
int ListDelete(SLNode *head,int i,DataType *x){
	SLNode *p,*s;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&p->next->next!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("删除元素位置参数错!");
		return 0;
	}
	s=p->next;
	*x=s->data;
	p->next=p->next->next;
	free(s);
	return 1;
}
int ListGet(SLNode *head,int i,DataType *x){
	SLNode *p;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&j<i){
		p=p->next;
		j++;
	}
	if(j!=i){
		printf("取出元素位置参数错!");
		return 0;
	}
	*x=p->data;
	return 1;
}
void Destroy(SLNode **head){
	SLNode *p,*p1;
	p=*head;
	while(p!=NULL){
		p1=p;
		p=p->next;
		free(p1);
	}
	*head=NULL;
}

http://www.dtcms.com/a/107388.html

相关文章:

  • 【Windows+Cursor】从0到1配置Arxiv MCP Server,实现论文自主查询、下载、分析、综述生成
  • 从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.1LangChain与Dify平台实战:从RAG到Agent工作流
  • 基于Python的医院信息管理系统的设计与实现
  • 【C#实战】动态模板替换:根据Model字段名称自动匹配替换值【代码之美】
  • 货代业务数字化管理:易境通货代系统在转型中的应用
  • 7.3 分治-快排:LeetCode 215.数组中的第K个最大元素
  • CompletableFuture 与反应式编程:异步编程的两种范式对比与实战
  • 简化Rust开发:探索lombok-macros crate
  • 01-性能测试
  • 【NLP 52、多模态相关知识】
  • Redis的Lua脚本
  • Docker 安装 Elasticsearch 教程
  • 人工智能之数学基础:基于吉文斯变换完成矩阵的QR分解
  • leetcode-热题100(3)
  • 【Triton 教程】triton_language.arange
  • 【C++】vector的模拟实现
  • 【AI插件开发】Notepad++ AI插件开发实践(代码篇):从Dock窗口集成到功能菜单实现
  • C++动态库对外接口通过接口方式实现
  • 二维码扫不出?用QR Research工具
  • LangChain接入azureopenai步骤(2025年初)
  • ctfshow
  • Android 10.0 通过广播控制systemui状态栏动态显示和隐藏功能实现
  • docker的文件系统Overlay2
  • 【自学笔记】jQuery语言基础知识点总览-持续更新
  • 《UNIX网络编程卷1:套接字联网API》第5章 TCP客户服务器程序示例
  • 洛谷题单3-P1980 [NOIP 2013 普及组] 计数问题-python-流程图重构
  • 【力扣hot100题】(034)LRU缓存
  • 红帽Linux怎么重置密码
  • 【测试】每日3道面试题 4/1,4/2
  • 架构设计基础系列:事件溯源模式浅析