c++数据结构里面一直有无法解析,该函数在main函数里面被引用,该怎么解决,代码如下

错误如下
错误 LNK1120 8 个无法解析的外部命令 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\Debug\ConsoleApplication2.exe 1

错误 LNK2019 无法解析的外部符号 "public: bool __thiscall CriList::empty(void)" (?empty@?$CriList@H@@QAE_NXZ),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

错误 LNK2019 无法解析的外部符号 "public: class Node * __thiscall CriList::insert(int,int)" (?insert@?$CriList@H@@QAEPAV?$Node@H@@HH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

错误 LNK2019 无法解析的外部符号 "public: class Node * __thiscall CriList::search(int)" (?search@?$CriList@H@@QAEPAV?$Node@H@@H@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

错误 LNK2019 无法解析的外部符号 "public: void __thiscall CriList::set(int,int)" (?set@?$CriList@H@@QAEXHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

错误 LNK2019 无法解析的外部符号 "public: __thiscall CriList::CriList(int * const,int)" (??0?$CriList@H@@QAE@QAHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

错误 LNK2019 无法解析的外部符号 "public: int __thiscall CriList::count(void)" (?count@?$CriList@H@@QAEHXZ),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

错误 LNK2019 无法解析的外部符号 "public: int __thiscall CriList::get(int)" (?get@?$CriList@H@@QAEHH@Z),该符号在函数 _main 中被引用 ConsoleApplication2 E:\数据结构与算法暑假\ConsoleApplication2\ConsoleApplication2\main.obj 1

#include"head.h"
int main()
{
Nodenode(5);
int values[9] = { 1,2,3,4,5,7,8,9 };
CriList 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
CriList::CriList()//创建一个空表
{
this->head = new Node();
this->head->next = this->head;
}
template
CriList::CriList(T values[], int n)
{
int i = 0;
head = new Node();
Node*p = head;
while (i < n)
{
Node*q = new Node();
q->data = values[i];
q->next=NULL;
p->next = q;
p = q;
}
p->next = head;
printf();
}
template
bool CriList::empty()
{
return this->head->next = this->head;
}
template
int CriList::count()
{
int i = 0;
Node*q = head;
while (q->next != head)
{
i++;
}

return i;

}
template
T CriList::get(int i)
{
int j;
Nodep = head;
for(j=0;jnext!=head;j++)
{
p = p->next;
}
if (j == i)
{
return this->head->data;
}
}
template
void CriList::set(int i, T x)
{
int j;
Node*p = this->head;
for (j = 0; jnext!=head;j++)
{
p = p->next;
}
if (j == i)
{
p->data = x;
}
printf();
}
template
void CriList::printf()
{
Node*p = this->head;
while (p->next! = head)
{
cout << p->data << '\t';
}
}
template
Node
CriList::insert(int i, T x)
{
int j;
Node*p = this->head;
for (j = 0; jnext != head; j++)
{
p = p->next;
}
if (j == i)
{
Node*q = new Node();
q->data = x;
q->next = p->next;
p->next = q;
}
}
template
void CriList::removeAll()
{
Node*q = head;
while (q->next != head)
{
Node*p = new Node();
p = q->next;
delete p;
p = p->next;
}
}
template
Node*CriList::search(T key)
{
Node*q = head;
while (q->next!= head)
{
q = q->next;
if (q->data == key)
{
cout << "查找正确" < }
}
if (q->next == head)
{
cout << "查找失败" << endl;
}
}
//head.h
#include
using namespace std;
template
class Node
{
public:
T data;
Node*next;//指针域分别指向后继结点。
Node()//构造结点,data域未初始化无参构造函数
{
this->next = NULL;
}
Node(T data, Node*next = NULL)//有参构造函数,后继结点默认值为空
{
this->data = data;
this->next = next;
}
};
template
class CriList
{
public:
Node*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*insert(int i, T x);//插入x作为第i个元素
void removeAll();//清空循环链表
Node*search(T key);//查找关键字位key的元素
};

5个回答

template
我记得模板的声明和实现必须在一个文件里 否则无法识别

CriList<int> cl(values, 9);

不理解你想问的问题是什么

TaoXiaoT
陶小童 就是想解决上面的那些错误
接近 3 年之前 回复

这个是你没有链接成功~请保证.cpp中可看到.h

在main()函数中,实例化类对象时没有传入模板参数。应该这样写:
```CriList cl(values, 9);
//其余的同理


qwertyuiop1321
qwertyuiop1321 这个粘贴错了,题主粘贴的时候是不是也是这种问题
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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的元素 };

template分文件出错问题

将template放到.h和.cpp中就会出现 1>MSVCRTD.lib(exe_main.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用 1>E:\wzb\c++练习编程\数据结构\线索二叉树模板\Debug\线索二叉树模板.exe : fatal error LNK1120: 1 个无法解析的外部命令 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 放到1个文件中就可以,这种情况如何解决??vs2015.求大神解答

c++ 的模板问题,如何定义构造函数

stack.hpp: ``` #pragma once template<typename T> class Stack { public: Stack(void); ~Stack(); Stack(const Stack&); Stack& operator=(const Stack&); unsigned count() { return vused_; } void push(const T&); T& pop(); private: T* v_; unsigned vsize_; unsigned vused_; }; ``` stack.cpp: ``` #include "stack.hpp" #include<exception> template<typename T> Stack<T>::Stack():vsize_(10),vused_(0){ v_ = new T[vsize_]; } template<typename T> Stack<T>::Stack(const Stack& stack) { if (stack.vsize_ > vsize_) { vsize_ = stack.vsize_; } copy(stack.v_->begin(), stack.v_->end(), v_->begin()); } template<typename T> Stack<T>& Stack<T>::operator=(const Stack& stack) { if (stack.vsize_ > vsize_) { vsize_ = stack.vsize_; } copy(stack.v_->begin(), stack.v_->end(), v_->begin()); return *this; } template<typename T> void Stack<T>::push(const T& t) { if(vused_ >= vsize_ -1 ){ vsize_ = vused_ << 2; } delete[] v_; T v = new T[vsize_]; swap(v_, v); delete[] v; v_[vused_] = t; ++vused_; } template<typename T> T& Stack<T>::pop() { T* t=new T; try { swap(*t, v_[vused_]); } catch (exception e) { cout << e << endl; } delete v_[vused_]; --vused_; return *t; } template<typename T> Stack<T>::~Stack() { vused_ = 0; vsize_ = 0; delete[] v_; v_ = nullptr; } ``` main.cpp: ``` #include<stdio.h> #include<iostream> #include"stack.hpp" int main(void) { Stack<int> s; s.push(10); s.push(20); s.push(5.3f); int i; for (i = 0; i < 12; ++i) { s.push(2); } return 0; getchar(); } ``` 编译报错: 1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Stack<int>::Stack<int>(void)" (??0?$Stack@H@@QAE@XZ),该符号在函数 _main 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Stack<int>::~Stack<int>(void)" (??1?$Stack@H@@QAE@XZ),该符号在函数 _main 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Stack<int>::push(int const &)" (?push@?$Stack@H@@QAEXABH@Z),该符号在函数 _main 中被引用 1>c:\users\ivy\documents\visual studio 2015\Projects\AboutException\Debug\AboutException.exe : fatal error LNK1120: 3 个无法解析的外部命令 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

fatal error LNK1120: 1 个无法解析的外部命令

在//初识输入输出 /*程序1的作用是实现两个数的相加*/ #define zt system("pause") #include<iostream> using namespace std; int jia(int &a,int &b) { return (a+b); } int main() { int jia(int &a,int &b); int a,b; cout<<"请输入两个相加的数字"<<endl; cin >>a>>b; int z; z=jia(a,b); cout<<"输出相加后数字的值"<<endl; cout <<"a+b="<<z<<endl; cout <<jia(a,b)<<endl; zt; return 0; } 显示的错误是fatal error LNK1120: 1 个无法解析的外部命令

LNK2019: 无法解析的外部符号

本人在学数据结构--循环链表,源代码为实现一个循环链表,目前只定义了构造函数、dequeue()和enqueue()。其中dequeue()和enqueue()分别为删除和增加节点,当尝试调试enqueue(),出现了错误 #include<iostream> #ifndef CLQUEUE_H #define CLQUEUE_H typedef int QueueElement; class CLQueue{ public: CLQueue(); ~CLQueue(); const CLQueue& operator= (const CLQueue& original); CLQueue(const CLQueue& original); bool empty(); void enqueue(QueueElement value); void dequeue(); void front(); void diaplay(); private: class Node{ public: QueueElement data; Node* next; Node(QueueElement value, Node* link = 0) :data(value), next(link){} }; typedef Node* NodePointer; NodePointer myBack; }; #endif using namespace std; #include"CLQueue.h" CLQueue::CLQueue() :myBack(0){} void CLQueue::enqueue(QueueElement value){ NodePointer newPtr = new CLQueue::Node(value); if (empty()){ myBack->next = newPtr; myBack = newPtr; } else{ newPtr->next = myBack->next; myBack->next = newPtr; myBack = newPtr; } } void CLQueue::dequeue(){ if (!empty()){ CLQueue::NodePointer dePtr = myBack->next; if (dePtr->next == dePtr) myBack = 0; else myBack->next = dePtr->next; delete dePtr; } else cerr << "The CLQueue is empty\n"; } bool CLQueue::empty(){ return myBack == 0; } using namespace std; #include"CLQueue.h" int main(){ CLQueue clq; for (int i = 0; i < 5; i++) clq.enqueue(i); cout << "Enquue*******\n"; } main.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CLQueue::~CLQueue(void)" (??1CLQueue@@QAE@XZ),该符号在函数 "void __cdecl exercise8_3_8(void)" (?exercise8_3_8@@YAXXZ) 中被引用 1>E:\VC++\ADT\ADTch8\Debug\ADTch8.exe : fatal error LNK1120: 1 个无法解析的外部命令

是课后作业不太会做 求大神帮忙

1.采用链式存储实现栈的初始化、入栈、出栈操作。 2. 结构体部分代码: typedef struct node { int data; struct node *next; }StackNode,*LinkStack; //定义栈结构 LinkStack Init_LinkStack() { return NULL; } //初始化 函数(a): LinkStack Push_LinkStack(LinkStack top,int x)//入栈 {…} 函数(b): LinkStack Pop_LinkStack(LinkStack top,int x)//出栈 {…} 3.要求:(1)完成函数(a),函数(b)中的算法; (2)编写 main()函数,并调用上述两个函数,输出结果。输入1,2,3,4,5,6,完成入栈操作并显示在屏幕上 (3)调用函数(b)将栈中元素输出到屏幕上

如何处理以下问题,大神帮忙看下,指针在函数中用引用型怎么使用

void main(){ LinkList L; BOOL temp; int num, loc, flag = 1; char j; Stu stu; printf("本程序实现链式结构的线性表操作: 插入,删除,定位,查找等\n"); printf("请输入初始链表长度:"); //输入生成单链表时的元素个数 scanf_s("%d", &num); CreatList(L, num); //生成单链表 ListPrint(L); while (flag) { printf("请选择:\n"); printf("1.显示所有学生记录\n"); //显示链表元素 printf("2.插入一个学生记录\n"); //插入链表元素 printf("3.删除一个学生记录\n"); //删除链表元素 printf("4.按关键字查找对应的学生记录\n"); //按关键字查找 printf("5.按结点序号查找学生记录\n"); //按结点序号查找 printf("6.退出程序 \n"); //退出 scanf_s(" %c", &j); switch (j){ case '1': ListPrint(L); break; case '2': printf("请插入位置和输入元素(学生记录):\n"); printf("格式: 位置 学号 姓名 分数;例如:3,1001,张三,95.5\n"); //输入要插入的元素和要插入的位置 scanf_s("%d %d %s %f", &loc, &stu.sn, &stu.name, &stu.score); temp = ListInsert(L, loc, stu); //插入 if (temp == False) printf("插入失败!\n"); else printf("插入成功!\n"); ListPrint(L); break; case '3': printf("请输入要删除元素的结点位置:"); scanf_s("%d", &loc); //输入要删除的节点的位置 temp = ListDelete(L, loc, stu); //删除 if (temp == False) printf("删除失败!\n"); //删除成功,显示该元素 else printf("成功删除了一个元素:%d,%s,%.2f\n", stu.sn, stu.name, stu.score); ListPrint(L); break; case '4': if (L->next == NULL) printf("链表为空!\n"); else{ printf("请输入查找元素(学号 姓名 分数):"); scanf_s("%d %s %f", &stu.sn, &stu.name, &stu.score); //输入要查找的元素 temp = ListFind_keyword(L, stu, loc); //按关键字查找 if (temp == False) printf("没有找到该元素!\n"); else printf("该元素在链表的第%d 个结点\n", loc); } break; case '5': if (L->next == NULL) printf("链表为空!\n"); //链表为空 else{ printf("请输入查找位置:"); scanf_s("%d", &loc); //输入查找元素的位置 temp = ListFind_loc(L, loc, stu); //按结点序号查找 if (temp == False) printf("该位置不存在!\n"); else printf("第%d 个元素是:%d %s %.2f\n", loc, stu.sn, stu.name, stu.score); } break; default: flag = 0; DestroyLink(L); //销毁链表,回收空间 printf("程序结束,按任意键退出!\n"); } } } 头文件: #ifndef _LINK_H #define _LINK_H #include <stdlib.h> #include <stdio.h> #include <conio.h> enum BOOL{ False, True }; //定义 BOOL 型 typedef struct{ int sn; char name[10]; float score; }Stu; typedef Stu ElemType; typedef struct node{ ElemType data; //数据域 struct node *next; //指向下一个节点的指针 }LNode, *LinkList; void CreatList(LinkList &L, int n); //在单链表的第 i 各位置插入元素 e,成功返回 True,失败返回 False BOOL ListInsert(LinkList &L, int i, ElemType e); //在单链表中删除第 i 个元素,成功删除返回 True,并用 e 返回该元素值,失败返回 False BOOL ListDelete(LinkList &L, int i, ElemType &e); //在单链表中查找关键字为 e 的元素,成功返回 True,并用 i 返回该元素位置,失败返回 False BOOL ListFind_keyword(LinkList L, ElemType e, int &i); //在单链表中查找第 i 个元素,成功返回 True,并用 e 返回该元素值,失败返回 False BOOL ListFind_loc(LinkList L, int i, ElemType &e); void ListPrint(LinkList L); //显示链表所有元素 void DestroyLink(LinkList &L); //删除链表,回收内存空间 int CompareElemType(ElemType a, ElemType b); //比较结构体数据的异同 #endif 另一个头文件: #include <string.h> void CreatList(LinkList &L, int n){ //生成一个带头结点的有 n 个元素的单链表 int i; LinkList p; L = (LinkList)malloc(sizeof(LNode)); //申请生成头结点 if (!L) exit(1); L->next = NULL; printf("使用头插法,请逆序位输入%d 个学生信息(学号 姓名 分数),如 101 张三 97.5: \n",n); getchar(); for (i = n; i>0; --i) { //头插法 p = (LinkList)malloc(sizeof(LNode)); //申请生成新结点 if (!p) exit(1); scanf("%d %s %f", &p->data.sn, &p->data.name, &p->data.score); p->next = L->next; L->next = p; } printf("%d 个结点的链表已经建立\n", n); } BOOL ListInsert(LinkList &L, int i, ElemType e){ //在单链表的第 i 各位置插入元素 e,成功返回 True,失败返回 False LinkList s, p = L; int j = 0; while (p && j<i - 1) { //找到第 i-1 个结点的位置 p = p->next; ++j; } if (!p || j>i - 1) return False; //i<1 或者 i 大于表长+1 s = (LinkList)malloc(sizeof(LNode)); //申请生成一个新结点 if (!s) exit(1); //将新结点插入到单链表中 s->data.sn = e.sn; strcpy(s->data.name, e.name); s->data.score = e.score; s->next = p->next; p->next = s; return True; } BOOL ListDelete(LinkList &L, int i, ElemType &e){//在单链表中删除第 i 个元素,成功删除返回 True,并用 e 返回该元素值,失败返回 False LinkList q, p = L; int j = 0; while (p->next && j<i - 1){ //查找第 i-1 个结点位置 p = p->next; ++j; } if (!(p->next) || j>i - 1) return False; //删除位置不合理 q = p->next; p->next = q->next; //删除该元素 e.sn = q->data.sn; strcpy(e.name, q->data.name); e.score = q->data.score; //e 取得该元素值 free(q); //释放该元素空间 return True; } BOOL ListFind_keyword(LinkList L, ElemType e, int &i){ //在单链表中查找关键字为 e 的元素,成功返回 True,并用 i 返回该元素位置,失败返回 False i = 1; LinkList p = L->next; ElemType a = p->data; while (p && !(CompareElemType(a, e))){ //p 指针指向下一个,直到找到关键字 e 或到 链表尾为止 p = p->next; i++; } if (!p || !(CompareElemType(a, e))) return False; //该元素在链表中不存在 else return True; } BOOL ListFind_loc(LinkList L, int i, ElemType &e){ //在单链表中查找第 i 个元素,成功返回 True, 并用 e 返回该元素值,失败返回 False LinkList p = L->next; int j = 1; while (p && j<i) { //移动指针,直到找到第 i 个元素或 p 为 NULL p = p->next; ++j; } if (!p || j>i) return False; //第 i 个元素不存在 e.sn = p->data.sn; strcpy(e.name, p->data.name); e.score = p->data.score; //查找成功,用 e 取得 第 i 个元素值 return True; } void ListPrint(LinkList L) {//显示链表所有元素 LinkList q = L->next; printf("链表所有元素:\n"); while (q){ printf("学号:%10d 姓名:%13s 分数:%10.2f\n", q->data.sn, q->data.name, q->data.score); q = q->next; } printf("\n"); } void DestroyLink(LinkList &L){ //删除链表,回收内存空间 LinkList q; while (L){ q = L->next; free(L); L = q; } printf("链表已经销毁\n"); } int CompareElemType(ElemType a, ElemType b){ //比较结构体数据的异同 if (a.sn == b.sn && a.score == b.score && strcmp(a.name, b.name) == 0) return 1; else return 0; 我运行有这个错误,为什么: 错误 1 error LNK2019: 无法解析的外部符号 "void __cdecl create(struct LNode *

C/C++ socket tcp 发送和接收数据问题

客户端和服务器之间发送的一个数据正常,但当发送第二个数据后便出现了问题。求大神帮忙看一哈: 代码如下: client端: #include <WINSOCK2.H> #include <STDIO.H> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0) { return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sclient == INVALID_SOCKET) { printf("invalid socket !"); return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(1000); serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); /**************************************** int WSA_return; WSADATA WSAData; WSA_return=WSAStartup(0x0101,&WSAData); hostent *host_entry;// 结构指针 char host_name[256] ="manage.dgjgw.cn"; if(WSA_return==0) { host_entry=gethostbyname(host_name);// 即要解析的域名或主机名 printf("%s\n", host_name); if(host_entry!=0) { printf("解析ip地址: "); printf("%s",inet_ntoa(*((struct in_addr*)host_entry->h_addr))); } } serAddr.sin_addr.S_un.S_addr = inet_addr((char*)inet_ntoa(*((struct in_addr*)host_entry->h_addr))); ****************************************/ //接收缓存区 int nRecvBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)); //发送缓冲区 int nSendBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int)); printf("连接中》》》》》》》》》\n"); //连接1 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connect error !\n"); closesocket(sclient); return 0; } else { printf(" connect success !\n"); } //连接2 while (true) { char sendData[10] ={0x05,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33}; char sendData1[2] ={0x05,0x03}; cout<<"请输入指令"<<endl; int a=0; cin>>a; switch(a) { case 1: printf("发送注册消息\n"); send(sclient, sendData, strlen(sendData), 0); break; case 2: printf("发送心跳消息\n"); send(sclient, sendData1, strlen(sendData1), 0); break; default : cout<<"输入错误"<<endl; break; } char recData[2]; memset(recData,0,2); int ret=0; ret = recv(sclient, recData, 2, 0); if(ret > 0) { printf("信息发送成功,回执如下\n"); for(int i=0;i<=ret;i++) { printf("%x",recData[i]); } printf("\n"); } else { printf("信息发送失败,关闭客户端\n"); break; } memset(recData,0,2); closesocket(sclient); } system("pause"); closesocket(sclient); WSACleanup(); return 0; } sever端: //#include "stdafx.h" #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { //初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(sockVersion, &wsaData)!=0) { return 0; } //创建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(slisten == INVALID_SOCKET) { printf("socket error !"); return 0; } //绑定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(1000); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("bind error !"); } //开始监听 if(listen(slisten, 5) == SOCKET_ERROR) { printf("listen error !"); return 0; } //循环接收数据 SOCKET sClient; sockaddr_in remoteAddr; int nAddrlen = sizeof(remoteAddr); char revData[255]; while (true) { printf("等待连接...\n"); sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); if(sClient == INVALID_SOCKET) { printf("accept error !"); continue; } printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); //接收数据 char revData[10]; memset(revData,0,10); int ret= recv(sClient, revData, 10, 0); if(ret > 0) { printf("消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); } else { printf("消息接收失败:\n"); } while(revData[0]==0x05&&revData[1]==0x01&&revData[2]==0x33&&revData[3]==0x33&&revData[4]==0x33 &&revData[5]==0x33&&revData[6]==0x33&&revData[7]==0x33&&revData[8]==0x33&&revData[9]==0x33) { printf("注册消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); char sendData1[2]; sendData1[0]=0x05; sendData1[1]=0x02; send(sClient, sendData1, 2, 0); break; } while(revData[0]==0x05&&revData[1]==0x03) { printf("心跳消息接收成功:\n"); for(int i=0;i<2;i++) { printf("%x",revData[i]); } printf("\n"); char sendData[2]; sendData[0]=0x05; sendData[1]=0x04; send(sClient, sendData, 2, 0); break; } } closesocket(sClient); closesocket(slisten); WSACleanup(); return 0; }

利用winpcap抓包,已经可以抓包,但如何解析包头结构按字段写入文本文件?后面应该添加什么代码?

``` #define HAVE_REMOTE #include <pcap.h> /* packet handler 函数原型 */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); int main() { pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; /* 获取本机设备列表 */ if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 打印列表 */ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if(i==0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return -1; } printf("Enter the interface number (1-%d):",i); scanf("%d", &inum); if(inum < 1 || inum > i) { printf("\nInterface number out of range.\n"); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } /* 跳转到选中的适配器 */ for(d=alldevs, i=0; i< inum-1 ; d=d->next, i++); /* 打开设备 */ if ( (adhandle= pcap_open(d->name, // 设备名 65535, // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容 PCAP_OPENFLAG_PROMISCUOUS, // 混杂模式 1000, // 读取超时时间 NULL, // 远程机器验证 errbuf // 错误缓冲池 ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); /* 释放设备列表 */ pcap_freealldevs(alldevs); return -1; } printf("\nlistening on %s...\n", d->description); /* 释放设备列表 */ pcap_freealldevs(alldevs); /* 开始捕获 */ pcap_loop(adhandle, 0, packet_handler, NULL); return 0; } /* 每次捕获到数据包时,libpcap都会自动调用这个回调函数 */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { struct tm *ltime; char timestr[16]; time_t local_tv_sec; /* 将时间戳转换成可识别的格式 */ local_tv_sec = header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6ld len:%d\n", timestr, header->ts.tv_usec, header->len); } ```

这是一个关于数据结构链表 前插法 的指针内容问题

``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 #define ERROR -1 using namespace std; typedef int Status; #define OK 1 typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { Book data; LNode *next; }LNode,*List; Status InitList(List &L) { L=new LNode(); /*if(!B) exit(-1); else */ L->next=NULL; return OK; } Status GetElem(int i,List L,ElemType &e) { List P=L->next; int j=1; while(P&&j<1) { P=P->next; ++j; } if(!P||j<i) return ERROR; e=P->data; return OK; } Status QianCha(List Head,List L,List shou) { if(Head->next=NULL) { Head->next=L; L->next=shou; } else { Head->next=L->next; L->next=NULL; } return 0; } void Q(LNode * &L,int n) { L=new LNode(); L->next=NULL; cout<<L->next; for(int i=0;i<n;i++) { LNode *p=new LNode(); cin>>(p->data.price); p->next=L->next; L->next=p; } } int main() { Book e; /* 注释代码不用看! LNode *tou=NULL; List LL=NULL; List MM=NULL; InitList(tou); List BBB=NULL; InitList(BBB); InitList(LL); InitList(MM); QianCha(tou,BBB,LL); QianCha(tou,,BBB); GetElem(1,tou,e); */ LNode * haha; Q(haha,4); cout<<e.price; getch(); return 0; } ``` 这是我写代码,在调试Q函数(即前插法制造链表)过程中发现 ![图片说明](https://img-ask.csdn.net/upload/201912/29/1577595606_492880.png) L——>next没有值(我很奇怪,因为L是LNode类型指针,它的next被赋值NULL后应该为0000) (*L)->next为000000 这个好奇怪,L是指针类型,那么(*L)就是值类型,值类型不能用->写法的,而且最终得0,也非常奇怪

谁能帮我解释下 这个代码 然后最好能让里面数据显示到listview中去

package com.httppost.main; import java.io.IOException; import java.io.InterruptedIOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpConnectionParams; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class HttpPostActivity extends Activity { TextView textView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取main这个页面 Button jsonBtn = (Button) findViewById(R.id.get_array_json); //获取组件 jsonBtn.setOnClickListener(jsonClick); //监听按键 Button listBtn = (Button) findViewById(R.id.get_list_json); listBtn.setOnClickListener(listClick); } //获取单个json封装的数据 OnClickListener jsonClick = new OnClickListener() { //按键事件 @Override public void onClick(View v) { // TODO Auto-generated method stub ProgressDialog proDialog = ProgressDialog.show(v.getContext(), "", "正在获取数据……", true, true); //显示dialong HttpThread jsonThread = new HttpThread(v.getContext(), proDialog); // 创建一个Http线程 String url = "http://birsys.ceshiceshi.com/json_1.php"; //创建URL // url传递参数 String[] key = { "type" }; //传递参数 String[] value = { "0" }; // php页面返回的json键 String[] jsonKey = { "id", "username", "lat", "lon","type" }; //传递相应的参数 jsonThread.setUrl(url); jsonThread.setKey(key); jsonThread.setValue(value); jsonThread.setJsonKey(jsonKey); jsonThread.start(); textView= (TextView)findViewById(R.id.textview); textView.setText(url); } }; //获取带数组类型的封装 OnClickListener listClick = new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ProgressDialog proDialog = ProgressDialog.show(v.getContext(), "", "正在获取数据……", true, true); HttpThread jsonThread = new HttpThread(v.getContext(), proDialog); String url = "http://birsys.ceshiceshi.com/json_2.php"; // url传递参数 String[] key = { "type" }; String[] value = { "1" }; // php页面返回的json键 String[] jsonKey = { "id", "username", "lat", "lon","type" }; String jsonName="json_2"; //传递相应的参数 jsonThread.setUrl(url); jsonThread.setKey(key); jsonThread.setValue(value); jsonThread.setJsonName(jsonName); jsonThread.setJsonKey(jsonKey); jsonThread.start(); } }; public class Json { // 解析单一的json封装,并返回字符串数组 /** * 参数说明: * 1.webContent 获取的网页封装的json格式数据 * 2.key 以数组形式组成的json的键名称 * */ public String[] getJSON(String webContent, String[] key) { int size = key.length; String[] s = new String[size]; try { JSONObject jsonObject = new JSONObject(webContent); for (int j = 0; j < size; j++) { s[j] = jsonObject.getString(key[j]); System.out.println(key[j] + "===string===" + jsonObject.getString(key[j])); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); s = null; } return s; } // 获取数组型的结构,返回ArrayList<HashMap<String, Object>>,方便listview中填充数据 /** * 参数说明: * 1.webContent 获取的网页封装的json格式数据 * 2.key 以数组形式组成的json的键名称 3.jsonName * 封装json数组数据的json名称 * public ArrayList<HashMap<String, Object>> getJSONArray(String webContent, String[] key, String jsonName) { ArrayList<HashMap<String, Object>> list; JSONArray jsonObject; try { jsonObject = new JSONObject(webContent).getJSONArray(jsonName); list = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < jsonObject.length(); i++) { JSONObject jsonObject2 = (JSONObject) jsonObject.opt(i); HashMap<String, Object> map = new HashMap<String, Object>(); for (int j = 0; j < key.length; j++) { map.put(key[j], jsonObject2.getString(key[j])); System.out.println(key[j] + "===" + jsonObject2.getString(key[j])); } list.add(map); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); list = null; } return list; } */ } public class HttpThread extends Thread{ private Context context; private ProgressDialog proDialog; private String url; private String []key; private String []value; private String []jsonKey; private String jsonName; private String []array; ArrayList<HashMap<String, Object>> list; public HttpThread(Context context,ProgressDialog proDialog){ this.context=context; this.proDialog=proDialog; } @Override public void run(){ Message msg = handler.obtainMessage(); HttpPostRequest post=new HttpPostRequest(); int res=post.requestHttp(url, key, value); String webContent=post.getWebContext(); msg.what=res; if(res==1){ //解析json Json json=new Json(); if(jsonName!=null) //解析数组型的json //list=json.getJSONArray(webContent, jsonKey, jsonName); //else //解析单个json值 array=json.getJSON(webContent, jsonKey); } handler.sendMessage(msg); } private Handler handler = new Handler() { // TODO Auto-generated constructor stub @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); int what=msg.what; Http_Status_Tips status=new Http_Status_Tips(); //返回成功数据时 if(what==1){ //处理数组型json if(list!=null){ int size=list.size(); String result=""; for(int i=0;i<size;i++){ int s=jsonKey.length; //迭代jsonKey数组值 for(int j=0;j<s;j++){ result+=jsonKey[j]+":"+list.get(i).get(jsonKey[j])+"\n"; } result+="\n"; } Toast.makeText(context, result, Toast.LENGTH_LONG).show(); } //处理单个字符json if(array!=null){ int arraySize=array.length; String rs=""; for(int k=0;k<arraySize;k++){ rs+=jsonKey[k]+":"+array[k]+"\n"; } Toast.makeText(context, rs, Toast.LENGTH_LONG).show(); if(array[0].equals("2")) Toast.makeText(context, array[0], Toast.LENGTH_LONG).show(); } } //根据服务器端返回数据,自定义提示 else if(what==2){ status.setTips("自定义提示2"); }//根据服务器端返回数据,自定义提示 else if(what==3){ status.setTips("自定义提示3"); } status.ShowHttpStatusTips(what, context,proDialog); } }; //activity界面传递的参数 public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String[] getKey() { return key; } public void setKey(String[] key) { this.key = key; } public String[] getValue() { return value; } public void setValue(String[] value) { this.value = value; } public String[] getJsonKey() { return jsonKey; } public void setJsonKey(String[] jsonKey) { this.jsonKey = jsonKey; } public String getJsonName() { return jsonName; } public void setJsonName(String jsonName) { this.jsonName = jsonName; } } public class HttpPostRequest { private String webContext; //返回请求内容 public String getWebContext() { return webContext; } public void setWebContext(String webContext) { this.webContext = webContext; } //该函数返回服务器访问的各种状态,并通过webContext传递获取的文本值 /** * 参数说明 * url 访问的网络地址 * key 传递参数的名称 * value 传递参数的值 * key 与value数组长度对应,即一对键值对,这样可以不限制参数传递的个数 * */ public int requestHttp(String url,String []key,String []value) { // TODO Auto-generated method stub int status = 0; DefaultHttpClient mHttpClient = new DefaultHttpClient(); HttpPost mPost = new HttpPost(url); List<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); int size=key.length; for(int i=0;i<size;i++){ pairs.add(new BasicNameValuePair(key[i], value[i])); } try { mPost.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8)); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { mHttpClient.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT, 60000); // Socket超时设置60s mHttpClient.getParams().setIntParameter(HttpConnectionParams.CONNECTION_TIMEOUT, 60000);// 连接超时60s HttpResponse response = mHttpClient.execute(mPost); int res = response.getStatusLine().getStatusCode(); if (res == 200) { HttpEntity entity = response.getEntity(); if (entity != null) { String info = EntityUtils.toString(entity); setWebContext(info); status=1; } } else if (res == 404) { status = 404; } else if (res == 500) { status = 500; } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); status = 900; } catch (ConnectTimeoutException e) { // TODO Auto-generated catch block e.printStackTrace(); status = 901; } catch (InterruptedIOException e) { // TODO Auto-generated catch block e.printStackTrace(); status = 902; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); status = 903; } return status; } } public class Http_Status_Tips { //服务器端返回的状态提示 public static final String HTTP_0="其他错误"; public static final String HTTP_1=""; public static final String HTTP_404="404错误,请求链接无效"; public static final String HTTP_500="网络500错误,服务器端程序出错"; public static final String HTTP_900="网络传输协议出错"; public static final String HTTP_901="连接超时"; public static final String HTTP_902="网络中断"; public static final String HTTP_903="网络数据流传输出错"; public static final String HTTP_UNKONW="未知的错误"; //自定义的提示 private String tips; public void ShowHttpStatusTips(int status,Context context,ProgressDialog proDialog){ switch(status){ case 0: Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); break; case 1: //Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); break; case 2: Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); break; case 3: Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show(); break; case 404: Toast.makeText(context, HTTP_404, Toast.LENGTH_LONG).show(); break; case 500: Toast.makeText(context, HTTP_500,Toast.LENGTH_LONG).show(); break; case 900: Toast.makeText(context, HTTP_900, Toast.LENGTH_LONG).show(); break; case 901: Toast.makeText(context, HTTP_901, Toast.LENGTH_LONG).show(); break; case 902: Toast.makeText(context, HTTP_902, Toast.LENGTH_LONG).show(); break; case 903: Toast.makeText(context, HTTP_903, Toast.LENGTH_LONG).show(); break; default: Toast.makeText(context, HTTP_UNKONW, Toast.LENGTH_LONG).show(); break; } if(proDialog!=null) proDialog.dismiss(); } public String getTips() { return tips; } public void setTips(String tips) { this.tips = tips; } } }

vs2013实现顺序线性表:fatal error LNK1120:

SqList.h头文件 ``` #define DEFAULT_SIZE 100 #include<iostream> template<class ElemType> class SqList { protected: int count; int maxSize; ElemType *elems; public: SqList(int size = DEFAULT_SIZE); virtual ~SqList(); int Length() const; bool Empty() const; void Clear(); void Traverse(void(*visit)(const ElemType &))const; bool GetElem(int position, ElemType &e) const; bool SetElem(int position, const ElemType &e); bool Delete(int position, ElemType &e); bool Insert(int position, const ElemType &e); SqList(const SqList<ElemType> &copy); //复制构造函数 SqList<ElemType>& operator=(const SqList<ElemType>& copy); void Show(); }; template<class ElemType> void Difference(const SqList<ElemType> &la, const SqList<ElemType> &lb, SqList<ElemType> &lc); ``` cpp实现文件 ``` #include "SqList.h" template<class ElemType> SqList<ElemType>::SqList(int size) { maxSize = size; elems = new ElemType[maxsize]; count = 0; } template<class ElemType> SqList<ElemType>::~SqList() { delete[] elems; } template<class ElemType> int SqList<ElemType>::Length()const { return count; } template<class ElemType> bool SqList<ElemType>::Empty() const { return count == 0; } template<class ElemType> void SqList<ElemType>::Clear() { count = 0; } template<class ElemType> void SqList<ElemType>::Traverse(void(*visit)(const ElemType &))const { for (int pos = 1; pos <= count; pos++) (*void)(elems[pos - 1]); } template<class ElemType> bool SqList<ElemType>::GetElem(int position, ElemType &e)const { if (position<1 || position>count) { return false; } else { e = elems[position - 1]; return true; } } template<class ElemType> bool SqList<ElemType>::SetElem(int position, const ElemType &e) { if (position<1 || position>count) { return false; } else { elems[position - 1] = e; return true; } } template<class ElemType> bool SqList<ElemType>::Insert(int position, const ElemType &e) { if (count == maxSize) return false; else if (position<1 || position>count + 1) return false; else { count++; for (int i = count; i >= position ; i--) //count先进行自加运算,所以在末尾处插入新值没有bug; { elems[i] = elems[i-1]; } elems[position-1] = e; return true; } } template<class ElemType> bool SqList<ElemType>::Delete(int position, ElemType &e) { if (position<1 || position>count) return false; else { GetElem(position, e); for (int pos = position; pos <count; pos++) { elems[pos - 1] = elems[pos]; } count--; return true; } } template<class ElemType> SqList<ElemType>::SqList(const SqList<ElemType> &copy) { maxSize = copy.maxSize; elems = new ElemType[maxSize]; count = copy.count; for (int i = 0; i <= count - 1; i++) { elems[i] = copy.elems[i]; } } template<class ElemType> SqList<ElemType>& SqList<ElemType>::operator=(const SqList<ElemType>& copy) { if (&copy != this) { maxSize = copy.maxSize; if (elems != NULL) delete []elems; elems = new ElemType[maxSize]; count = copy.count; for (int i = 0; i < count; i++) { elems[i] = copy.elems[i]; } return true; } } template<class ElemType> void SqList<ElemType>::Show() { for (int i = 0; i < count; i++) { cout << elems[i] << " "; } cout << endl; } template<class ElemType> void Difference(const SqList<ElemType> &la,const SqList<ElemType> &lb, SqList<ElemType> &lc) { ElemType aelem, belem; bool isExist = false; lc.Clear(); for (int apos = 1; apos <= la.Length(); apos++) { la.GetElem(apos, aelem); isExist = false; for (int bpos = 1; bpos <= lb.Length(); bpos++) { lb.GetElem(bpos, belem); if (aelem == belem) { isExist = true; break; } } if (!isExist) { lc.Insert(lc.Length() + 1, aelem); } } } ``` 下面是编译出现的问题: 1>------ 已启动生成: 项目: 头文件, 配置: Debug Win32 ------ 1> SqList.cpp 1>测试.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall SqList<int>::SqList<int>(int)" (??0?$SqList@H@@QAE@H@Z),该符号在函数 _main 中被引用 1>测试.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall SqList<int>::~SqList<int>(void)" (??1?$SqList@H@@UAE@XZ),该符号在函数 _main 中被引用 1>测试.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall SqList<int>::Insert(int,int const &)" (?Insert@?$SqList@H@@QAE_NHABH@Z),该符号在函数 _main 中被引用 1>测试.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall SqList<int>::Show(void)" (?Show@?$SqList@H@@QAEXXZ),该符号在函数 _main 中被引用 1>C:\Users\Park\Desktop\数据结构笔记\绪论\头文件\Debug\头文件.exe : fatal error LNK1120: 4 个无法解析的外部命令 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

基于TCP的客户端服务器通信,如何在终端输入数据进行聊天呢,求大神帮我

//clientTcp.c #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define SERVPORT 3333 //侦听端口地址 #define MAXDATASIZE 100 main(int argc,char *argv[]) { int sockfd,sendbytes; char buf[MAXDATASIZE]; //struct hostent *host; struct sockaddr_in serv_addr;//服务器地址结构 /* if(argc < 2){ fprintf(stderr,"Please enter the server'shostname!\n"); exit(1); } */ /*地址解析函数 if((host=gethostbyname(argv[1]))==NULL){ perro("gethostbyname"); exit(1); } */ /*创建 socket*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))== -1){ perror("socket"); exit(1); } /*设置 sockaddr_in 结构体中相关参数*/ serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); bzero(&(serv_addr.sin_zero),8); /*调用 connect 函数主动发起对服务器端的连接*/ if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))== -1){ perror("connect"); exit(1); } /*发送消息给服务器端*/ if((sendbytes=write(sockfd,"hello",5))== -1){ perror("send"); exit(1); } close(sockfd); return 0; }

C++中使用二进制文件保存和读取结构体的问题

为了了解书中的代码,自己编写了下面这段简单的测试代码。 #include<iostream> #include<fstream> #include<string> struct Test { int key; std::string data; }; int main() { Test test; test.key = 1; test.data = "Anthony"; std::ofstream fout("D:\\Data.dat", std::ios_base::out | std::ios_base::binary); fout.write((char*)&test, sizeof Test); fout.close(); std::ifstream fin("D:\\Data.dat", std::ios_base::in | std::ios_base::app | std::ios_base::binary); Test test_1; fin.seekg(0); fin.read((char*)&test_1, sizeof Test); std::cout << test_1.key << std::endl; std::cout << test_1.key << std::endl; std::cout << test_1.data << std::endl; std::cout << test_1.data << std::endl; system("pause"); return 0; } 这段代码编译没有任何问题,但是出现了运行错误(CE)。而且经调试发现错误实在程序执行return 0;之后才发生的。程序运行截图如下。 运行代码后如下: ![运行代码后](https://img-ask.csdn.net/upload/201803/22/1521718446_18679.png) 再按任意键后如下: ![按任意键后](https://img-ask.csdn.net/upload/201803/22/1521718827_396761.jpg) **调试后发现的异常为:**0x00088538 处(位于 FileStruct.exe 中)引发的异常: 0xC0000005: 写入位置 0xDDDDDDDD 时发生访问冲突。****

急求大神解决一下这个问题c信号传递

#include <signal.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { union sigval value; int signum = SIGTERM; // 默认发送SIGTERM pid_t pid; int i; /*初始化*/ value.sival_int = 0; /*检查参数的个数*/ if (argc != 3 && argc != 5 && argc != 7) { printf("./send_data_signo <-d data> <-s signum> [-p][data]\n"); exit(1); } /*从命令行参数解析出信号编号、PID以及待传递的数据*/ for (i=1; i<argc; i++) { if (!strcmp(argv[i], "-d")) { value.sival_int = argv[i+1]; //指针指向参数中的字符串 continue; } if (!strcmp(argv[i], "-s")) { signum = atoi(argv[i+1]); continue; } if (!strcmp(argv[i], "-p")) { pid = atoi(argv[i+1]); continue; } } /*利用sigqueue给pid发送信号signum,并携带数据value*/ if (sigqueue(pid, signum, value) < 0) { perror("sigqueue"); exit(1); } return 0; } #include <signal.h> #include <stdio.h> /*三参数的信号处理程序*/ void handler_sigint(int signo, siginfo_t *siginfo, void * pvoid) { printf("recv SIGINT, the data value is:%s\n",(char *) siginfo->si_ptr); } int main() { struct sigaction act; /*赋值act结构*/ act.sa_sigaction = handler_sigint; act.sa_flags = SA_SIGINFO; // 指定使用三参数的信号处理函数 /*安装信号处理函数*/ sigaction(SIGINT, &act, NULL); while(1) ; return 0; } 然后运行之后,如果-s后面的参数为1的话好像有问题,这个是什么情况,求个大神解决一下。 ![![图片说明](https://img-ask.csdn.net/upload/201503/30/1427687096_744161.png)图片说明](https://img-ask.csdn.net/upload/201503/30/1427687003_797281.png)

tracert程序编译成功运行后,无法正常发送接收包,输出结果只有123456789101112131415161718192021222324252627282930,不显示详细情况,单步运行后发现接收发送包的部分没执行

![图片说明](https://img-ask.csdn.net/upload/201911/30/1575117089_191288.jpg) #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> using namespace std; #pragma comment(lib, "Ws2_32.lib") //IP报头 typedef struct IP_HEADER { unsigned char hdr_len:4; //4位头部长度 unsigned char version:4; //4位版本号 unsigned char tos; //8位服务类型 unsigned short total_len; //16位总长度 unsigned short identifier; //16位标识符 unsigned short frag_and_flags; //3位标志加13位片偏移 unsigned char ttl; //8位生存时间 unsigned char protocol; //8位上层协议号 unsigned short checksum; //16位校验和 unsigned long sourceIP; //32位源IP地址 unsigned long destIP; //32位目的IP地址 } IP_HEADER; //ICMP报头 typedef struct ICMP_HEADER { BYTE type; //8位类型字段 BYTE code; //8位代码字段 USHORT cksum; //16位校验和 USHORT id; //16位标识符 USHORT seq; //16位序列号 } ICMP_HEADER; //报文解码结构 typedef struct DECODE_RESULT { USHORT usSeqNo; //序列号 DWORD dwRoundTripTime; //往返时间 in_addr dwIPaddr; //返回报文的IP地址 }DECODE_RESULT; //计算网际校验和函数 USHORT checksum( USHORT *pBuf, int iSize ) { unsigned long cksum = 0; while( iSize > 1 ) { cksum += *pBuf++; iSize -= sizeof(USHORT); } if( iSize )//如果 iSize 为正,即为奇数个字节 { cksum += *(UCHAR *)pBuf; //则在末尾补上一个字节,使之有偶数个字节 } cksum = ( cksum >> 16 ) + ( cksum&0xffff ); cksum += ( cksum >> 16 ); return (USHORT)( ~cksum ); } //对数据包进行解码 BOOL DecodeIcmpResponse(char * pBuf, int iPacketSize, DECODE_RESULT &DecodeResult, BYTE ICMP_ECHO_REPLY, BYTE ICMP_TIMEOUT) { //检查数据报大小的合法性 IP_HEADER* pIpHdr = ( IP_HEADER* )pBuf; int iIpHdrLen = pIpHdr->hdr_len * 4; //ip报头的长度是以4字节为单位的 //若数据包大小 小于 IP报头 + ICMP报头,则数据报大小不合法 if ( iPacketSize < ( int )( iIpHdrLen + sizeof( ICMP_HEADER ) ) ) return FALSE; //根据ICMP报文类型提取ID字段和序列号字段 ICMP_HEADER *pIcmpHdr = ( ICMP_HEADER * )( pBuf + iIpHdrLen );//ICMP报头 = 接收到的缓冲数据 + IP报头 USHORT usID, usSquNo; if( pIcmpHdr->type == ICMP_ECHO_REPLY ) //ICMP回显应答报文 { usID = pIcmpHdr->id; //报文ID usSquNo = pIcmpHdr->seq; //报文序列号 } else if( pIcmpHdr->type == ICMP_TIMEOUT )//ICMP超时差错报文 { char * pInnerIpHdr = pBuf + iIpHdrLen + sizeof( ICMP_HEADER ); //载荷中的IP头 int iInnerIPHdrLen = ( ( IP_HEADER * )pInnerIpHdr )->hdr_len * 4; //载荷中的IP头长 ICMP_HEADER * pInnerIcmpHdr = ( ICMP_HEADER * )( pInnerIpHdr + iInnerIPHdrLen );//载荷中的ICMP头 usID = pInnerIcmpHdr->id; //报文ID usSquNo = pInnerIcmpHdr->seq; //序列号 } else { return false; } //检查ID和序列号以确定收到期待数据报 if( usID != ( USHORT )GetCurrentProcessId() || usSquNo != DecodeResult.usSeqNo ) { return false; } //记录IP地址并计算往返时间 DecodeResult.dwIPaddr.s_addr = pIpHdr->sourceIP; DecodeResult.dwRoundTripTime = GetTickCount() - DecodeResult.dwRoundTripTime; //处理正确收到的ICMP数据报 if ( pIcmpHdr->type == ICMP_ECHO_REPLY || pIcmpHdr->type == ICMP_TIMEOUT ) { //输出往返时间信息 if(DecodeResult.dwRoundTripTime) cout<<" "<<DecodeResult.dwRoundTripTime<<"ms"<<flush; else cout<<" "<<"<1ms"<<flush; } return true; } void main() { //初始化Windows sockets网络环境 WSADATA wsa; WSAStartup( MAKEWORD(2,2), &wsa ); char IpAddress[255]; cout<<"请输入一个IP地址或域名:"; cin>>IpAddress; //得到IP地址 u_long ulDestIP = inet_addr( IpAddress ); //转换不成功时按域名解析 if( ulDestIP == INADDR_NONE ) { hostent * pHostent = gethostbyname( IpAddress ); if( pHostent ) { ulDestIP = ( *( in_addr* )pHostent->h_addr).s_addr; } else { cout<<"输入的IP地址或域名无效!"<<endl; WSACleanup(); return; } } cout<<"Tracing roote to "<<IpAddress<<" with a maximum of 30 hops.\n"<<endl; //填充目的端socket地址 sockaddr_in destSockAddr; ZeroMemory( &destSockAddr, sizeof( sockaddr_in ) ); destSockAddr.sin_family = AF_INET; destSockAddr.sin_addr.s_addr = ulDestIP; //创建原始套接字 SOCKET sockRaw = WSASocket( AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED ); //超时时间 int iTimeout = 3000; //设置接收超时时间 setsockopt( sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char *)&iTimeout, sizeof( iTimeout ) ); //设置发送超时时间 setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTimeout,sizeof(iTimeout)); //构造ICMP回显请求消息,并以TTL递增的顺序发送报文 //ICMP类型字段 const BYTE ICMP_ECHO_REQUEST = 8; //请求回显 const BYTE ICMP_ECHO_REPLY = 0; //回显应答 const BYTE ICMP_TIMEOUT = 11; //传输超时 //其他常量定义 const int DEF_ICMP_DATA_SIZE = 32; //ICMP报文默认数据字段长度 const int MAX_ICMP_PACKET_SIZE = 1024; //ICMP报文最大长度(包括报头) const DWORD DEF_ICMP_TIMEOUT = 3000; //回显应答超时时间 const int DEF_MAX_HOP = 30; //最大跳站数 //填充ICMP报文中每次发送时不变的字段 char IcmpSendBuf[ sizeof( ICMP_HEADER ) + DEF_ICMP_DATA_SIZE ];//发送缓冲区 memset( IcmpSendBuf, 0, sizeof( IcmpSendBuf ) ); //初始化发送缓冲区 char IcmpRecvBuf[ MAX_ICMP_PACKET_SIZE ]; //接收缓冲区 memset( IcmpRecvBuf, 0, sizeof( IcmpRecvBuf ) ); //初始化接收缓冲区 ICMP_HEADER * pIcmpHeader = ( ICMP_HEADER* )IcmpSendBuf; pIcmpHeader->type = ICMP_ECHO_REQUEST; //类型为请求回显 pIcmpHeader->code = 0; //代码字段为0 pIcmpHeader->id = (USHORT)GetCurrentProcessId(); //ID字段为当前进程号 memset( IcmpSendBuf + sizeof( ICMP_HEADER ), 'E', DEF_ICMP_DATA_SIZE );//数据字段 USHORT usSeqNo = 0; //ICMP报文序列号 int iTTL = 1; //TTL初始值为1 BOOL bReachDestHost = FALSE; //循环退出标志 int iMaxHot = DEF_MAX_HOP; //循环的最大次数 DECODE_RESULT DecodeResult; //传递给报文解码函数的结构化参数 while( !bReachDestHost && iMaxHot-- ) { //设置IP报头的TTL字段 setsockopt( sockRaw, IPPROTO_IP, IP_TTL, (char *)&iTTL, sizeof(iTTL) ); cout<<iTTL<<flush; //输出当前序号,flush表示将缓冲区的内容马上送进cout,把输出缓冲区刷新 //填充ICMP报文中每次发送变化的字段 ((ICMP_HEADER *)IcmpSendBuf)->cksum = 0; //校验和先置为0 ((ICMP_HEADER *)IcmpSendBuf)->seq = htons(usSeqNo++); //填充序列号 ((ICMP_HEADER *)IcmpSendBuf)->cksum = checksum( ( USHORT * )IcmpSendBuf, sizeof( ICMP_HEADER ) + DEF_ICMP_DATA_SIZE ); //计算校验和 //记录序列号和当前时间 DecodeResult.usSeqNo = ( ( ICMP_HEADER* )IcmpSendBuf )->seq; //当前序号 DecodeResult.dwRoundTripTime = GetTickCount(); //当前时间 //发送TCP回显请求信息 sendto( sockRaw, IcmpSendBuf, sizeof(IcmpSendBuf), 0, (sockaddr*)&destSockAddr, sizeof(destSockAddr) ); //接收ICMP差错报文并进行解析处理 sockaddr_in from; //对端socket地址 int iFromLen = sizeof(from);//地址结构大小 int iReadDataLen; //接收数据长度 while(1) { //接收数据 iReadDataLen = recvfrom( sockRaw, IcmpRecvBuf, MAX_ICMP_PACKET_SIZE, 0, (sockaddr*)&from, &iFromLen ); if( iReadDataLen != SOCKET_ERROR )//有数据到达 { //对数据包进行解码 if(DecodeIcmpResponse( IcmpRecvBuf, iReadDataLen, DecodeResult, ICMP_ECHO_REPLY, ICMP_TIMEOUT ) ) { //到达目的地,退出循环 if( DecodeResult.dwIPaddr.s_addr == destSockAddr.sin_addr.s_addr ) bReachDestHost = true; //输出IP地址 cout<<'\t'<<inet_ntoa( DecodeResult.dwIPaddr )<<endl; break; } } else if( WSAGetLastError() == WSAETIMEDOUT ) //接收超时,输出*号 { cout<<" *"<<'\t'<<"Request timed out."<<endl; break; } else { break; } } iTTL++; //递增TTL值 } }

有大神帮忙看一下这个代码存在什么问题吗?万分感谢!

一个数据结构的问题,在主函数中的‘B’情况运行到EnQueue(Q1,e)的时候出现异常。 using namespace std; #include<iostream> #include<stdlib.h> #include<cmath> #include<cstring> typedef int Status; #define int Status #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define MAXSIZE 100 //链栈 typedef struct StackNode { char data; struct StackNode *next; }StackNode, *LinkStackPtr; typedef struct LinkStack { LinkStackPtr top; int size; }LinkStack; //重要操作 LinkStack //判断是否为空栈 Status StackEmpty(LinkStack *S) { if (S->size == 0) { return TRUE; } else { return FALSE; } } //初始化一个栈 Status InitStack(LinkStack *S) { S->top = NULL; S->size = 0; return OK; } //返回栈顶元素 Status GetTop(LinkStack *S, char * e) {//char if (S->size == 0) { return ERROR; } else { *e = S->top->data; } return OK; } //进栈操作 Status push(LinkStack *S, char e) { LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode)); s->data = e; s->next = S->top; S->top = s; S->size++; return OK; } //出栈操作 Status pop(LinkStack *S, char *e) { if (StackEmpty(S)) { return FALSE; } else { *e = S->top->data; LinkStackPtr s = S->top; S->top = s->next; S->size--; free(s); return OK; } } //链队列 typedef struct QNode { char data; struct QNode *next; }QNode, *QueuePtr;//结点结构 typedef struct { QueuePtr front, rear; int Size; }LinkQueue;//队列的链表结构 //重要操作 LinkQueue //判断是否为空队列 Status QueueEmpty(LinkQueue *Q) { if (Q->Size == 0) { return TRUE; } else { return FALSE; } } //初始化 Status InitQueue(LinkQueue *Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); if (!Q->front) exit(OVERFLOW); Q->front->next = NULL; Q->Size = 0; return OK; } //入队列 Status EnQueue(LinkQueue *Q, char e) {//链队列是带头节点的,头指针永远指向头节点 QueuePtr q = (QueuePtr)malloc(sizeof(QNode)); if (!q) exit(OVERFLOW); q->data = e; q->next = NULL; Q->rear->next = q; Q->rear = q; Q->Size++; return OK; } //出队列 Status DeQueue(LinkQueue *Q, char *e) { if (Q->front == Q->rear) return ERROR; *e = Q->front->data; QueuePtr q = Q->front->next; Q->front->next = q->next; if (q == Q->rear) Q->rear = Q->front; Q->Size--; free(q); return OK; } //talk函数用于将魔王的语言进行压栈 Status Language_Talk(LinkStack *S) { char word[MAXSIZE]; cout << "请输入魔王的语言"; cin >> word; int i; int j = 0; int left = 0, right = 0; cout << "魔王语言为"<<word << endl; int len = strlen(word) - 1; cout <<"魔王语言长度为"<< len+1 << endl; cout << "成功输入魔王语言"; while (j<len) { if (word[j] == '(') left++; if (word[j] == ')') right++; j++; } if (len+1==0) { cout << "魔王没有说话"; return ERROR; } else { if (left != right) { cout << "魔王说了错误的话"; return ERROR; } else { for (i = len;i >= 0;i--) { push(S, word[i]); } } } return OK; } //已经解析的语言存入数组 Status Language_Record(LinkQueue *Q, LinkQueue *Q1) { //char *e=; char *e = (char *)malloc(sizeof(char)); while (!QueueEmpty(Q)) { DeQueue(Q, e); EnQueue(Q1, *e); } return OK; } //词汇依次出栈进行处理 //A情况 char Language_explanA(LinkStack *S, LinkQueue *Q) { //char *e; char *e = (char *)malloc(sizeof(char)); pop(S, e); char E = *e; free(e); int a = 0; char A[10] = "sae"; while (a <= 2) { EnQueue(Q, A[a]); a++; } return *e; /*cout << A; cout << "输出第一个元素"; cout << Q->front->data;*/ //return OK; } //B情况 Status Language_explanB(LinkStack *S, LinkQueue *Q) { //char *e; char *e = (char*)malloc(sizeof(char)); pop(S, e); int b = 0; char B[10] = "tsaedsae"; while (B[b]) { EnQueue(Q, B[b]); b++; } return 0; } //‘(’情况 Status Language_explanleft(LinkStack *S, LinkQueue *Q) { //char *e; char *e = (char*)malloc(sizeof(char)); pop(S, e); pop(S, e); char sita = *e; EnQueue(Q, sita); while (S->top->data != ')') { pop(S, e); EnQueue(Q, *e); EnQueue(Q, sita); } return 0; } //')'情况 Status Language_explanright(LinkStack *S, LinkQueue *Q) { //char *e; char *e = (char*)malloc(sizeof(char)); pop(S, e); while (!QueueEmpty) { DeQueue(Q, e); push(S, *e); } return OK; } int main() { int position = 0; LinkStack *Link_Stack = (LinkStack *)malloc(sizeof(StackNode)); LinkQueue *Link_Queue = (LinkQueue *)malloc(sizeof(QNode)); LinkQueue *Humanwords = (LinkQueue *)malloc(sizeof(QNode)); InitStack(Link_Stack); InitQueue(Link_Queue); char Devilwords[MAXSIZE]; Language_Talk(Link_Stack); cout << Link_Stack->size; cout << Link_Stack->top->data << endl; while (!StackEmpty(Link_Stack)) { if (Link_Stack->top->data == 'A') { Language_explanA(Link_Stack, Link_Queue); cout << "执行了A"; cout << Link_Queue->Size << endl; cout << Link_Stack->size << endl; } if (Link_Stack->top->data == 'B') { Language_explanB(Link_Stack, Link_Queue); cout << Link_Queue->Size << endl; cout << Link_Stack->size << endl; } if (Link_Stack->top->data == '(') { Language_Record(Link_Queue, Humanwords); Language_explanleft(Link_Stack, Link_Queue); } if (Link_Stack->top->data == ')') Language_explanright(Link_Stack, Link_Queue); } cout << Humanwords; system("pause"); return OK; }

定量遥感中文版 梁顺林著 范闻捷译

这是梁顺林的定量遥感的中文版,由范闻捷等翻译的,是电子版PDF,解决了大家看英文费时费事的问题,希望大家下载看看,一定会有帮助的

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

远程工具,免费

远程工具,免费

java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷

csma/ca和csma/cd的matlab仿真源代码带有详细的注释

csma/ca和csma/cd的matlab仿真源代码带有详细的注释,载波侦听,随意设置节点数,带有炫酷的图形展示效果。

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

软件测试入门、SQL、性能测试、测试管理工具

软件测试2小时入门,让您快速了解软件测试基本知识,有系统的了解; SQL一小时,让您快速理解和掌握SQL基本语法 jmeter性能测试 ,让您快速了解主流来源性能测试工具jmeter 测试管理工具-禅道,让您快速学会禅道的使用,学会测试项目、用例、缺陷的管理、

pokemmo的资源

pokemmo必须的4个rom 分别为绿宝石 火红 心金 黑白 还有汉化补丁 资源不错哦 记得下载

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

无线通信中的智能天线:IS-95和第3代CDMA应用_.pdf

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

Java8零基础入门视频教程

这门课程基于主流的java8平台,由浅入深的详细讲解了java SE的开发技术,可以使java方向的入门学员,快速扎实的掌握java开发技术!

玩转Linux:常用命令实例指南

人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 --------------------------------------------------------------- 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。 &nbsp;

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

想学好JAVA必须要报两万的培训班吗? Java大神勿入 如果你: 零基础想学JAVA却不知道从何入手 看了一堆书和视频却还是连JAVA的环境都搭建不起来 囊中羞涩面对两万起的JAVA培训班不忍直视 在职没有每天大块的时间专门学习JAVA 那么恭喜你找到组织了,在这里有: 1. 一群志同道合立志学好JAVA的同学一起学习讨论JAVA 2. 灵活机动的学习时间完成特定学习任务+每日编程实战练习 3. 热心助人的助教和讲师及时帮你解决问题,不按时完成作业小心助教老师的家访哦 上一张图看看前辈的感悟: &nbsp; &nbsp; 大家一定迫不及待想知道什么是极简JAVA学习营了吧,下面就来给大家说道说道: 什么是极简JAVA学习营? 1. 针对Java小白或者初级Java学习者; 2. 利用9天时间,每天1个小时时间; 3.通过 每日作业 / 组队PK / 助教答疑 / 实战编程 / 项目答辩 / 社群讨论 / 趣味知识抢答等方式让学员爱上学习编程 , 最终实现能独立开发一个基于控制台的‘库存管理系统’ 的学习模式 极简JAVA学习营是怎么学习的? &nbsp; 如何报名? 只要购买了极简JAVA一:JAVA入门就算报名成功! &nbsp;本期为第四期极简JAVA学习营,我们来看看往期学员的学习状态: 作业看这里~ &nbsp; 助教的作业报告是不是很专业 不交作业打屁屁 助教答疑是不是很用心 &nbsp; 有奖抢答大家玩的很嗨啊 &nbsp; &nbsp; 项目答辩终于开始啦 &nbsp; 优秀者的获奖感言 &nbsp; 这是答辩项目的效果 &nbsp; &nbsp; 这么细致的服务,这么好的氛围,这样的学习效果,需要多少钱呢? 不要1999,不要199,不要99,只要9.9 是的你没听错,只要9.9以上所有就都属于你了 如果你: 1、&nbsp;想学JAVA没有基础 2、&nbsp;想学JAVA没有整块的时间 3、&nbsp;想学JAVA没有足够的预算 还等什么?赶紧报名吧,抓紧抢位,本期只招300人,错过只有等时间待定的下一期了 &nbsp; 报名请加小助手微信:eduxy-1 &nbsp; &nbsp;

Python数据清洗实战入门

本次课程主要以真实的电商数据为基础,通过Python详细的介绍了数据分析中的数据清洗阶段各种技巧和方法。

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

linux下利用/proc进行进程树的打印

在linux下利用c语言实现的进程树的打印,主要通过/proc下的目录中的进程文件,获取status中的进程信息内容,然后利用递归实现进程树的打印

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

HoloLens2开发入门教程

本课程为HoloLens2开发入门教程,讲解部署开发环境,安装VS2019,Unity版本,Windows SDK,创建Unity项目,讲解如何使用MRTK,编辑器模拟手势交互,打包VS工程并编译部署应用到HoloLens上等。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干 目录 1-先去官网下载点击的MySQL的下载​ 2-配置初始化的my.ini文件的文件 3-初始化MySQL 4-安装MySQL服务 + 启动MySQL 服务 5-连接MySQL + 修改密码 先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置初始化的my.ini文件的文件 ...

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

Ubuntu18.04安装教程

Ubuntu18.04.1安装一、准备工作1.下载Ubuntu18.04.1 LTS2.制作U盘启动盘3.准备 Ubuntu18.04.1 的硬盘空间二、安装Ubuntu18.04.1三、安装后的一些工作1.安装输入法2.更换软件源四、双系统如何卸载Ubuntu18.04.1新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列...

sql语句 异常 Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your

在我们开发的工程中,有时候会报 [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ------ 这种异常 不用多想,肯定是我们的sql语句出现问题,下面...

西南交通大学新秀杯数学建模试题

题目比较难,如果符合大家的口味欢迎大家下载哈,提高你的思维想象能力

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

Spring Boot -01- 快速入门篇(图文教程)

Spring Boot -01- 快速入门篇 今天开始不断整理 Spring Boot 2.0 版本学习笔记,大家可以在博客看到我的笔记,然后大家想看视频课程也可以到【慕课网】手机 app,去找【Spring Boot 2.0 深度实践】的课程,令人开心的是,课程完全免费! 什么是 Spring Boot? Spring Boot 是由 Pivotal 团队提供的全新框架。Spring Boot...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

C/C++学习指南全套教程

C/C++学习的全套教程,从基本语法,基本原理,到界面开发、网络开发、Linux开发、安全算法,应用尽用。由毕业于清华大学的业内人士执课,为C/C++编程爱好者的教程。

winfrom中嵌套html,跟html的交互

winfrom中嵌套html,跟html的交互,源码就在里面一看就懂,很简单

相关热词 c# 解析cad c#数字格式化万 c#int转byte c#格式化日期 c# wpf 表格 c# 实现ad域验证登录 c#心跳包机制 c#使用fmod.dll c#dll vb 调用 c# outlook
立即提问
相关内容推荐