一,关于给链表中的对象排序的问题:
之前纠结于链表排序,比如要给一个学生成绩链表冒泡排序。冒泡排序是要交换元素再数组中的位置,然而每一个学生的成绩都对应着固定的名字,怎么才能让整个对象跟着元素一起移动是关键。
下面是Mr.T的思路:
拷贝整个链表对象,然后放入一个对象指针数组,然后取到参考元素进行排序。但交换变量时交换的是整个对象指针的值,即他们所指的对象。然后再打印时按数组下标顺序,就可以实现按我们想要的顺序显示。并且不影响链表的原始结构。
#include<iostream>
#include<string>
using namespace std;
struct Std
{
int score;
char name;
struct Std *next;
};
int main()
{
int i = 0,j = 0;
char c = 'A';
struct Std* arr[10]; //结构体指针数组
for(i = 0;i<10;i++)
{
arr[i] = new Std; //动态创建对象(如果给已有对象排序,直接等于对象地址就可以了,比如&s1,&s2等)
arr[i]->score = rand()%100+50; //随机给分数赋值
arr[i]->name = c; //随机给名字赋值(遗留问题,如何随机生成字符串,给名字赋值。)
c++;
}
printf("\n\n排序前:");
for(i = 0;i<10;i++)
{
printf("\n arr[%d]->name = %c arr[%d].score = %d",i,arr[i]->name,i,arr[i]->score);
}
for(i = 0;i<10;i++)
{
for(j = 1;j<10;j++)
{
if(arr[j]->score < arr[j-1]->score)
{
Std t;
t = *arr[j];
*arr[j] = *arr[j-1]; //交换指针的指向
*arr[j-1] = t;
}
}
}
printf("\n\n排序后");
for(i = 0;i<10;i++)
{
printf("\n arr[%d]->name = %c arr[%d].score = %d",i,arr[i]->name,i,arr[i]->score);
}
getchar();
return 0;
}
二,解决rand()生成随机数,每次打开生成的数都一样的问题:
第一步:头文件多加一条应用#include<time.h>
第二步:在主函数开头加上srand((unsigned) time(NULL));
第三步:希望您使用愉快
三,二维指针处理字符数组:
# include<stdio.h>
main()
{
char *Names[]={"Bill","Sam","Jim","Paul","Charles",0};
char **nm=Names;
while(*nm!=0)
{
printf("%s\n",*nm++);
}
getchar();
}
/*
打印效果:
Bill
Sam
Jim
Paul
Charles
*/
刚开始看到这个代码我略懵,稍微捋一捋就清楚了
1定义字符数组有这样两种方式:
A:char st[] = {"hello"}
此时默认全部赋值,sizeof(st)的值为6。
B:char *p;p ="hello";
动态创建了字符串"hello",并把字符串的首地址赋给字符指针p,字符数组名默认的也是指向数组的首地址。
所以P可以当做字符数组名用。但是P本身其实是一个单独的变量,拥有单独的地址。
打印:p,&st,&st[0]会发现后面两个是一个地址,而P又是一个地址。
2,所以上题中的char *name[6],可以这么理解:
char *name[6];
创建了一个包含六个元素的字符指针数组。
name[1] = "Bill";
既然是字符指针就可以像char *p = "Bill"这么用。
前面的类型说明符char可以省略,是因为数组名的类型已经做了统一说明。
简写就成了:char *name ={"Bill",...}。
所以可以认为每一个名字,都是一个char型的指针,指向的就是这个名字的首地址。
3,**nu = name
此时nu指向的是整个字符指针数组,但默认指向num[0];所以*nu就是取num[0],它还是个地址。
但是字符数组的特殊想就在于,打印首地址就可以输入整个字符串。
于是*nu在%s下输出的是"Bill",
后面的*nu++,不解释。
四,困扰许久的问题,动态创建数组,自定义大小:
#include<stdio.h>
#include<math.h>
#include<time.h>
void main()
{
srand((unsigned) time(NULL));
int *p,n,i = 0;
printf("你希望数组有多少个元素,给我一个数字:");
scanf("%d",&n);
getchar();
p = (int*)malloc(sizeof(int)*n); //动态分配内存
if(p != NULL) //检查是否分配成功
{
for(i=0;i<n;i++)
{
p[i] = rand()%75+25;
printf("%d\t",p[i]);
}
}
getchar();
}
//分配了大小为4n内存空间,并且返回了该段内存空间的首地址给P。
此时的P可以当数组名用,也就是说可以写成p[1] = 10这种形式来完成数组的赋值。
再回顾一下之前意淫的形式:
int N,a[N];
scanf("%d",N);
错!错!错!