数据结构实验1

该博客涵盖了数据结构实验的内容,包括单链表的插入和删除操作,约瑟夫环问题的解决,二进制与十进制的转换,表达式的求值,判断回文序列的算法,猴子分桃问题的编程实现,字符串子串替换的方法,以及矩阵求和的计算。通过这些实例,深入理解数据结构的基本操作和算法应用。
摘要由CSDN通过智能技术生成

1.1 单链表插入删除
//建立一个存储A,B... 26个大写英文字母的线性链表,插入或删除字母使其位于适当位置 
#define OK 1
#define NULL 0
#define OVERFLOW -2
#include<malloc.h> 
#include<process.h>  //exit()
#include<stdio.h>
typedef char ElemType;
typedef int Status;
typedef struct LNode {
	ElemType data;
	struct LNode *next;
}LNode,*LinkList; 
 
LinkList CreateList(LinkList L)
{ //建立一个存储A,B... 26个大写英文字母的线性链表L
	LinkList p,r;
	char i;
	L=(LinkList)malloc(sizeof(LNode));
	if(!L) //存储分配失败
     exit(OVERFLOW);
	r=L;
	for(i='A';i<='Z';i++)
	{//存储初始数据元素为大写字母A到Z 
		p=(LNode*)malloc(sizeof(LNode));
		p->data=i;
		r->next=p;
		r=p;
	}
	r->next=NULL;
	return L;
}
LinkList ListInsert(LinkList L,ElemType e) 
{ //将元素e插入到单链表的适当位置上,以保持该表的有序性 
    int j=0;
    LinkList p=L->next,s;
	while(p&&j<26)
	{
		if(e>p->data) // 寻找适当的插入位置 
		{
		    p=p->next;
		}
		else break;
		j++;	     
	}
    s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
    s->data=e; 
    s->next=p->next; //插入L中 
    p->next=s;
    return L;
}
LinkList ListDelete(LinkList L,ElemType e) 
{ //在单链线性表L中,删除元素e
	int j=0;
	LinkList p=L->next,q=L,r;
    while(p&&j<26)
	{
		if(e!=p->data) //找到第一个与e相同的元素 
		{
			q=p;
		    p=p->next;
		}
		else break;
		j++;	     
	}
	r=p;
    q->next=p->next;
    free(r); //释放结点 
    return L;
}
void visit(ElemType c)
{
	printf("%c ",c);
}
Status ListTraverse(LinkList L,void(*vi)(ElemType))
{ //遍历链表中元素 
   LinkList p=L->next;
   while(p)
   {
     vi(p->data);
     p=p->next;
   }
   printf("\n");
   return OK;
}
int main()
{
	LinkList L,L1,L2,L3;
	ElemType e1,e2;
	L1=CreateList(L);
	printf("初始单链表数据为:\n") ;
	ListTraverse(L1,visit);
	printf("\n"); 
	printf("请输入要插入的大写英文字母:");
	scanf("%c",&e1);
	printf("插入字母%c后单链表为:\n",e1);
	if(e1<'A'||e1>'Z')
	{
	 	printf("输入错误");
	}
	else{
		L2=ListInsert(L1,e1);
		ListTraverse(L2,visit);
	}
	printf("\n"); 
	printf("请输入要删除的大写英文字母:");
	fflush(stdin); 
	scanf("%c",&e2);
	printf("删除字母%c后单链表为:\n",e2);
	if(e2<'A'||e2>'Z')
	{
	 	printf("输入错误");
	}
	else{
		L3=ListDelete(L2,e2);
		ListTraverse(L3,visit);
	}
	return OK;
}
1.2 约瑟夫环
//约瑟夫环(循环链表) 
#define NULL 0
#define OVERFLOW -2 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct LNode{
	int num; //每个人的编号 
	int data; //密码 
	struct LNode *next;
}LinkList;
LinkList *create(int n)
{ //建立单向循环链表 
	printf("请输入人数n:");
	scanf("%d",&n);
    printf("请分别输入这%d个人的密码:\n",n);
    int i=1;
    LinkList *L,*p,*q;
    L=NULL;
    p=(LinkList*)malloc(sizeof(LinkList));
    if(!p) //存储分配失败
     exit(OVERFLOW);
    p->num=1;
    scanf("%d",&p->data);
    L=p;
    for(i=2;i<=n;i++)
    {
    	q=(LinkList*)malloc(sizeof(LinkList));
    	if(!p) 
     		exit(OVERFLOW);
    	q->num=i;
    	scanf("%d",&q->data);
    	p->next=q;
    	p=q;
	}
	p->next=L; //指针域指向头结点
    return L;
}
void func(LinkList *L,int m)
{
	printf("请输入m的初值:");
	scanf("%d",&m);
	printf("依次出列的人的编号为:");
	int i,j;
	LinkList *p,*q,*s;
	p=L;
	while(p->next!=p) //直到只剩下最后一个结点 
	{
		for(j=1;j<m;j++)
		{
			q=p;
			p=p->next;
		}
		printf("%d",p->num); //输出出列的人的编号  
		m=p->data; //出列的人的密码作为新的m值 
		s=p;
		q->next=p->next; //删除出列的人的结点
		p=p->next;
		free(s);  //释放该结点 
	}
	printf("%d",p->num); //输出最后一个结点的人的编号 
	printf("\n");
}
int main()
{
	LinkList *L;
	int m,n;
	L=create(n);
	func(L,m);
	return 0;
}

