数据结构实验1

一、实验目的

1、指针基础及指针运算

加强对指针数据类型的理解,熟悉指针的定义,通过指针间接访问变量。

2、字符串反转及字符串连接

加强对字符指针以及将指针作为函数返回类型的理解,并通过指针对字符串进行操作,通常来说,一个字符串在内存中是连续存放的,其开始为指向该字符串的指针值,字符串均以‘\0’作为结束字符。

3、数组元素奇偶排列

加强对使用指针对数组进行操作的理解,通常数组的名称即整个数组的起始存储地址,可以定义一个指针指向它,然后通过指针移动来访问各个数组的成员。

二、使用仪器、器材

微机一台

操作系统:Win7

编程软件:C/C++

  • 实验内容及原理

填入自己的内容(思路或算法流程图、源代码、说明等)

想法

2、字符串的反转及字符串的连接

先输入字符串,用一个指针标记字符串的首位,另一个指针标记字符串的末位,用一个循环,当标记的首位指针比末位指针小才执行循环,首位指针++,末位指针--,然后交换,就可以实现字符串逆置。

用一个字符型指针标记为第一串字符串末位的后一位,让其等于要接的字符串的首位元素,将指针++和要接的字符串++,即能实现字符串拼接。

3、数组元素的奇偶排列

    建立一个数组,输入数组元素,用两个指针,一个指针标记为数组的首位,另一个指针标记为数组的末位,两个指针向中间靠拢,当首位指针<末位指针时执行循环,首位的指针指向的元素判断是否为奇数,是奇数则循环继续判断下一位,不是奇数则终止循环,末位指针指向的元素则是判断是否为偶数,原理相同。当首位与末位指针都停止时(即首位遇到偶数,末位遇到奇数)将其二者交换,当首位指针>末位指针时,整个循环结束,即已经按奇数放左边、偶数放右边的规则将数组排列好。

#include <stdio.h>
char* reverse(char* str);
char* link(char* str1, char* str2);
void sort(int [], int);

#define N 10

int main()
{
	//定义一个整形指针变量p,使它指向一个整形变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整形变量c并赋初值3;
	int* p;
	int a;
	p = &a;

	float* q;
	float b;
	q = &b;

	int c = 3;

	//使用指针变量,调用scanf函数分别输入a和b的值;通过指针间接访问并输出a,b的值;
	printf("请输入a的值:");
	scanf_s("%d", p);
	printf("请输入b的值:");
	scanf_s("%f", q);
	printf("a的值为:%d", *p);
	printf("\nb的值为:%f\n", *q);

	//按十六进制方式输出p,q的值以及a,b的地址;
	printf("p的值为:%p\n", p);
	printf("q的值为:%p\n", q);
	printf("a的地址为:%p\n", &a);
	printf("b的地址为:%p\n", &b);

	//将p指向c,通过p间接访问c的值并输出;输出p的值及c的地址
	p = &c;
	printf("c的值为:%d\n", *p);
	printf("p的值为:%p\n", p);
	printf("c的地址为:%p\n", &c);

	getchar(); //清空缓冲区

	//定义两个字符指针,通过gets()函数输入两个字符串;
	char str1[100], str2[100];
	printf("请输入字符串1:");
	gets(str1);
	printf("输入的字符串1为:%s\n", str1);
	reverse(str1);
	printf("字符串1逆置后为:%s\n", str1);

	printf("请输入字符串2:");
	gets(str2);
	
	link(str1, str2);
	printf("字符串1和字符串2连接后为:%s\n", str1);

	int arr[N];
	printf("请输入数组的元素:");
	for (int i = 0; i < N; i++)
		scanf_s("%d", &arr[i]);
	sort(arr, N);
	printf("排序后的数组为:");
	for (int i = 0; i < N; i++)
		printf("%d ", arr[i]);
	
	return 0;
}

char* reverse(char* str)
{
	char* p,* q, temp;
	p = str;
	q = str;
	while (*p != '\0')
		p++;
	p--; //去掉最后一个"\0"
	while (q < p) //交换
	{
		temp = *p;
		*p = *q;
		*q = temp;
		q++;
		p--;
	}

	return str;
}

char* link(char* str1, char* str2)
{
	char* p = str1;
	while (*p != '\0')
		p++;
	while (*str2 != '\0')
	{
		*p = *str2;
		p++;
		str2++;
	}
	*p = '\0';
	return str1;
}

void sort(int arr[], int num)
{
	int* p, * q, temp;
	p = arr; //首位
	q = arr + num - 1;//末位
	while (p < q)
	{
		while (*p % 2 == 1) //为奇数
			p++; //往下移一位
		while (*q % 2 == 0)
			q--;
		if (q < p)
			break;
		temp = *p;
		*p = *q;
		*q = temp;
		//再到下一位
		p++;
		q--;
	}

1、指针基础及指针运算

(1)定义一个整形指针变量p,使它指向一个整形变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整形变量c并赋初值3;

(2)使用指针变量,调用scanf函数分别输入a和b的值;

(3)通过指针间接访问并输出a,b的值;

(4)按十六进制方式输出p,q的值以及a,b的地址;

(5)将p指向c,通过p间接访问c的值并输出;

(6)输出p的值及c的地址,并与上面的结果进行比较。

2、字符串的反转及字符串的连接

(1)定义两个字符指针,通过gets()函数输入两个字符串;

(2)定义一个函数char *reverse(char*str),通过指针将字符串反转;

(3)定义一个函数char *link(char *str1,char*str2),通过指针移动方式将两个字符串连接起来;

(4)从主函数中分别调用上述函数,输入字符串并打印输出结果。

3、数组元素的奇偶排列

(1)定义一个整形一维数组,任意输入N个数组元素,其中包含奇数和偶数;

(2)定义一个函数,实现将数组元素奇数在左,偶数在右的排列;

(3)在上述定义的函数中,不允许再增加新的数组;

(4)从主函数中分别调用上述函数,打印输出结果。

  • 实验过程原始数据记录

截屏及解读

五、实验结果及分析

总结

能较为熟练地运用指针处理数据,这不仅节省了空间,省去多余的新变量,使操作更加简洁。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值