算法设计学习4

实验目的及要求:

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

实验设备环境:

1.微型计算机

2.DEV C++(或其他的编译软件)

实验步骤:

任务一:

编程实现如下任务: 建立一个线性表,首先依次输入元素 1,2,3,...,10,然后删除元素 5,最后依次显示当前线性表中的元素。假设该线性表的元素个数在最坏情况下不会超过 100 个。要求使用顺序表。

程序参数设计 因为该线性表元素在最坏情况下不会超过 100 个,所以定义顺序表的 MaxSize 为 100;因为该设计任务元素的数据类型为 int 类型,所以定义顺序表的 DataType 为 int 该任务要求的插入、删除、取元素等操作可通过调用顺序表的插入、删除、取元素等函数来实现。

代码如下:

cpp 复制代码
#include<stdio.h>
#define MaxSize 100
typedef int DataType;
#include"SeqList.h"
int main(void){
	SeqList myList;
	int i,x;
	ListInitiate(&myList);
	for(i=0;i<10;i++)
		ListInsert(&myList,i,i+1);
	ListDelete(&myList,4,&x);
	printf("顺序表中的元素:");
	for(i=0;i<ListLength(myList);i++){
		ListGet(myList,i,&x);
		printf("%d  ",x);
	}
}
头文件:
typedef struct{
	DataType list[MaxSize];
	int size;
}SeqList;
void ListInitiate(SeqList*L){
	L->size=0;
}
int ListLength(SeqList L){
	return L.size;
}
int ListInsert(SeqList *L,int i,DataType x){
	int j;
	if(L->size>=MaxSize){
		printf("顺序表已满无法插入!\n");
		return 0;
	}else if(i<0||i>L->size){
		printf("参数i不合法!\n");
		return 0;
	}else{
		for(j=L->size;j>i;j--)
			L->list[j]=L->list[j-1];
		L->list[i]=x;
		L->size++;
		return 1;
	}
}
int ListDelete(SeqList*L,int i,DataType*x){
	int j;
	if(L->size<=0){
		printf("顺序表已空无元素可删!\n");
		return 0;
	}else if(i<0||i>L->size-1){
		printf("参数i不合法!\n");
		return 0;
	}else{
		*x=L->list[i];
		for(j=i+1;j<=L->size-1;j++)
			L->list[j-1]=L->list[j];
		L->size--;
		return 1;
	}
}
int ListGet(SeqList L,int i,DataType *x){
	if(i<0||i>L.size-1){
		printf("参数i不合法!\n");
		return 0;	
	} else{
		*x=L.list[i];
		return 1;
	}
}

任务二:

编程实现如下任务: 建立一个如表 2-1 所示的学生信息表,要求先依次输入元素,然后依次显示当前表中的元素。假设该表元素个数在最坏情况下不会超过100个。要求使用顺序表。

程序参数设计 因为该表元素个数在最坏情况下不会超过100个,所以定义顺序表的MaxSize为100;该设计任务要处理的元素为学生信息,从表2-1可知,每个学生信息元素包括学号、姓名、性别和年龄4个数据项。

代码如下:

cpp 复制代码
#include<stdio.h>
#define MaxSize 100
typedef struct Student{
	long number;
	char name[10];
	char sex[3];
	int age;
}StudentType;
typedef StudentType DataType;
#include"SeqList.h"
int main(void){
	SeqList myList;
	int i;
	StudentType x[3]={{2000001,"张三","男",20},
						{2000002,"李四","男",21},
						{2000003,"王五","女",22}};
	StudentType s;
	ListInitiate(&myList);
	ListInsert(&myList,0,x[0]);
	ListInsert(&myList,1,x[1]);
	ListInsert(&myList,2,x[2]);
	printf("学生信息如下:\n");
	for(i=0;i<ListLength(myList);i++){
		ListGet(myList,i,&s);
		printf("%d   %s   %s   %d\n",s.number,s.name,s.sex,s.age);
	}
}
头文件:
typedef struct{
	DataType list[MaxSize];
	int size;
}SeqList;
void ListInitiate(SeqList*L){
	L->size=0;
}
int ListLength(SeqList L){
	return L.size;
}
int ListInsert(SeqList *L,int i,DataType x){
	int j;
	if(L->size>=MaxSize){
		printf("顺序表已满无法插入!\n");
		return 0;
	}else if(i<0||i>L->size){
		printf("参数i不合法!\n");
		return 0;
	}else{
		for(j=L->size;j>i;j--)
			L->list[j]=L->list[j-1];
		L->list[i]=x;
		L->size++;
		return 1;
	}
}
int ListDelete(SeqList*L,int i,DataType*x){
	int j;
	if(L->size<=0){
		printf("顺序表已空无元素可删!\n");
		return 0;
	}else if(i<0||i>L->size-1){
		printf("参数i不合法!\n");
		return 0;
	}else{
		*x=L->list[i];
		for(j=i+1;j<=L->size-1;j++)
			L->list[j-1]=L->list[j];
		L->size--;
		return 1;
	}
}
int ListGet(SeqList L,int i,DataType *x){
	if(i<0||i>L.size-1){
		printf("参数i不合法!\n");
		return 0;	
	} else{
		*x=L.list[i];
		return 1;
	}
}

任务三:

编程实现和例 2-1 相同的务,即建立一个线性表,首先依次输入元素 1,2.3,......,10,然后删除元素 5,最后依次显示当前表中的元素。要求使用单链表。

程序参数设计 因为该设计任务中元素的数据类型为 int 类型,所以定义单链表的DataType 为 int。单链表的插入、删除、取元素等操作均可通过调用单链表的插入、删除、取元素等操作来实现。

代码如下:

cpp 复制代码
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"LinList.h"
int main(void){
    SLNode *head;
    int i,x;
    ListInitiate(&head);
    for(i=0;i<10;i++){
        ListInsert(head,i,i+1);
    }
    ListDelete(head,4,&x);
    printf("链表中的元素:");
    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;
}
相关推荐
yyds_yyd_100864 小时前
3731. 找出缺失的元素(2026.08.04)
c++·leetcode
min(a,b)4 小时前
学习第10天:日志、测试、配置与容器化部署
学习
xqqxqxxq4 小时前
AI Agent学习:用户记忆系统(李博杰《深入理解 AI Agent》3.1观后总结)
人工智能·学习
wangyue_msn_864 小时前
Agent知识学习笔记——01 Prompt/Function call/记忆/上下文
笔记·学习·prompt
呱呱巨基4 小时前
CMake基础
linux·c++·笔记·学习
min(a,b)4 小时前
AI 每日学习 — RAG 效果评估体系设计与实现
学习
智闲电子设计5 小时前
STM32 定时器 PWM 实战:从呼吸灯到舵机控制
c语言·stm32·单片机·嵌入式硬件·学习
世人万千丶12 小时前
鸿蒙日志体系高级应用:HiLog分级输出/隐私脱敏/远程日志采集/线上问题精准溯源方案
学习·harmonyos·鸿蒙
ctlover15 小时前
Python学习第 5 日
学习
六点_dn16 小时前
RabbitMQ学习笔记-部署和使用
笔记·学习·rabbitmq