数据结构基础实验

顺序表

// test789.cpp : Defines the entry point for the console application.
//

#include "stdio.h"
#include "stdlib.h"
#define SIZE 100

typedef struct
{
	int *elem;
	int length;
	int listsize;
}SqList;

//创建一个线性表 
int InitList(SqList &L)
{
	L.elem=(int *)malloc(SIZE*sizeof(int));
	if(!L.elem)
		return 0;
	L.length=0;
	L.listsize=SIZE;
	return 1;
}
//给已创好的线性表导入n个数据
void CreateList(SqList &L,int n)
{
	int i,x;
	for(i=0;i<n;i++)
	{
		L.length++;
		printf("请输入第%d个元素:",i+1);
		scanf("%d",&x);
		L.elem[i]=x;
	}
}
//销毁线性表
int DestroyList(SqList &L)
{
	free(L.elem);
	L.elem=NULL;
	L.length=0;
	L.listsize=0;
	return 1;
}
//将线性表重新设置为空表
int ClearList(SqList &L)
{
	L.length=0;
	return 1;
}
//判断线性表是否为空表
int ListEmpty(SqList L)
{
	if(L.length==0)
		return 1;
	else
		return 0;
}
//返回线性表的长度
int ListLength(SqList L)
{
	return L.length;
}

//取线性表中第i个元素的值
int GetElem(SqList L,int i,int &e)
{
	if(i<1 || i>L.length)
		return 0;
	e=L.elem[i-1];
	return 1;
}
//在线性表中查找元素e在几号位置上
int LocateList(SqList L,int e)
{
	int i;
	for(i=0;i<L.length;i++)
		if(e==L.elem[i])
			return i+1;
	return 0;
}
//获得元素cur_e前一个元素,把值赋给pre_e
int PirorElem(SqList L,int cur_e,int &pre_e)
{
	int i;
	for(i=0;i<L.length;i++)
		if(L.elem[i]==cur_e)
			break;
	if(i==0 || i==L.length)
		return 0;
	pre_e=L.elem[i-1];
	return 1;
}
//获得元素cur_e后一个元素,把值赋给next_e
int NextElem(SqList L,int cur_e,int &next_e)
{
	int i;
	for(i=0;i<L.length;i++)
		if(L.elem[i]==cur_e)
			break;
	if(i==L.length-1 || i==L.length)
		return 0;
	next_e=L.elem[i+1];
	return 1;
}
//在第i个元素前插入元素e
int ListInsert(SqList &L,int i,int e)
{
	int p;
	if(i<1 || i>L.length+1)
		return 0;
	for(p=L.length-1;p>=i-1;p--)
		L.elem[p+1]=L.elem[p];
	L.elem[i-1]=e;
	++L.length;
	return 1;
}
//删除第i个元素,并返回值给e
int ListDelete(SqList &L,int i,int &e)
{
	int p;
	if(i<1 || i>L.length)
		return 0;
	e=L.elem[i-1];
	for(p=i;p<=L.length-1;p++)
		L.elem[p-1]=L.elem[p];
	--L.length;
	return 1;
}
//顺序表的遍历输出 
void TraverseList(SqList L)//
{
	int i;
	printf("此时顺序表的遍历输出:");
	for(i=0;i<L.length;i++)
		printf("%d ",L.elem[i]);
	printf("\n");
}
int main(int argc, char* argv[])
{
	
	int i,e,n,cur_e,pre_e,next_e;// i:第几号元素 e:某个数据的元素值
	SqList L;		 // cur_e:当前的元素值
	InitList(L);	//pre_e:该元素前面的值 next_e:该元素后面的值 
	
	printf("请输入需要导入顺序表元素的个数n:");
	scanf("%d",&n);
	CreateList(L,n);//创建一个线性表 
	TraverseList(L);//遍历输出一次该线性表的数据  

	printf("\n请输入需要查找元素的位置i:");//由位置i 查找元素的值e 
	scanf("%d",&i);
	if(GetElem(L,i,e))
		printf("其值为:%d",e);
	else
		printf("输入有误!!!");
	
	printf("\n请输入需要查找的元素值e:");//由元素的值e 查找所在的位置i 
	scanf("%d",&e);
	if(LocateList(L,e))
		printf("其位置为:%d\n",LocateList(L,e));
	else
		printf("输入有误!!!");	

	printf("\n请输入需要删除的元素的位置i:");//根据元素的位置i,删去此条数据 
	scanf("%d",&i);	
	if(ListDelete(L,i,e))
		printf("删出的元素值为:%d\n",e);
	else
		printf("输入有误!!!");
	TraverseList(L);

	printf("\n请输入需要插入的元素位置和元素值(在位置前插入)i和e:");
	scanf("%d %d",&i,&e);
	if(ListInsert(L,i,e)==0)
		printf("输入有误!!!");
	TraverseList(L);
	printf("此时顺序表长度为:%d",ListLength(L));

	printf("\n查找当前元素的前一个元素的值,请输入当前元素的值cur_e:");
	scanf("%d",&cur_e);
	if(PirorElem(L,cur_e,pre_e))
		printf("前一个元素值为:%d\n",pre_e);
	else
		printf("输入有误!!!");
	
		
	printf("\n查找当前元素的后一个元素的值,请输入当前元素的值cur_e:");
	scanf("%d",&cur_e);
	if(NextElem(L,cur_e,next_e))
		printf("后一个元素值为:%d\n",next_e);
	else
		printf("输入有误!!!");
	 

	if(ClearList(L))
		printf("\n顺序表清空成功!\n");
	if(DestroyList(L))
		printf("顺序表销毁成功!\n");
	printf("Hello World!\n");
	return 0;
}
    

