C++结构体如何定义构造函数??

问题:在网上看到别人写的c++定义构造函数的代码如下:

struct Gnode{
    int label;    //
    vector<Gnode *> nbs;
    Gnode(int x): label(x) {}    //构造函数  ?  
};



请问,这个第3行构造函数为什么可以这样写,为何label(x)可以写在大括号的前面?


不是应该写成:


struct Gnode{
    int label;    //
    vector<Gnode *> nbs;
    Gnode(int x){
        label=x; 
    }    

};

这种形式吗?


对C++结构体部分不太熟悉,求大佬解释一下?




另外我如果想补充一下自己的这些知识,有啥推荐的书吗? 重新学一遍大一时候学的C++课本??

2个回答

书籍:C++ primer
这种形式的构造函数是创建的时候初始化,然后再调用构造函数。
也就是说变量label的赋值完成后,才会执行构造函数里面的语句。
C++结构体和类相似,有部分不同。具体的看书就明白了。

这种写法叫初始化列表,跟c++类一样。label(x) 这个对label 初始化是发生在构造函数之前。意思是构造函数还没开始就先对label赋值了。
然而:

    Gnode(int x){
        label=x; 
    }  

这种是赋值操作,是进入构造函数之后才对label赋值的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++结构体如何定义构造函数??
**问题:**在网上看到别人写的c++定义构造函数的代码如下: <br /> ``` struct Gnode{ int label; // vector<Gnode *> nbs; Gnode(int x): label(x) {} //构造函数 ? }; ``` <br /> 请问,这个第3行构造函数为什么可以这样写,为何label(x)可以写在大括号的前面? <br /> 不是应该写成: ``` struct Gnode{ int label; // vector<Gnode *> nbs; Gnode(int x){ label=x; } }; ``` 这种形式吗? <br /> **对C++结构体部分不太熟悉,求大佬解释一下?** <br /> <br /> 另外我如果想补充一下自己的这些知识,有啥推荐的书吗? 重新学一遍大一时候学的C++课本??
C++结构体里构造函数地址怎么获得?
``` struct A { union { char szBuffer[9]; struct { char ch; float fl; int i; }Value; }Data; A () { Data.Value.ch=1; Data.Value.fl=3.14; Data.Value.i=2; } }; ``` A a1; 想打印出a1里A ()函数的地址 怎么实现??请高手指导一下
c++声明结构体指针变量提示没有构造函数错误
##在OJ中做题 ###题目描述 输入一个链表,从尾到头打印链表每个节点的值。 ----- 我的代码: ```c // struct ListNode { // int val; // struct ListNode *next; // ListNode(int x) : // val(x), next(NULL) { // } // }; class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { struct ListNode* p1, p2; p1 = head; p1->next = NULL; p2 = p1->next, p2->next = p1; p1 = p2; while(p1->next != NULL) { p2 = p1->next; p2->next = p1; p1 = p2; } //现在p1指向新链表头 vector<int> out; int i = 0; while(p1 != NULL) { out[i++] = p1->val; p1 = p1->next; } } }; ``` 我想先反转链表再顺序输出,可是结构体变量声明那一行提示没有构造函数错误(去掉结构体定义的注释号提示结构体重复定义,所以我认为结构体在后台已经定义过了) 错误信息: 编译错误:您提交的代码无法完成编译 In file included from main.cc:2: ./solution.h:13:30: error: no matching constructor for initialization of 'struct ListNode' struct ListNode* p1, p2; ^ ../../include/tools.h:115:2: note: candidate constructor not viable: requires single argument 'x', but no arguments were provided ListNode(int x) : ^ ../../include/tools.h:112:8: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided struct ListNode { ^ ../../include/tools.h:112:8: note: candidate constructor (the implicit move constructor) not viable: requires 1 argument, but 0 were provided 1 error generated. 提交运行
c++结构的构造函数
有下面两个C++结构: struct Vertex3D{ GLfloat x; GLfloat y; GLfloat z; Vertex3D(GLfloat a, GLfloat b, GLfloat c){ x = a; y = b; z = c; } }; struct Triangle3D{ Vertex3D v1; Vertex3D v2; Vertex3D v3; Triangle3D(Vertex3D vt1, Vertex3D vt2, Vertex3D vt3){ }; }; `Vertex3D`的构造函数正常,`Triangle3D`的构造出现警告:```“Constructor for 'Triangle3D'' must explicitly initialise member 'v2' which does not have default constructor”``` 但是我已经为`Vertex3D`类型结构创建了一构造函数,为什么还会出现这类错误呢?应该怎么解决?谢谢
急!急!急! C++ 结构体带构造函数的在C#中改如何定义
struct THFI_Param { int nMinFaceSize; int nRollAngle; bool bOnlyDetect; DWORD dwReserved; THFI_Param() { nMinFaceSize=50; nRollAngle=30; bOnlyDetect=false; dwReserved=NULL; } };
关于C++中结构体的构造函数中带冒号的问题
``` struct Matrix { int a, b; Matrix(int a = 0,int b=0) : a(a),b(b) { } } m[26]; ``` 构造函数中是对里面的成员变量设置默认值,那为什么在上述代码中已经初始化之后还要再加冒号呢? 另外有冒号的这一行是什么意思。新手小白一个,请大神指教,非常感谢
调用哪个构造函数?C++,结构体
``` struct LinkNode { T data; //数据域 LinkNode<T>*link; //链指针域 LinkNode(LinkNode<T> *ptr =NULL) {link=ptr;} LinkNode(const T&item,LinkNode<T> *ptr=NULL) { data=item; link=ptr; } }; ``` 如果有下面代码 T value; LinkNode<T> *desptr=first=new LinkNode<T>; desptr->link=new LinkNode<T>(value); 它调用的是LinkNode的哪个构造函数?为什么呢?
关于复制构造函数跟赋值运算符重载
新手求指导 关于两个函数不太理解 复制构造的是同一个内存地址吗 为什么要重载赋值运算符
C++课程设计 求大神帮忙写下构造函数和析构函数
1.网格世界类 网格中每个元素存放各种生物对象的指针或者为空。模拟过程中,我们需要移动生物,还有繁殖和饥饿(死亡),所以在网格类中,我们可以将一只生物放到网格中;可以读取网格中的某个指定位置的生物,获取它的指针,以便在每一个time step中对它进行处理(移动、繁殖和饥饿死亡)。在一个time step中,网格中每只生物都要处理一遍,先狮蚁,后蚂蚁。另外,应该有一个显示网格的成员函数。 2.有机生物类 生物要能够放到网格中,所以每一只生物都有相关的函数。可以是构造函数,即构造生物的时候,同时指明放到网格的哪一个位置上。 有Move函数,Breed函数,Starve函数(是否饿死)。这些函数在派生类中有派生类自己的实现。所以,在有机生物类中,这些函数应该是纯虚函数,有机生物类是一个抽象类。 网格世界类中,从某个网格位置读取生物并处理时,需要知道是哪一种类型的生物(是狮蚁还是蚂蚁),所以,有机生物类里应该考虑如何返回生物的类型。简单的办法是,用不同的常量来表示狮蚁和蚂蚁。例如,用整数1表示狮蚁,2表示蚂蚁。在有机生物类中定义纯虚函数GetType,返回生物的具体类型。 3.蚂蚁类 实现Move函数,Breed函数,Starve函数和GetType函数。 4.狮蚁类 实现Move函数,Breed函数,Starve函数和GetType函数。 (二)细化: 1.网格世界类: (1)属性。数据结构:网格世界中如何存放蚂蚁或狮蚁对象? 20*20的网格,用一个20*20的二维数组来表示,数组元素是什么类型? (2)方法。网格世界类应该有哪些成员函数? 构造函数:初始化网格。 析构函数:释放掉所有生物。 Set函数:指定x,y位置(二维数组的下标),以及一只生物的地址(指针),将这只生物存入网格中。 Get函数:获取网格中x,y坐标上的生物的地址(指针)。 OneStep函数:在一个time step中,网格中每只生物都要处理一遍,包括移动、繁殖和饥饿。首先,把网格中的每一只生物在本轮是否移动过的标记moved先都标记为假(为什么?);其次,移动,先狮蚁,后蚂蚁,同时把该生物的moved标记为真;再次,把饥饿的狮蚁消灭掉;最后,繁殖。 Display函数:显示函数,显示网格中的具体情况。每个网格,如果是空,显示”.”;如果是蚂蚁,显示”o”;如果是狮蚁,显示”x”。 2.有机生物类 (1)属性 要记录每只生物的一些基本属性:属于哪个网格对象,具体在哪个位置上(x,y坐标),本轮是否移动过。另外,为了记录是否到了繁殖时间,要有一个跟踪器,即记录上次繁殖之后,又经历了多少次time step。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的生物放到网格中。 析构函数: Move函数,Breed函数,Starve函数和GetType函数为纯虚函数。 3.蚂蚁类 (1)属性 不需要再添加属性。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的蚂蚁放到网格中。 析构函数: Move函数:随机选择一个方向,看是否能移动,否则保持在原位置。 Breed函数:繁殖跟踪器+1.如果是3的倍数,就需要繁殖,同时跟踪器清零。 Starve函数:本模拟中蚂蚁不会饿死,所以仅返回false值即可。 GetType函数:返回蚂蚁的类型标记。 4.狮蚁类 (1)属性 狮蚁会饿死,需要添加一个属性,跟踪记录狮蚁饥饿了多少次time step。 (2)方法 构造函数: 带参数的构造函数:指定网格对象和x、y位置,把构造的狮蚁放到网格中。 析构函数: Move函数:若有相邻蚂蚁,移动到单元网格,吃掉蚂蚁;否则,随机选择一个方向,看是否能移动,不能移动则保持在原位置。 Breed函数:繁殖跟踪器+1,如果是8的倍数,就需要繁殖,同时跟踪器清零。 Starve函数:饥饿跟踪器+1,如果是3的倍数,则饥饿并死亡,从网格中拿掉该狮蚁,同时跟踪器清零。 GetType函数:返回狮蚁的类型标记。 四、其它 (一)所有涉及的常量定义为类型常量。如: const int ANTBREED = 3; //蚂蚁的繁殖周期为3个time steps const int DOODLEBREED = 8; //狮蚁的繁殖周期为8个time steps 初始化网格世界时,用的狮蚁只数和蚂蚁只数,分别为5只和100只,也定义为类型常量。如: const int INITIALANTS = 100; const int INITIALBUGS = 5;
C++超大整数结构体实现乘法,就像要个乘法,网上的看不懂,希望来回答的能多写点注释或者给我讲讲!菜鸟求大佬
``` #include <stdio.h> #include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; //我们把输入的两个操作数放在结构体中方便解决 //首先,为了方便后面运算,我们先定义一个结构体把超长整数都定义为此类型 struct doublelong{ int d[1000]; //定义一维数组D int len; //下面定义构造函数,初始化,给予长度 doublelong(){ memset(d,0,sizeof(d)); //memset为初始化函数 数组d sizeof求出的d大小赋予空间 指向要填充的内存块d //d用于存放 输入的两个操作数 //全初始化为0 len=0; } }; //大整数使用字符串输入的, //下面将字符串储存的大整数 //存放在结构体中 doublelong change(char str[]){ doublelong a; a.len=strlen(str);//得出输入的大整数长度写入结构体中 for(int i=0;i<a.len;i++){ a.d[i]=str[a.len-i-1]-'0';//这里把大整数的地位切换为高位 反序 } return a; } //比较两个大整数的大小 int compare(doublelong a,doublelong b){ int g; //greater此处返回更大数字 g的值为1时a的值更大,2时b的值更大,为0时两个数字的值相等 //由于我们此函数只比较两个输入数字的绝对值,由于运算方式是单独判断符号所以不对符号进行比较 if(a.len>b.len){ g=1;return g;//a大于b } else if(a.len<b.len){ g=2; return g;//a<b } else{ for(int i=a.len-1;i>=0;i++) //一位位对比一位位读取向后读 { if(a.d[i]>b.d[i]) { g=1;return g; } if(a.d[i]<b.d[i]) { g=2;return g; } if(a.d[i]=b.d[i]) { g=0;return g; } } } } //下面是大数的四则运算法则 doublelong add(doublelong a,doublelong b) { doublelong c; int carry=0;//这里的carry表示进位 for(int i=0;i<a.len||i<b.len;i++) //循环向后读取相加 { int temp=a.d[i]+b.d[i]+carry; c.d[c.len++]=temp%10; //将我们相加得到的temp值给写入我们的输出大整数c中去 carry=temp/10;//求是否有进位 } if(carry!=0) {//如果最后一位的进位不为0,直接付给结果的最高位 c.d[c.len++] =carry; } return c;//程序结束返回doublelong c } void print(doublelong a) { for(int i=a.len-1;i>=0;i--) { printf("%d",a.d[i]); } } ```
数据结构的疑问:不存在从 "int" 转换到 "People" 的适当构造函数?
``` #include<stdio.h> #include<iostream> #define MaxWindow 30 #define MaxProc 1 #define error 0 using namespace std; typedef struct People ElementType; struct People { int T; int P; }; typedef int Position; struct QNode { ElementType *Data; Position Front, Rear; int MaxSize; }; typedef struct QNode *Queue; Queue CreatQueue(int MaxSize) { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); Q->Front = Q->Rear = 0; Q->MaxSize = MaxSize; return Q; } bool IsFull(Queue Q) { return((Q->Rear + 1) % Q->MaxSize == Q->Front); } bool AddQ(Queue Q, ElementType X) { if (IsFull(Q)) { printf("队列满\n"); return false; } else { Q->Rear = (Q->Rear + 1) % Q->MaxSize; Q->Data[Q->Rear] = X; return true; } } bool IsEmpty(Queue Q) { return(Q->Front == Q->Rear); } ElementType DeleteQ(Queue Q) { if (IsEmpty(Q)) { printf("队列空\n"); return 0; } else { Q->Front = (Q->Front + 1) % Q->MaxSize; return Q->Data[Q->Front]; } } void DestroyQueue(Queue Q) { free(Q); } double QueueingAtBank(Queue Q, int N) { struct People Next; int k; int TotalTime; int CurrentTime; int Window[MaxWindow]; int WaitTime; int WinAvail; int i, j; scanf("%d", &k); for (i = 0; i < k; i++) Window[i] = 0; TotalTime = 0; while (!IsEmpty) { WinAvail = FindNextWindow(Window, k, &WaitTime); CurrentTime += WaitTime; Next = DeleteQ(Q); if (CurrentTime >= Next.T) TotalTime += (CurrentTime - Next.T); else { WaitTime = Next.T - CurrentTime; for (j = 0; j < k; j++) { Window[j] -= WaitTime; if (Window[j] < 0) Window[j] = 0; } CurrentTime = Next.T; } Window[WinAvail] = Next.P; } return((double)TotalTime / (double)N); } int FindNextWindow(int W[], int k, int *WaitTime) { int WinAvail; int MinW = MaxProc + 1; int i; for (i = 0; i < k; i++) if (W[i] < MinW) { MinW = W[i]; WinAvail = i; } *WaitTime = MinW; for (i = 0; i < k; i++) W[i] -= MinW; return WinAvail; } int main() { int N; Queue Q; int i; ElementType X; scanf("%d", &N); Q = CreatQueue(N); for (i = 0; i < N; i++) { scanf("%d %d", &X.T, &X.P); AddQ(Q, X); } printf("Average waiting time = %.lf minute(s).\n", QueueingAtBank(Q, N)); DestroyQueue(Q); return 0; } ``` 1 IntelliSense: 不存在从 "int" 转换到 "People" 的适当构造函数 请问各位大佬我这串代码的报错是为什么呀
c++数据结构里面一直有无法解析,该函数在main函数里面被引用,该怎么解决,代码如下
错误如下 错误 LNK1120 8 个无法解析的外部命令 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\Debug\ConsoleApplication2.exe 1 错误 LNK2019 无法解析的外部符号 "public: bool __thiscall CriList<int>::empty(void)" (?empty@?$CriList@H@@QAE_NXZ),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: class Node<int> * __thiscall CriList<int>::insert(int,int)" (?insert@?$CriList@H@@QAEPAV?$Node@H@@HH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: class Node<int> * __thiscall CriList<int>::search(int)" (?search@?$CriList@H@@QAEPAV?$Node@H@@H@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: void __thiscall CriList<int>::set(int,int)" (?set@?$CriList@H@@QAEXHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: __thiscall CriList<int>::CriList<int>(int * const,int)" (??0?$CriList@H@@QAE@QAHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: int __thiscall CriList<int>::count(void)" (?count@?$CriList@H@@QAEHXZ),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 错误 LNK2019 无法解析的外部符号 "public: int __thiscall CriList<int>::get(int)" (?get@?$CriList@H@@QAEHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1 #include"head.h" int main() { Node<int>node(5); int values[9] = { 1,2,3,4,5,7,8,9 }; CriList<int> cl(values, 9); if (cl.empty()) { cout << "不为空" << endl; } else { cout << "空" << endl; } cout << "长度为:" << cl.count() << endl; cout << "在3号位置的是" << cl.get(3) << endl; cout << "把5号位置的数据替换为10" << endl; cl.set(5, 10); cout << "把5号位置插入为12" << endl; cl.insert(5, 12); cl.removeAll(); cout << "查找数据为11的数" << endl; cl.search(11); return 0; } //fun。cpp #include"head.h" template <class T> CriList<T>::CriList()//创建一个空表 { this->head = new Node<T>(); this->head->next = this->head; } template<class T> CriList<T>::CriList(T values[], int n) { int i = 0; head = new Node<T>(); Node<T>*p = head; while (i < n) { Node<T>*q = new Node<T>(); q->data = values[i]; q->next=NULL; p->next = q; p = q; } p->next = head; printf(); } template <class T> bool CriList<T>::empty() { return this->head->next = this->head; } template <class T> int CriList<T>::count() { int i = 0; Node<T>*q = head; while (q->next != head) { i++; } return i; } template <class T> T CriList<T>::get(int i) { int j; Node<T>*p = head; for(j=0;j<i&&p->next!=head;j++) { p = p->next; } if (j == i) { return this->head->data; } } template <class T> void CriList<T>::set(int i, T x) { int j; Node<T>*p = this->head; for (j = 0; j<i&&p->next!=head;j++) { p = p->next; } if (j == i) { p->data = x; } printf(); } template <class T> void CriList<T>::printf() { Node<T>*p = this->head; while (p->next! = head) { cout << p->data << '\t'; } } template<class T> Node<T>* CriList<T>::insert(int i, T x) { int j; Node<T>*p = this->head; for (j = 0; j<i&&p->next != head; j++) { p = p->next; } if (j == i) { Node<T>*q = new Node<T>(); q->data = x; q->next = p->next; p->next = q; } } template<class T> void CriList<T>::removeAll() { Node<T>*q = head; while (q->next != head) { Node<T>*p = new Node<T>(); p = q->next; delete p; p = p->next; } } template<class T> Node<T>*CriList<T>::search(T key) { Node<T>*q = head; while (q->next!= head) { q = q->next; if (q->data == key) { cout << "查找正确" <<endl; } } if (q->next == head) { cout << "查找失败" << endl; } } //head.h #include<iostream> using namespace std; template <class T> class Node { public: T data; Node<T>*next;//指针域分别指向后继结点。 Node()//构造结点,data域未初始化无参构造函数 { this->next = NULL; } Node(T data, Node<T>*next = NULL)//有参构造函数,后继结点默认值为空 { this->data = data; this->next = next; } }; template <class T> class CriList { public: Node<T>*head;//头指针 CriList();//构造空表 CriList(T values[], int n); bool empty();//判断是否为空表 int count();//返回链表的长度 T get(int i);//返回第i个元素 void set(int i, T x);//设置第i个元素为X,虚函数 void printf();//输出循环链表 Node<T>*insert(int i, T x);//插入x作为第i个元素 void removeAll();//清空循环链表 Node<T>*search(T key);//查找关键字位key的元素 };
C++ 在类里面实现链表的合并
我创建了一个类,里面包含链表的输入、输出、排序、打印、合并等等功能。然后我用类定义了两个变量,但是实现他们合并的时候懵了,这个函数应该要获取两个链表的头结点,我就不知道该怎么获取了,因为头结点是私有在类中的,求帮助!!! ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492359556_374242.png) ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492359570_898892.png) 主函数里面只输入了链表的长度,第二张图是结构体跟类的构造函数那部分
c++关于实现分组密码,轮函数要用到线返
基于feistel结构构造一个分组密码算法。要求: 1.分组长度=128bit 2.主密钥长度>=128bit 3.轮数=16 4.轮函数的设计要用到LFSR
关于散列表中除留余数法构造的散列函数,除数选择素数的疑问
正在学习数据结构里的散列相关知识,书里一般都会提到,如果用除留余数的散列函数,最好选择素数作为除数。但没有对此详细的证明。 对此不太理解,个人理解是,无论素数还是合数,在取模的一个周期内都是均匀分布的单射的,并不会因为除数有质因数改变分布和冲突情况。 看了一些其他文章,也没有具有普遍性的证明。有的文章中会用一个特例来说明素数作除数更好,但特例不能证明一般性(例如有的文章中会拿一个具有公因数3的数列为key,然后mod6,结果表明这些key都被散列在0、3、6的地址上,以此来说明除数不应该用合数。但这个观点显然站不住脚,因为我也可以举一个具有公因数7的序列为key来mod7,也会造成严重冲突,而7是素数) 对于平常的应用中,如果散列的key通常不具有普遍的规律(例如都是某个数的倍数)而更倾向于随机性(比如储存一些号码,没有特殊规律),在这种随机输入的情况下是不是除数是否是素数不影响散列产生冲突的情况?如果依然有影响,能否有详细的具有普适性的证明 本人才疏学浅,想不通这个问题,特来请教
问个关于jNI返回结构体的问题,请教一下a
如果要返回两个值则 [code=C/C++][/code]JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_CMFJ_getStruct (JNIEnv *env, jobject obj) { //获取Java中的实例类 jclass objectClass = (*env)-> FindClass(env,"com/sundy/jnidemo/DiskInfo"); //获取Java中的构造函数 jmethodID init = (*env)->GetMethodID(env, objectClass , "<init>", "(Ljava/lang/String;I)V"); //调用构造函数创建对象,写入名字和序列号 jobject newObj = (*env)->NewObject(env, objectClass, init, (*env)->NewStringUTF(env, "my name is D:"), 10); //返回创建的对象 return newObj; } 那如果要返回四个则怎么写呢,我总是不出结果
谁能帮我解决一个简单程序
1、多个类的继承关系画出结构图(五个以上类) 2、定义五个以上类 ,每个类写出类的定义(2个文件) 3、使用静态数据成员和静态成员函数 4、要求有基类和派生类的构造函数 和至少一个析构函数) 5运算符重载 成员函数或友元函数 6、实现多重继承和虚基类 7、使用抽象类,实现多态性 8、主函数
内部排序的性能分析:函数调用的问题?在主函数中用一种方法排序后,排好序的顺序表被带回主函数,再用另一种方法排序等于没用了
原先用的void insertsort(Sqlist &L),改成void insertsort(Sqlist L)还是不行,形参不是传值调用主函数不会改变嚒? 已经测试排序的代码没有问题,单独使用一种方法没有问题,几种同时使用才会出问题, ![图片说明](https://img-ask.csdn.net/upload/201912/09/1575891779_129272.png) 第一行:随机生成的顺序表 第二行:Insert排序后的顺序表 第三行:比较次数,移动次数 第四行:Shell排序前的顺序表 第五行:Shell排序后的顺序表 可以看出shell根本不需要排序,移动次数为0...... 代码太长截取一部分有用的: ``` #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<stdlib.h> #include<time.h> typedef int Position; typedef int ElemType; typedef int Status; int compare1=0,compare2=0,compare3=0,compare4=0,compare5=0,compare6=0;//比较次数 int move1 = 0, move2 = 0, move3 = 0, move4 = 0, move5 = 0, move6 = 0;//移动次数 ElemType*p, *q; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1; #define TRUE 1; #define FALSE 0; #define ERROR 0; #define OVERFLOW -2; /*①SqList.h线性表的动态分配顺序存储结构*/ typedef struct { int key; }lkey; typedef struct { lkey *elem; int length; int listsize; }SqList; /*②顺序表基本操作接口定义*/ //操作结果:构造一个空的线性表 Status InitList_Sq(SqList &L); //操作结果:在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e); //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)); //将元素e的值打印出来 Status visit_sp(ElemType e); //直接插入排序 void InsertSort(SqList L); //希尔排序 void ShellSort(SqList L, int dlta[], int t); void Shell(SqList L, int dk);//一趟希尔插入排序 //起泡排序 void BubbleSort(SqList L); //快速排序 void QuickSort(SqList L); void Quick(SqList L, int low, int high); int QsortPartion(SqList L, int low, int high);//一趟快速排序 //简单选择排序 void SelectSort(SqList L); //堆排序 void HeapSort(SqList L); void HeapAdjust(SqList L, int s, int m);//建大顶堆函数 //随机生成数构造线性表 Status InitList_Sq(SqList &L) { int i; L.elem = (lkey*)malloc(LIST_INIT_SIZE * sizeof(lkey)); if (!L.elem)exit(-2); L.length = 0; L.listsize = LIST_INIT_SIZE; //srand((unsigned)time(NULL)); for (i = 1; i < 15; i++) { L.elem[i].key = rand() % 100 + 1; ListInsert_Sq(L, i, L.elem[i].key); } return OK; /*请参考课本上的算法2.3*/ } //在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e) { if (i<1 || i>L.length + 1) return ERROR; if (L.length >= L.listsize) { lkey*newbase = (lkey*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(lkey)); if (!newbase)return ERROR; L.elem = newbase; L.listsize += LISTINCREMENT; } q = &(L.elem[i - 1].key); for (p = &(L.elem[L.length - 1].key); p >= q; --p) *(p + 1) = *p; *q = e; ++L.length; return OK; /*请参考课本上的算法2.4*/ } //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)) { int i; for (i = 1; i <= L.length; i++) (*visit)(L.elem[i - 1].key); printf("\n"); return OK; } //将元素e的值打印出来 Status visit_sp(ElemType e) { printf("%d ", e); return OK; } //直接插入排序 void InsertSort(SqList L) { int compare1 = 0, move1 = 0; int i=0, j=0; lkey rc; for (i = 1; i<L.length; ++i)//从第二个开始 { compare1++; if (L.elem[i].key < L.elem[i - 1].key) { move1 += 2; rc = L.elem[i]; L.elem[i] = L.elem[i - 1]; for (j = i - 2; j >= 0 && rc.key < L.elem[j].key; --j)//从i-2个开始 { compare1++; L.elem[j + 1] = L.elem[j]; move1++; } L.elem[j + 1] = rc; move1 += 3; } } ListTraverse_Sq(L,visit_sp); printf("%d %d\n", compare1, move1); } //希尔排序 void ShellSort(SqList L, int dlta[], int t) { ListTraverse_Sq(L, visit_sp); int k; for (k = 0; k < t; k++) Shell(L, dlta[k]); ListTraverse_Sq(L, visit_sp); printf("%d %d\n", compare2, move2); } void Shell(SqList L, int dk)//一趟希尔插入排序 { lkey rc; int j; for (int i = dk; i < L.length; i++) { compare2++; if (L.elem[i].key < L.elem[i - dk].key)//比较i和i-dk { rc = L.elem[i]; move2++; for (j = i - dk; j >= 0 && (rc.key < L.elem[j].key); j -= dk)//[6]和[3],[0]比较 { compare2++; L.elem[j + dk] = L.elem[j];//记录后移,查找插入位置 move2++; } L.elem[j + dk] = rc;//插入 move2++; } } } int main() { SqList L; int i; int dita[3] = { 5,3,1 }, t = 3; for (i = 0; i <= 5; i++) { printf("当前随机数为:\n"); InitList_Sq(L); ListTraverse_Sq(L, visit_sp); InsertSort(L); ShellSort(L, dita, t); //BubbleSort(L); //QuickSort(L); //SelectSort(L); //HeapSort(L); /*printf("------|-比较次数-||-移动次数-|\n"); printf("Insert| %d || %d |\n", compare1, move1); printf("Shell | %d || %d |\n", compare2, move2); printf("Bubble| %d || %d |\n", compare3, move3); printf("Quick | %d || %d |\n", compare4, move4); printf("Select| %d || %d |\n", compare5, move5); printf("Heap | %d || %d |\n", compare6, move6);*/ } system("pause"); return 0; } ```
数据结构C++写一个表达式二叉树
如何声明一个Operators运算符集合类,提供运算符及其优先级,按优先级比较运算符大小的函数,两个操作数进行指定运算的函数等 还有如何将一个表达式以前缀表达式构造,用递归算法
新手问,C++类方法中不能创建别的结构的变量吗?
初学c++,想综合练习一下结构和类。 我定义了 1:一个Formula类,主要用于保存某种公式; 2:一个Fml_LNode结构,包含Formula对象和Fml_LNode指针,用于将Formula对象存储为单链表形式; 3:一个Fml_LList类,包含上述链表的结点数、头指针和尾指针,以及成员函数add()。如代码所示。 ``` class Formula { private: gem src; gem pro; public: Formula(gem sc, gem pr); ~Formula() {}; void show(); }; struct Fml_LNode { Formula fml; Fml_LNode *next; }; class Fml_LList { private: int num_of_formulas; Fml_LNode *L; Fml_LNode *rear; public: void add(Formula & fml); }; ``` add()方法的功能是接受一个Formula公式对象的引用,尾插法加入到链表中,代码为: ``` void Fml_LList::add(Formula & newfml) { num_of_formulas++; int a; rear = new Fml_LNode; rear->fml = newfml; rear->next = NULL; rear = rear->next; } ``` 遇到问题: 在新建链表结点那一行,编译器提示不能”尝试引用已删除的函数“。 ![图片说明](https://img-ask.csdn.net/upload/201901/13/1547378030_779619.png) ![图片说明](https://img-ask.csdn.net/upload/201901/13/1547378141_738901.png) 我明明是用结构体变量,这和构造函数啥的又有什么关系呢?如果不能则么做,希望能提供一个思路谢谢大家
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
小白如何学习java?
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
羞,Java 字符串拼接竟然有这么多姿势
二哥,我今年大二,看你分享的《阿里巴巴 Java 开发手册》上有一段内容说:“循环体内,拼接字符串最好使用 StringBuilder 的 append 方法,而不是 + 号操作符。”到底为什么啊,我平常一直就用的‘+’号操作符啊!二哥有空的时候能否写一篇文章分析一下呢? 就在昨天,一位叫小菜的读者微信我说了上面这段话。 我当时看到这条微信的第一感觉是:小菜你也太菜了吧,这都不知道为啥啊!我估
"狗屁不通文章生成器"登顶GitHub热榜,分分钟写出万字形式主义大作
GitHub 被誉为全球最大的同性交友网站,……,陪伴我们已经走过 10+ 年时间,它托管了大量的软件代码,同时也承载了程序员无尽的欢乐。 万字申请,废话报告,魔幻形式主义大作怎么写?兄dei,狗屁不通文章生成器了解一下。这个富有灵魂的项目名吸引了众人的目光。项目仅仅诞生一周,便冲上了GitHub趋势榜榜首(Js中文网 -前端进阶资源教程)、是榜首哦
推荐几款比较实用的工具,网站
1.盘百度PanDownload   这个云盘工具是免费的,可以进行资源搜索,提速(偶尔会抽风......) 不要去某站买付费的......   PanDownload下载地址   2.BeJSON 这是一款拥有各种在线工具的网站,推荐它的主要原因是网站简洁,功能齐全,广告相比其他广告好太多了     bejson网站   3.二维码美化 这个网站的二维码美化很好看,网站界面
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
碎片化的时代,如何学习
今天周末,和大家聊聊学习这件事情。 在如今这个社会,我们的时间被各类 APP 撕的粉碎。 刷知乎、刷微博、刷朋友圈; 看论坛、看博客、看公号; 等等形形色色的信息和知识获取方式一个都不错过。 貌似学了很多,但是却感觉没什么用。 要解决上面这些问题,首先要分清楚一点,什么是信息,什么是知识。 那什么是信息呢? 你一切听到的、看到的,都是信息,比如微博上的明星出轨、微信中的表情大战、抖音上的段子
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
相关热词 c#处理浮点数 c# 生成字母数字随机数 c# 动态曲线 控件 c# oracle 开发 c#选择字体大小的控件 c# usb 批量传输 c#10进制转8进制 c#转base64 c# 科学计算 c#下拉列表获取串口
立即提问