2.1 二进制转十进制
//进制转换--二进制转为十进制 (栈) 
#define OK 1 
#define OVERFLOW -2 
#define ERROR 0
#define NULL 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#include<malloc.h> 
#include<process.h> // exit()
#include<stdio.h>
typedef int SElemType;
typedef int Status;
typedef struct {
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{ //构造一个空栈 
	S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S.base) exit(OVERFLOW); //存储分配失败 
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}
Status Push(SqStack &S,SElemType e)
{ //插入元素e为新的栈顶元素 
	if(S.top-S.base>=S.stacksize)
	{ //栈满,追加存储空间 
		S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base) exit(OVERFLOW); //追加存储空间失败 
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top=e;
	S.top++; //栈顶指针后移 
	return OK;
}
Status Pop(SqStack &S,SElemType &e)
{ //删除栈顶元素,用e返回其值 
	if(S.top==S.base) //栈空,返回ERROR 
 		return ERROR;
	S.top--;  
	e=*S.top;
	return OK;
}
Status DestroyStack(SqStack &S)
{ //销毁栈S,S不再存在
	free(S.base);
	S.base=NULL;
	S.top=NULL;
	S.stacksize=0;
	return OK;
}
Status StackEmpty(SqStack S)
{ //若栈S为空栈,则返回TRUE,否则返回FALSE
	if(S.t
数据结构》实验题目 实验一 学生成绩管理(链)  实验目的:熟练掌握单链操作的基本算法实现。  实现功能:以带头结点的单链存储结构,实现如下学生成绩管理的设计要求。  实验机时:6  设计要求: (1)定义学生成绩链结点结构类型,以xscjList和*XscjLink命名,数据域:学号NO、姓名Name、手机号MTel、邮箱地址Email、籍贯 BornAddr、A分成绩AScore、B分成绩BScore,指针域:*next; (2)实现创建学生成绩链函数void Build(XscjLink &T),输入学号、姓名、手机号、邮箱地址、籍贯、A分成绩、B分成绩,建议用文件操作来输入数据; (3)实现函数void Update(XscjLink T, char *Name, float *ScoreA),将姓名为Name的学生的A分成绩改为ScoreA; (4)实现输出学生成绩信息void OutPut(XscjLink T),输出所有学生的学号、姓名、手机号、邮箱地址、籍贯、A分成绩、B分成绩; (5) 实现函数void Insert(XscjLink T, char *Name, char *No),插入学号为NO,姓名为Name学生信息,将链学号≤NO的结点放到该结点的前面,将学号>NO的结点放到该结点后面; (6)实现函数void Sort(XscjLink T),将该学生按照B分成绩进行非递减排序; (7)实现函数void Merge(XscjLink &T1;, XscjLink &T2;),将两个按B分成绩非递减排序的学生成绩单合并为一个按B分成绩非递增排序的通讯录,B分成绩相同且学号相同的成绩记录在结果只保留一个;要求算法的时间复杂度不超过两个链的长度之和O(m+n); (8)实现函数int Count(XscjLink T);统计籍贯是“广州”的学生人数; (9)实现函数void MoveK(XscjLink T, int k),将学生成绩链倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序),注意:严禁采用先计算链长度n再减k(即n-k)的方法;要求算法的时间复杂度不超过个链的长度O(n); (10)实现函数void ReverseN(XscjLink T),将学生成绩链的正间位置结点之后的全部结点倒置,注意:严禁采用先计算链长度n再除以2(即n/2)的方法;要求算法的时间复杂度不超过个链的长度O(n); (11)主控函数main()调用以上函数,分别输出(2)、(3)、(5)、(6)、(7)、(8)、(9)(10)处理后的链内容、输出籍贯是“广州”的学生人数。 可能用到的函数: 从文件读取学生成绩数据:fscanf(文件指针,"%s %s %s %s %s %f %f", p->NO, p->Name, p->Mtel, p->Email, p-> BornAddr, p->AScore, p->BScore); 输出学生成绩数据:printf("%s %s %s %s %s %f %f", p->NO, p->Name, p->Mtel, p->Email, , p-> BornAddr, p->AScore, p->BScore); 字符串赋值函数:char * strcpy(char *, const char *); 字符串比较函数:int strcmp(const char *, const char *) #include #include #include //定义学生成绩链结点结构 typedef struct XscjNode { char NO[10]; //学号 char Name[16]; //姓名 char MTel[11]; //手机号 char EMail[16]; //邮箱地址 char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称) float AScore; // A分成绩 float BScore; //B分成绩 struct XscjNode *next; //指针域 }XscjList, *XscjLink; 实验二 Huffman编码(二叉树)  实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。  实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现功能如下: • Huffman树的建立 • Huffman编码的生成 • 编码文件的译码  实验机时:10  设计思路: 数据结构: #define n 100 //叶子结点数 #define m 2*n-1 // Huffman树结点总数 typedef struct { char data; 字符 int weight; //权值 int lchild , rchild , parent; //左右孩子及双亲指针 }HTNode; //树结点类型 typedef HTNode HuffmanTree[m+1]; //0号单元不用 主要实现函数:  统计字符串字符的种类以及各类字符的个数的函数  构造Huffman树的函数  Huffman编码的函数  建立正文的编码文件的函数  代码文件的译码函数  主函数 实验三 各种排序方法的比较  实验目的:熟练掌握内部排序算法的实现。  实现功能:编制一个演示内部排序算法比较的程序。要求通过编写程序实现起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序等常用的内部排序算法,并通过样本数据比较各个算法的时空特性  实验机时:4
数据结构单链插入、删除和修改实验报告 一、实验目的 1.理解数据结构带头结点单链的定义和逻辑图示方法。 2.掌握单链结点结构的JAVA描述。 3.熟练掌握单链的插入、删除和查询算法的设计与JAVA实现。 4.熟练掌握简单的演示菜单与人机交互设计方法。 二、实验内容 1. 编制一个演示单链插入、删除、查找等操作的程序。 三、实验步骤 1.需求分析 本演示程序用JAVA编写,完成单链的生成,任意位置的插入、删除,以及确定某一元素在单链的位置。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入,元素的值都是整数。 ② 输出的形式:在所有三种操作都显示操作是否正确以及操作后单链的内容。其删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。   ③ 程序所能达到的功能:完成单链的生成(通过插入操作)、插入、删除、查找操作。 ④ 测试数据:  A. 插入操作依次输入11,12,13,14,15,16,生成一个单链    B. 查找操作依次输入12,15,22返回这3个元素在单链的位置    C. 删除操作依次输入2,5,删除位于2和5的元素 2.概要设计 1)为了实现上述程序功能,需要定义单链的抽象数据类型:   ADT LinkList {    数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}    数据关系:R={|ai,ai+1 ∈D}    基本操作: (1)insert 初始化状态:单链可以不为空集;操作结果:插入一个空的单链L。   (2)decelt     操作结果:删除已有的单链的某些结点。 (3)display     操作结果:将上述输入的元素进行排列显示。    (4)modify     操作结果:将上述输入的某些元素进行修改。    (5)save     操作结果:对上述所有元素进行保存。    (6)load     操作结果:对上述元素进行重新装载。   }   2)本程序包含7个函数:   ① 主函数main()   ② 保存单链函数save()   ③ 重载操作菜单函数load()   ④ 显示单链内容函数display ()   ⑤ 插入元素函数insert ()   ⑥ 删除元素函数decelt ()   ⑦ 修改元素函数modify()   各函数间关系如下: 3.详细设计   实现概要设计定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。   1) 结点类型和指针类型   typedef struct node {    int data;    struct node *next;   }Node,*singleLIST.java;   2) 单链的基本操作   为了方便,在单链设头结点,其data域没有意义。 bool insert(singleLIST) (伪码算法)   bool modify(singleLIST) (伪码算法)   void delect(singleLIST)   (伪码算法)   void display()   (伪码算法) 3) 其他模块伪码算法 4.调试分析   (略) 5.使用说明 程序名为 ,运行环境为Windows。程序执行后显示   ========================   0----EXIT   1----INSERT   2----DELETE   3----DISPLAY 4----MODIFY 5----EXIST =======================   SELECT:   在select后输入数字选择执行不同的功能。要求首先输入足够多的插入元素,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链的内容。 选择5:退出程序   选择1:显示"INSERT =" ,   要求输入要插入的位置和元素的值(都是整数)。   选择2:显示"DELETE =" ,   要求输入要删除元素的位置,执行成功后返回元素的值。   选择3:显示"MODIFY = " , 选择要修改的对象,执行成功后返回新的元素值。 选择4:显示"DIAPLAY= "   显示所有单链的元素,自动进行排序。
为了设计一个顺序表结构存储26个英文大写字母,我们可以使用数组作为底层数据结构,因为数组提供直接访问的优势,适合存储固定长度的内容。以下是基本的实现: ```python class AlphabetList: def __init__(self): self.size = 26 # 初始化顺序表,每个元素存储一个大写字母 self.alphabets = ['A', 'B', 'C', 'D', ..., 'Z'] # 使用列生成式填充 # 按内容查询 def search(self, target: str) -> int: if len(target) != 1 or not target.isupper(): return -1 # 非单字母大写或非大写返回错误位置 index = ord(target.upper()) - ord('A') if 0 <= index < self.size: return index else: return -1 # 如果索引超出范围,示字母不存在 # 插入 def insert(self, position: int, new_letter: str) -> None: if not new_letter.isupper() or len(new_letter) > 1: raise ValueError("只能插入单字母大写") if position < 0 or position > self.size: raise IndexError("插入位置越界") self.alphabets.insert(position, new_letter.upper()) # 删除 def delete(self, position: int) -> None: if position < 0 or position >= self.size: raise IndexError("删除位置越界") del self.alphabets[position] # 输出表信息 def display(self): print("当前顺序表:", ', '.join(self.alphabets)) # 示例用法 table = AlphabetList() table.insert(5, "E") # 插入E到第6位(0-based) table.delete(3) # 删除第4位的字符(3-based) print(table.search("F")) # 查询F的位置 table.display() # 输出当前顺序表 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值