运行结果截图:
在这里插入图片描述


单链表

// code2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode,*LinkList;



//头插法创建一个链表
void CreateList_toucha(LinkList &L,int n)
{
	int i;
	LinkList p;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	for(i=0;i<n;i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		printf("Please input data:");
		scanf("%d",&(p->data));
		p->next=L->next;
		L->next=p;
	}
}

//构造一个空表
int InitList(LinkList &L)
{
	L=(LinkList)malloc(sizeof(LNode));
	if(!L)
		return 0;
	L->next=NULL;
	return 1;
}

//将表L置为空
int ClearList(LinkList &L)
{
	LinkList p,q;
	p=L->next;
	while(p)
	{
		q=p->next;
		free(p);
		p=q;
	}
	return 1;
}

//销毁表L
int DestroyList(LinkList &L)
{
	LinkList p=L;
	while(L)
	{
		p=L->next;
		free(L);
		L=p;
		
	}
	L=NULL;
	return 1;
}

//判断表L是否为空
int ListEmpty(LinkList L)
{
	if(L->next)
		return 0;
	else
		return 1;
}

//求表L的长度
int ListLength(LinkList L)
{
	int count=0;
	LinkList p;
	p=L->next;
	while(p)
	{
		count++;
		p=p->next;
	}
	return count;
}

//得到第i个元素的值e
int GetElem(LinkList L,int i,int &e)
{
	int j=1;
	LinkList p=L->next;
	while(p && j<i)
	{
		p=p->next;
		j++;
	}
	if(!p || j>i)
		return 0;
	e=p->data;
	return 1;
}

//根据e定位其在表L中的几号位置上
int LocateList(LinkList L,int e)
{
	int i=1;
	LinkList p=L->next;
	while(p)
	{
		if(e==p->data)
			return i;
		p=p->next;
		i++;
	}
	return 0;
}

//在第i个数据前插入元素
int InsertList(LinkList &L,int i,int e)
{
	int j=0;
	LinkList p=L,s;
	while(p && j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p && j>j-1)
		return 0;
	s=(LinkList)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return 1;
}


//删除表L中的第i号数据
int DeleteList(LinkList &L,int i,int &e)
{
	int j=0;
	LinkList p=L,q;
	while(p->next && j<i-1)
	{
		p=p->next;
		j++;
	}
	if(!p->next || j<i-1)
		return 0;
	q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);
	return 1;
}
//遍历表L
void Traverse(LinkList L)
{
	LinkList p=L->next;
	printf("表L的遍历输出为:");
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}
int main()
{
	LinkList L;
	InitList(L);
	CreateList_toucha(L,4);
	Traverse(L);
	
	int e;
	printf("删除第3个数据:");
	DeleteList(L,3,e);
	printf("\n删除的值为:%d",e);
	Traverse(L);

	printf("在第2号位置插入数据43:");
	InsertList(L,2,43);
	Traverse(L);

	printf("Hello World!\n");
	return 0;
}

运行结果截图:
在这里插入图片描述


二叉树

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

typedef struct BiTNode
{
	char data;
	struct BiTNode *Left,*Right;
}BiTNode,*BiTree;

void CreateBiTree(BiTree *T)
{
	char ch;
	scanf("%c",&ch);
	if(ch==' ')
		*T=NULL;
	else
	{
		*T=(BiTree)malloc(sizeof(BiTNode));
		if(!(*T))
			exit(-1);
		(*T)->data=ch;
		CreateBiTree(   &(*T)->Left   );
		CreateBiTree(   &(*T)->Right  );
	}
}
void DestroyBiTree(BiTree *T)
{
	if(*T)
	{
		if(&(*T)->Left)
			DestroyBiTree(   &((*T)->Left)   );
		if(&(*T)->Right)
			DestroyBiTree(   &((*T)->Left)   );
	}
}
void Pre1(BiTree T)
{
	if(T)
	{
		printf("%c ",T->data);
		Pre1(T->Left);
		Pre1(T->Right);
	}
}
void Pre2(BiTree T)
{
	if(T)
	{		
		Pre2(T->Left);
		printf("%c ",T->data);
		Pre2(T->Right);
	}
}
void Pre3(BiTree T)
{
	if(T)
	{
		Pre3(T->Left);
		Pre3(T->Right);
		printf("%c ",T->data);
	}
}
//1二叉树中非叶子结点个数
int count;
void pre1(BiTree T)
{
	if(T)
	{
		if(!(T->Left==NULL && T->Right==NULL)) // 等价于if(T->Left || T->Right)
			count++;
		pre1(T->Left);
		pre1(T->Right);
	}
}
void fun1(BiTree T)
{
	count=0;
	pre1(T);
	printf("\n1.非叶子结点总数为: %d",count);
}
//2打印输出二叉树第四层结点
void pre2(BiTree T,int i)
{
	if(T)
	{
		if(i==4)
			printf("%c ",T->data);
		pre2(T->Left,i+1);
		pre2(T->Right,i+1);
	}
}
void fun2(BiTree T)
{
	printf("\n2.输出第四层结点:");
	pre2(T,1);
}
//3二叉树中度为2的结点个数
void pre3(BiTree T)
{
	if(T)
	{
		if(T->Left && T->Right)
			count++;
		pre3(T->Left);
		pre3(T->Right);
	}
}
void fun3(BiTree T)
{
	count=0;
	pre3(T);
	printf("\n3.度为2的结点个数:  %d",count);
}
//4二叉树结点总数
void pre4(BiTree T)
{
	if(T)
	{
		count++;
		pre4(T->Left);
		pre4(T->Right);
	}
}
void fun4(BiTree T)
{
	count=0;
	pre4(T);
	printf("\n4.结点总数为: %d",count);
}
//5二叉树叶子结点总数
void pre5(BiTree T)
{
	if(T)
	{
		if(T->Left==NULL && T->Right==NULL)
			count++;
		pre5(T->Left);
		pre5(T->Right);
	}
}
void fun5(BiTree T)
{
	count=0;
	pre5(T);
	printf("\n5.叶子结点总数: %d",count);
}
//6遍历二叉树并显示每个结点的层号
void pre6(BiTree T,int i)
{
	if(T)
	{
		printf("%c-%d ",T->data,i);
		pre6(T->Left,i+1);
		pre6(T->Right,i+1);
	}
}
void fun6(BiTree T)
{
	printf("\n6.历二叉树并显示每个结点的层号如下:\n");
	pre6(T,1);
}
//7二叉树的深度
int pre0(BiTree T)
{
	int high,lhigh,rhigh;
	if(T==NULL)
		high=0;
	else
	{
		lhigh=pre0(T->Left);
		rhigh=pre0(T->Right);
		high=(lhigh>=rhigh?lhigh:rhigh)+1;
	}
	return high;
}

int main()
{
	BiTree T;
	printf("请输入建立二叉树的字符序列包括:\n");
	CreateBiTree(&T);
	printf("前序遍历为:\n");
	Pre1(T);
	printf("\n中序遍历为:\n");
	Pre2(T);
	printf("\n后序遍历为:\n");
	Pre3(T);

	fun1(T);
	fun2(T);
	fun3(T);
	fun4(T);
	fun5(T);
	fun6(T);
	printf("\n这棵树的深度为: %d\n",pre0(T));
	return 0;
}

运行结果截图:
在这里插入图片描述


简单排序

// code666.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "string.h"
#define MAXSIZE 100
#define N 6

typedef struct
{
	int num;
	char name[10];
	int score;
}infor;//存储某个人的信息——编号、姓名、分数
typedef struct
{
	infor r[MAXSIZE+1];
	int length;
}Sqlist;

void swap(infor &x,infor &y)
{
	infor z;
	z=x;
	x=y;
	y=z;
}

void BubbleSort(Sqlist &L,int n)
{
	int i,j,last;
	i=n;
	while(i>1)
	{
		last=1;
		for(j=0;j<i;j++)
			if(L.r[j].score>L.r[j+1].score)
			{
				swap(L.r[j],L.r[j+1]);
				last=j;
			}
		i=last;
	}
}

void InsertSort(Sqlist &L)
{
	int i,j;
	for(i=2;i<=L.length;i++)
		if(L.r[i].score<L.r[i-1].score)
		{
			L.r[0]=L.r[i];
			for(j=i-1;L.r[0].score<L.r[j].score;j--)
				L.r[j+1]=L.r[j];
			L.r[j+1]=L.r[0];
		}
}

void SelectSort(Sqlist &L)
{
	int i,j,min;
	for(i=1;i<=L.length-1;i++)
	{
		min=i;
		for(j=i+1;j<=L.length;j++)
			if(L.r[j].score<L.r[min].score)
				min=j;
		if(min!=i)
			swap(L.r[min],L.r[i]);
	}
}

void print(Sqlist L)
{
	int i;
	for(i=1;i<=L.length;i++)
		printf("编号:%d-%s->%d \n",L.r[i].num,L.r[i].name,L.r[i].score);
	printf("\n");
}

void main()
{
	
	int d[N]={98,67,88,100,63,70};
	char *name[N]={"张三","王五","李明","赵四","李华","强三"};
	Sqlist L;
	L.length=N;
	int i,j;
	for(i=0;i<N;i++)
	{
		L.r[i+1].num=i+1;
		L.r[i+1].score=d[i];
		strcpy(L.r[i+1].name,name[i]);
	//		for(j=0;name[j]!='\0';j++)
	//		L.r[i+1].name[j]=*(name[i]++);
	}
	printf("排序前:\n");
	print(L);
	BubbleSort(L,N);
	printf("排序后:\n");
	print(L);
/*
	printf("排序前:");
	print(L);
	InsertSort(L);
	printf("排序后:");
	print(L);

	printf("排序前:");
	print(L);
	SelectSort(L);
	printf("排序后:");
	print(L);
*/
}

运行结果截图:
在这里插入图片描述


轻松一下

高清无水印【琉璃 | 剧同名主题曲MV | 演唱:刘宇宁】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

todaycode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值