data.txt中有一个已排好序的序列,main 函数中定义1个有8个元素的数组a,从data.txt中读入数据给数组a,从键盘输入一个整数,按原来排序的规律插入数组a再将插入后数组a中的值写到data.txt。

#include
#define N 5

int main()
{
int a[N+1]={1,2,3,5,6},i,k,t,j;//t表示插入位置,k表示要插入的数,k从键盘读入
scanf("%d",&k);
for(i=0;i {
if(k {
t=i;
break;
}
}
if(i==N) t=N;
for(j=N;j>t;j--)
{
a[j]=a[j-1];
}
a[t]=k;
for(int i=0;i<N+1;i++)
{
printf("%-4d",a[i]);
}

return 0;

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
归并排序中合并总是少一些数,那个排序的函数已经写好了。

int post_sort2(int data[] , int low , int mid , int high) { int len=high-low+1; int data2[len]; int m=0; int loc=0; int n=mid+1; while (m<=mid && n<=high) { if (data[m]<=data[n]) { data2[loc]=data[m]; m=m+1; loc=loc+1; } else { data2[loc]=data[n]; n=n+1; loc=loc+1; } } while (m<=mid) { data2[loc]=data[m]; loc=loc+1; m=m+1; } while(n<=high) { data2[loc]=data[n]; loc=loc+1; n=n+1; } for(int i=0;i<=len;++i) { data[i]=data2[i]; } return 0; }

C语言有一个已经排好序的数组,要求输入一个数后,按原来的排序规律将它插入数组中。 我应该怎么尽量在原有代码上修改才对?

#include "stdio.h" int main() {int a[5]={2,4,6,8}; int x,i=0,j=0; printf("请输入一个数:"); scanf("%d",&x); for(i=0;i<=3;i++) {if(x<a[i]) break; } for(i=0;i<=5;i++) {printf("%d ",a[i]); } return 0; }

类实现二叉树,main函数怎么写

#include<iostream> using namespace std; typedef struct shu {char data; struct shu*lson,*rson; }snode,*prt; class tree { prt inpront(prt root); void qianxu(prt root); void zhongxu(prt root); void houxu(prt root); }; #include"SHU.h"prt tree::inpront(prt root){ char ch=0; cin>>ch; if(ch=='#')return NULL; else { root=new snode; root->data=ch; root->lson=inpront(root->lson); root->rson=inpront(root->rson); } return root;};void tree::qianxu(prt root){ if(root!=NULL); { cout<<" "<<root->data; qianxu(root->lson); qianxu(root->rson); }};void tree::zhongxu(prt root){ if(root!=NULL); { zhongxu(root->lson); cout<<" "<<root->data; zhongxu(root->rson); }};void tree::houxu(prt root){ if(root!=NULL); { houxu(root->lson); houxu(root->rson); cout<<" "<<root->data; }};

定义函数后输入值返回结果

一年365天,初始水平值为1.0,每工作一天水平增加N,不工作时水平不下降,一周连续工作4天,请输入N,返回年终值 N=input(“N=“) def dayUp(df): dayup=1.0 for i in range(365): if i % 7 in[5,6,0]: dayup = dayup else : dayup = dayup * (1+df) return dayup print(“年终值为:{:.3f}.”.format(dayUp(N))) 返回的错误是 Traceback (most recent call last): line 10 ,in <module> print(“年终值为:{:.3f}.”.format(dayUp(N))) line 8 ,in dayUp dayup = dayup * (1+df) TypeError: unsupported operand type(s) for +:’float’and’str’ 本人刚自学 还请大神帮忙指导下 谢谢

02-线性结构1 两个有序链表序列的合并----答案错误求解

本题要求实现一个函数,**将两个链表表示的递增整数序列合并为一个递增的整数序列。** 函数接口定义: ``` List Merge( List L1, List L2 ); ``` 其中List结构定义如下: ``` typedef struct Node *PtrToNode; struct Node {     ElementType Data; /* 存储结点数据 */     PtrToNode   Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ ``` **L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个递增的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。** 裁判测试程序样例: ``` #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node {     ElementType Data;     PtrToNode   Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() {     List L1, L2, L;     L1 = Read();     L2 = Read();     L = Merge(L1, L2);     Print(L);     Print(L1);     Print(L2);     return 0; } /* 你的代码将被嵌在这里 */ ``` 输入样例: 3 1 3 5 5 2 4 6 8 10 输出样例: 1 2 3 4 5 6 8 10  NULL NULL****   编译器:gcc 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:DS课程组 单位:浙江大学 我的答案: ``` List Merge( List L1, List L2 ){ PtrToNode p1,p2,q1,q2; p1 = L1; q1 = L2; p2 = L1->Next; q2 = L2->Next; while(p2&&q2){ if(p2->Data >= q2->Data){ q1->Next = q2->Next; q2->Next = p2; p1->Next = q2; p1 = p1->Next; q2 = q1->Next; } else{ p1 = p2; p2 = p2->Next; } } if(q2) p1->Next = q2; PtrToNode q3 = L2; L2->Next = NULL; free(q3); PtrToNode front = (PtrToNode)malloc(sizeof(struct Node)); front->Next = L1->Next; L1->Next = front; PtrToNode p3 = L1; L1 = L1->Next; p3->Next =NULL; free(p3); return L1; } ``` ******我的想法是直接在L1中进行排序: 设置p1,p2指向L1链表,其中p2指向L1的当前结点,初始化为第一个节点;p1指向当前结点的前一节点,方便L2结点插入,初始化为头节点。 设置q1,q2指向L2链表,其中q2指向L2的当前结点,初始化为第一个节点;q1指向当前结点的前一节点,方便q2重新定位,不过没太多用处。 然后比较 p2->Data 和 q2>Data,知道其中一方为空。 q2->Data小的话,则将q2指向的结点插入到L1中。 p2->Data小的话,则将p1,p2都指向下一位。 比较到p2,q2其中一方为空。 如果L2还有剩余(即p2先指向NULL),则将其接到的p1后。 最后由于原L1,L2需输出为空,所以建立一个结点 front,先头插到L1原头结点和第一个节点之间。 然后将L1原头结点free,L2则直接free。 思路是如此。但答案错误........ 也从网上看到其他人的答案,思路比我更好,也更容易理解。 但还是不明白自己哪部错了。 向大家求解,多谢!!!******

用栈存储指向一个二叉树结点的指针,中序遍历时,进行调试时总卡在GetTop()函数,请大神帮我看看

利用栈存储指向一个二叉树结点的指针,可不知为什么,在进行中序遍历时,进行调试时总卡在GetTop()函数这里,请大神帮我看看 #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int Status; typedef char ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; typedef struct { BiTree *base; BiTree *top; int stacksize; }SqStack; Status InitStack(SqStack &S)//创建一个栈 { S.base=(BiTree *)malloc(sizeof(BiTree)*STACK_INIT_SIZE); if(!S.base) return ERROR; S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status Push(SqStack &S,BiTree p) { if((S.top-S.base)>=S.stacksize) { S.base=(BiTree *)malloc((STACKINCREMENT+S.stacksize)*sizeof(BiTree)); if(!S.base) return ERROR; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=p; return OK; } Status Pop(SqStack &S,BiTree &p) { if(S.base==S.top) return ERROR; p=*--S.top; return OK; } Status StackEmpty(SqStack &S) { if(S.top==S.base) return true; //xprintf("%c",p->data); else return false; } Status GetTop(SqStack S,BiTree &p)//得到栈顶元素,S是一个存放指 //向一个二叉树结点的指针的栈 { BiTree q; if(S.top==S.base) return ERROR; q=*S.top; q->data=3; p=q; //for(int i=0;i<10;i++) printf("dfvsdv"); //p=NULL; printf("%c",p->data); return OK; } Status Visit(ElemType ch) { putchar(ch); return OK; } Status CreateBiTree(BiTree &T){ // 算法6.4 // 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树, // 构造二叉链表表示的二叉树T。 char ch; scanf("%c",&ch); if (ch=='#') T = NULL; else{ if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; T->data=ch;// 生成根结点 CreateBiTree(T->lchild);// 构造左子树 CreateBiTree(T->rchild);// 构造右子树 } return OK; } // CreateBiTree Status PrintElement(ElemType e) { // 输出元素e的值 printf("%c", e ); return OK; }// PrintElement Status PreOrderTraverse(BiTree T, Status(*Visit)(ElemType)) { if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK; } // PreOrderTraverse Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ){ SqStack S; BiTree p; InitStack(S); Push(S,p); //printf("%c",p->data); while(!StackEmpty(S)) { while(GetTop(S,p)&&p) Push(S,p->lchild); Pop(S,p); if(!StackEmpty(S)) { Pop(S,p); //printf("fdffdf"); if(!Visit(p->data)) return ERROR; Push(S,p->rchild); } } return OK; } // InOrderTraverse Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) { // 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。 //补全代码,可用多个语句 if(T==NULL) return OK; PostOrderTraverse(T->lchild,Visit); PostOrderTraverse(T->rchild,Visit); Visit(T->data); return OK; } // PostOrderTraverse int main() //主函数 { BiTree T; CreateBiTree(T); PreOrderTraverse(T,Visit); printf("\n"); InOrderTraverse(T,Visit); printf("\n"); PostOrderTraverse(T,Visit); return 0; //补充代码 }//main ![图片说明](https://img-ask.csdn.net/upload/201604/26/1461662072_473381.png)

使用Newtonsoft.Json的JsonConvert.SerializeObject函数序列化字节数组与字符串不匹配

代码如下,如果将字节数组转换成char字符,传输中又遇到了‘?’取代无法打印的字符的情况,请教大神怎么解决? ``` namespace ConsoleApp1 { class test { public int[] src { get; set; } = { 0x30, 0x40, 0x50, 0x60, 0xef, 0xff }; public string str = ""; } class Program { static test A = new test(); static void Main(string[] args) { foreach(var t in A.src) { A.str += ((char)t).ToString(); ; } string tmp = JsonConvert.SerializeObject(A); test B = JsonConvert.DeserializeObject<test>(tmp); Console.WriteLine(tmp); Console.ReadKey(); } } } ```

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++读取txt文件里的数据,然后保存在二维数组中进行处理

我写的程序是把数据自己输入在主函数里,但是如果想实际的应用应该是有一个数据文件,然后提取出数据文件的数据保存在二维数组中才对,而且这个二维数组要根据具体文件的大小定数组的行列数,有谁能帮我做一下吗,谢谢! #include<iostream> #include<fstream> #include<math.h> using namespace std; #define M 10//二维数组的行 #define N 6//二维数组的列 class Data { double a[M][N];//声明数组 double Max; double Min; double r; public: Data(double b[M][N])//构造函数 { int i, j; for (i = 0; i < M; i++) for (j = 0; j < N; j++) a[i][j] = b[i][j]; } void Chuzhi();//初值化 void get_Max_Min();//根据公式求出求差序列的两级最大差、最小差 void get_r();//求出各列关联度 void show_Max_Min() { cout << "求差序列的两级的最大差是:" << Max << endl << endl; cout<<"求差序列的两级的最小差是:"<< Min << endl<<endl; } void show()//输出数组 { int i, j; for (i = 0; i < M; i++) { for (j = 0; j < N; j++) cout << a[i][j] << '\t'; cout << endl; } } }; void Data::Chuzhi()//量纲不同时化为无量纲 { for (int i = M - 1; i >= 0; i--) for (int j = N - 1; j >= 0; j--) a[i][j] = a[i][j] / a[0][j]; } void Data::get_Max_Min() { double c[M][N - 1]; double t = c[0][0]; for (int i = 0; i < M; i++) for (int j = 1; j < N; j++) c[i][j - 1] = fabs(a[i][0] - a[i][j]);//求差序列 //下面的代码可用于输出求差序列 cout << endl; cout << "求差序列为:" << endl; int i, j; for (i = 0; i < M; i++) { for (j = 0; j < N - 1; j++) cout << c[i][j] << '\t'; cout << endl; } for (int i = 0; i < M; i++) { for (int j = 0; j < N - 1; j++) { if (c[i][j]>t) t = c[i][j]; } } Max = t; for (int i = 0; i < M; i++) { for (int j = 0; j < N - 1; j++) { if (c[i][j] < t) t = c[i][j]; } } Min = t; } void Data::get_r() { double f[M][N]; for (int j = 0; j < N; j++) for (int i = 0; i < M;i++) f[i][j] = (Min + 0.5*Max) / (fabs(a[i][0] - a[i][j]) + 0.5*Max); for (int i = 0; i < M; i++)//输出关联系数序列 { for (int j = 0; j < N; j++) cout << f[i][j] << '\t'; cout << endl; } cout << "下面求出各列的关联度:" << endl<<endl; double r[N] = { 0 }; double sum[M] = { 0 }; for (int j = 0; j < N; j++) { for (int i = 0; i < M; i++) sum[j] += f[i][j]; } for (int j = 0; j < N; j++) { r[j] = sum[j] / M; cout << "第" << j + 1 << "列与第一列的关联度为:" << r[j] << endl << endl; } } int main() {//将要处理的数据 double b[M][N] = { { 44,5, 35, 60, 110, 130}, { 45,6, 40, 67, 120, 140}, {54, 7, 50, 72, 122, 150}, { 49,8, 50, 80, 124, 160}, { 43,9, 60, 79, 121, 170}, {54, 20, 60, 90, 122, 156}, { 39,13, 40, 70, 111, 157}, { 37,27, 65, 83, 130, 189}, { 43,35, 80, 72, 145, 165}, { 34,67, 70, 69, 123, 157} }; Data data(b);//建立对象data cout << "最初的数据为:" << endl; data.show(); cout << endl; data.Chuzhi(); cout << "初始化后数据:" << endl; data.show(); cout << endl; data.get_Max_Min(); data.show_Max_Min(); data.get_r(); system("pause"); return 0; }

逆序数据建立链表--按输入数据的逆序建立一个链表

要求实现一个函数,按输入数据的逆序建立一个链表 函数createlist利用scanf从输入中获取一系列正整数,当读到−1时表示输入结束。按输入数据的逆序建立一个链表,并返回链表头指针。 题目给出的代码: ``` #include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *createlist(); int main() { struct ListNode *p, *head = NULL; head = createlist(); for ( p = head; p != NULL; p = p->next ) printf("%d ", p->data); printf("\n"); return 0; } ``` 正确答案代码: ``` /* 你的代码将被嵌在这里 */ struct ListNode *createlist(){ int num; struct ListNode *p=NULL,*head=NULL; scanf("%d",&num); while (num!=-1) { p=(struct ListNode*)malloc(sizeof(struct ListNode));//注意这里!!! p->data=num; p->next=head; head=p; scanf("%d",&num); } return head; } ``` 输出结果: ``` 6 5 -1 5 6 Program ended with exit code: 0 ``` 错误代码(将上述标注的代码行换了个位置): ``` struct ListNode *createlist(){ int num; struct ListNode *p=NULL,*head=NULL; scanf("%d",&num); p=(struct ListNode*)malloc(sizeof(struct ListNode));//换到while循环外面!! while (num!=-1) { p->data=num; p->next=head; head=p; scanf("%d",&num); } return head; } ``` 输出结果: ``` 6 5 -1 5 5 5 5 5 5 5 5 5 5 5 …… ``` 为什么会这样呢?

大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列。

#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; typedef struct Btree { struct Btree *left; struct Btree *right; char data; }Node; void Create_Btree(Node *tree, char *pre, int pre_low, int pre_high, char *middle, int middle_low, int middle_high) { tree = (Node *)malloc(sizeof(Node)); tree->data = pre[pre_low]; tree->left = NULL; tree->right = NULL; printf("shuju:%c %d %d\n", tree->data, tree->left, tree->right); //计算树根在中序遍历中的下标 int root = middle_low; int i = root; while(pre[pre_low] != middle[i]) { i++; root++; } printf("root : %d\n", root); //中序左子树的长度 int left_length = root - middle_low; printf("%d--%d %d--%d\n", pre_low + 1, pre_low + left_length, middle_low, root - 1); printf("%d--%d %d--%d\n", pre_low + left_length + 1, pre_high, root + 1, middle_high); //遍历创建左子树 if(root > middle_low) { printf("left\n"); Create_Btree(tree->left, pre, pre_low + 1, pre_low + left_length, middle, middle_low, root - 1); } //遍历创建右子树 if(root < middle_high) { printf("right\n"); Create_Btree(tree->right, pre, pre_low + left_length + 1, pre_high, middle, root + 1, middle_high); } } void Post_order(Node *head) { printf("%d\n", head); if(head == NULL) return; else Post_order(head->left); Post_order(head->right); printf("%c", head->data); } int main() { char pre_order[27]; char middle_order[27]; while(~scanf("%s %s", pre_order, middle_order) && pre_order != "") { printf("%s\n%s\n", pre_order, middle_order); if(pre_order[1] == '\0') { printf("%c\n", pre_order[0]); continue; } else { Node *tree; int len = strlen(pre_order); Create_Btree(tree, pre_order, 0 , len - 1, middle_order, 0, len - 1); Post_order(tree); printf("\n"); } } } 哪位大神能运行一下 每次读地址就是post_order()函数里面 读取head-》left 就错误了。 printf("%c:::%d:::%d\n", head->data, head->left, head->right);

链表上直接使用Next指针与加上活动指针p后使用Next指针有什么区别?

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。 函数接口定义: ``` List Merge( List L1, List L2 ); ``` 其中List结构定义如下: ``` typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ ``` L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。 裁判测试程序样例: ``` #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } /* 你的代码将被嵌在这里 */ ``` 输入样例: ``` 3 1 3 5 5 2 4 6 8 10 ``` 输出样例: ``` 1 2 3 4 5 6 8 10 NULL NULL ``` 这道题为啥一定要设置活动指针遍历,我用的 ``` L1=L1->Next; L2=L2->Next ``` 和直接用活动指针遍历有何不同,求大佬指点。 我的答案是 ```  List Merge(List L1,List L2){             List L,L0;             L=(List)malloc(sizeof(struct Node));             L->Next=NULL;             L0=L;             L1=L1->Next;             L2=L2->Next;             while(L1!=NULL&&L2!=NULL){                     if(L1->Data<L2->Data){                           L->Next=L1;                           L=L->Next;                           L1=L1->Next;                     }                    else{                            L->Next=L2;                            L=L->Next;                            L2=L2->Next;                    }                    if(L1!=NULL){                            L->Next=L1;                    }                    if(L2!=NULL){                            L->Next=L2;                    }            }            return L0; L1->Next=NULL; L2->Next=NULL;    } ``` 请教一下这样做的问题是不是可以正常访问合成的链表L,但是不能得到Print(L1)与Print(L2)时那种NULL的效果,因为L1和L2已经接到新的链表里了,直接置空会影响L0? 下面是官方标准答案 ```   List Merge(List L1,List L2){              List L,L0,p,q;              L=(List)malloc(sizeof(struct Node));              L->Next=NULL;              L0=L;              p=L1;              q=L2;              p=p->Next;              q=q->Next;              while(p!=NULL&&q!=NULL){                      if(p->Data<q->Data){                            L->Next=p;                            L=L->Next;                            p=p->Next;                      }                      else{                              L->Next=q;                              L=L->Next;                              q=q->Next;                      }                      if(p!=NULL){                              L->Next=p;                      }                      if(q!=NULL){                              L->Next=q;                      }              }              L1->Next=NULL;              L2->Next=NULL;              return L0;     } ```

用tensorflow做机器翻译时训练代码有问题

``` # -*- coding:UTF-8 -*- import tensorflow as tf src_path = 'D:/Python37/untitled1/train.tags.en-zh.en.deletehtml' trg_path = 'D:/Python37/untitled1/train.tags.en-zh.zh.deletehtml' SRC_TRAIN_DATA = 'D:/Python37/untitled1/train.tags.en-zh.en.deletehtml.segment' # 源语言输入文件 TRG_TRAIN_DATA = 'D:/Python37/untitled1/train.tags.en-zh.zh.deletehtml.segment' # 目标语言输入文件 CHECKPOINT_PATH = './model/seq2seq_ckpt' # checkpoint保存路径 HIDDEN_SIZE = 1024 # LSTM的隐藏层规模 NUM_LAYERS = 2 # 深层循环神经网络中LSTM结构的层数 SRC_VOCAB_SIZE = 10000 # 源语言词汇表大小 TRG_VOCAB_SIZE = 4000 # 目标语言词汇表大小 BATCH_SIZE = 100 # 训练数据batch的大小 NUM_EPOCH = 5 # 使用训练数据的轮数 KEEP_PROB = 0.8 # 节点不被dropout的概率 MAX_GRAD_NORM = 5 # 用于控制梯度膨胀的梯度大小上限 SHARE_EMB_AND_SOFTMAX = True # 在softmax层和词向量层之间共享参数 MAX_LEN = 50 # 限定句子的最大单词数量 SOS_ID = 1 # 目标语言词汇表中<sos>的ID """ function: 数据batching,产生最后输入数据格式 Parameters: file_path-数据路径 Returns: dataset- 每个句子-对应的长度组成的TextLineDataset类的数据集对应的张量 """ def MakeDataset(file_path): dataset = tf.data.TextLineDataset(file_path) # map(function, sequence[, sequence, ...]) -> list # 通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个集合。 # function可以理解为是一个一对一或多对一函数,map的作用是以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的list。 # lambda argument_list: expression # 其中lambda是Python预留的关键字,argument_list和expression由用户自定义 # argument_list参数列表, expression 为函数表达式 # 根据空格将单词编号切分开并放入一个一维向量 dataset = dataset.map(lambda string: tf.string_split([string]).values) # 将字符串形式的单词编号转化为整数 dataset = dataset.map(lambda string: tf.string_to_number(string, tf.int32)) # 统计每个句子的单词数量,并与句子内容一起放入Dataset dataset = dataset.map(lambda x: (x, tf.size(x))) return dataset """ function: 从源语言文件src_path和目标语言文件trg_path中分别读取数据,并进行填充和batching操作 Parameters: src_path-源语言,即被翻译的语言,英语. trg_path-目标语言,翻译之后的语言,汉语. batch_size-batch的大小 Returns: dataset- 每个句子-对应的长度 组成的TextLineDataset类的数据集 """ def MakeSrcTrgDataset(src_path, trg_path, batch_size): # 首先分别读取源语言数据和目标语言数据 src_data = MakeDataset(src_path) trg_data = MakeDataset(trg_path) # 通过zip操作将两个Dataset合并为一个Dataset,现在每个Dataset中每一项数据ds由4个张量组成 # ds[0][0]是源句子 # ds[0][1]是源句子长度 # ds[1][0]是目标句子 # ds[1][1]是目标句子长度 #https://blog.csdn.net/qq_32458499/article/details/78856530这篇博客看一下可以细致了解一下Dataset这个库,以及.map和.zip的用法 dataset = tf.data.Dataset.zip((src_data, trg_data)) # 删除内容为空(只包含<eos>)的句子和长度过长的句子 def FilterLength(src_tuple, trg_tuple): ((src_input, src_len), (trg_label, trg_len)) = (src_tuple, trg_tuple) # tf.logical_and 相当于集合中的and做法,后面两个都为true最终结果才会为true,否则为false # tf.greater Returns the truth value of (x > y),所以以下所说的是句子长度必须得大于一也就是不能为空的句子 # tf.less_equal Returns the truth value of (x <= y),所以所说的是长度要小于最长长度 src_len_ok = tf.logical_and(tf.greater(src_len, 1), tf.less_equal(src_len, MAX_LEN)) trg_len_ok = tf.logical_and(tf.greater(trg_len, 1), tf.less_equal(trg_len, MAX_LEN)) return tf.logical_and(src_len_ok, trg_len_ok) #两个都满足才返回true # filter接收一个函数Func并将该函数作用于dataset的每个元素,根据返回值True或False保留或丢弃该元素,True保留该元素,False丢弃该元素 # 最后得到的就是去掉空句子和过长的句子的数据集 dataset = dataset.filter(FilterLength) # 解码器需要两种格式的目标句子: # 1.解码器的输入(trg_input), 形式如同'<sos> X Y Z' # 2.解码器的目标输出(trg_label), 形式如同'X Y Z <eos>' # 上面从文件中读到的目标句子是'X Y Z <eos>'的形式,我们需要从中生成'<sos> X Y Z'形式并加入到Dataset # 编码器只有输入,没有输出,而解码器有输入也有输出,输入为<sos>+(除去最后一位eos的label列表) # 例如train.en最后都为2,id为2就是eos def MakeTrgInput(src_tuple, trg_tuple): ((src_input, src_len), (trg_label, trg_len)) = (src_tuple, trg_tuple) # tf.concat用法 https://blog.csdn.net/qq_33431368/article/details/79429295 trg_input = tf.concat([[SOS_ID], trg_label[:-1]], axis=0) return ((src_input, src_len), (trg_input, trg_label, trg_len)) dataset = dataset.map(MakeTrgInput) # 随机打乱训练数据 dataset = dataset.shuffle(10000) # 规定填充后的输出的数据维度 padded_shapes = ( (tf.TensorShape([None]), # 源句子是长度未知的向量 tf.TensorShape([])), # 源句子长度是单个数字 (tf.TensorShape([None]), # 目标句子(解码器输入)是长度未知的向量 tf.TensorShape([None]), # 目标句子(解码器目标输出)是长度未知的向量 tf.TensorShape([])) # 目标句子长度(输出)是单个数字 ) # 调用padded_batch方法进行padding 和 batching操作 batched_dataset = dataset.padded_batch(batch_size, padded_shapes) return batched_dataset """ function: seq2seq模型 Parameters: Returns: """ class NMTModel(object): """ function: 模型初始化 Parameters: Returns: """ def __init__(self): # 定义编码器和解码器所使用的LSTM结构 self.enc_cell = tf.nn.rnn_cell.MultiRNNCell( [tf.nn.rnn_cell.LSTMCell(HIDDEN_SIZE) for _ in range(NUM_LAYERS)]) self.dec_cell = tf.nn.rnn_cell.MultiRNNCell( [tf.nn.rnn_cell.LSTMCell(HIDDEN_SIZE) for _ in range(NUM_LAYERS)]) # 为源语言和目标语言分别定义词向量 self.src_embedding = tf.get_variable('src_emb', [SRC_VOCAB_SIZE, HIDDEN_SIZE]) self.trg_embedding = tf.get_variable('trg_emb', [TRG_VOCAB_SIZE, HIDDEN_SIZE]) # 定义softmax层的变量 if SHARE_EMB_AND_SOFTMAX: self.softmax_weight = tf.transpose(self.trg_embedding) else: self.softmax_weight = tf.get_variable('weight', [HIDDEN_SIZE, TRG_VOCAB_SIZE]) self.softmax_bias = tf.get_variable('softmax_loss', [TRG_VOCAB_SIZE]) """ function: 在forward函数中定义模型的前向计算图 Parameters:   MakeSrcTrgDataset函数产生的五种张量如下(全部为张量) src_input: 编码器输入(源数据) src_size : 输入大小 trg_input:解码器输入(目标数据) trg_label:解码器输出(目标数据) trg_size: 输出大小 Returns: """ def forward(self, src_input, src_size, trg_input, trg_label, trg_size): batch_size = tf.shape(src_input)[0] # 将输入和输出单词转为词向量(rnn中输入数据都要转换成词向量) # 相当于input中的每个id对应的embedding中的向量转换 src_emb = tf.nn.embedding_lookup(self.src_embedding, src_input) trg_emb = tf.nn.embedding_lookup(self.trg_embedding, trg_input) # 在词向量上进行dropout src_emb = tf.nn.dropout(src_emb, KEEP_PROB) trg_emb = tf.nn.dropout(trg_emb, KEEP_PROB) # 使用dynamic_rnn构造编码器 # 编码器读取源句子每个位置的词向量,输出最后一步的隐藏状态enc_state # 因为编码器是一个双层LSTM,因此enc_state是一个包含两个LSTMStateTuple类的tuple, # 每个LSTMStateTuple对应编码器中一层的状态 # enc_outputs是顶层LSTM在每一步的输出,它的维度是[batch_size, max_time, HIDDEN_SIZE] # seq2seq模型中不需要用到enc_outputs,而attention模型会用到它 with tf.variable_scope('encoder'): enc_outputs, enc_state = tf.nn.dynamic_rnn(self.enc_cell, src_emb, src_size, dtype=tf.float32) # 使用dynamic_rnn构造解码器 # 解码器读取目标句子每个位置的词向量,输出的dec_outputs为每一步顶层LSTM的输出 # dec_outputs的维度是[batch_size, max_time, HIDDEN_SIZE] # initial_state=enc_state表示用编码器的输出来初始化第一步的隐藏状态 # 编码器最后编码结束最后的状态为解码器初始化的状态 with tf.variable_scope('decoder'): dec_outputs, _ = tf.nn.dynamic_rnn(self.dec_cell, trg_emb, trg_size, initial_state=enc_state) # 计算解码器每一步的log perplexity # 输出重新转换成shape为[,HIDDEN_SIZE] output = tf.reshape(dec_outputs, [-1, HIDDEN_SIZE]) # 计算解码器每一步的softmax概率值 logits = tf.matmul(output, self.softmax_weight) + self.softmax_bias # 交叉熵损失函数,算loss loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.reshape(trg_label, [-1]), logits=logits) # 在计算平均损失时,需要将填充位置的权重设置为0,以避免无效位置的预测干扰模型的训练 label_weights = tf.sequence_mask(trg_size, maxlen=tf.shape(trg_label)[1], dtype=tf.float32) label_weights = tf.reshape(label_weights, [-1]) cost = tf.reduce_sum(loss * label_weights) cost_per_token = cost / tf.reduce_sum(label_weights) # 定义反向传播操作 trainable_variables = tf.trainable_variables() # 控制梯度大小,定义优化方法和训练步骤 # 算出每个需要更新的值的梯度,并对其进行控制 grads = tf.gradients(cost / tf.to_float(batch_size), trainable_variables) grads, _ = tf.clip_by_global_norm(grads, MAX_GRAD_NORM) # 利用梯度下降优化算法进行优化.学习率为1.0 optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0) # 相当于minimize的第二步,正常来讲所得到的list[grads,vars]由compute_gradients得到,返回的是执行对应变量的更新梯度操作的op train_op = optimizer.apply_gradients(zip(grads, trainable_variables)) return cost_per_token, train_op """ function: 使用给定的模型model上训练一个epoch,并返回全局步数,每训练200步便保存一个checkpoint Parameters: session : 会议 cost_op : 计算loss的操作op train_op: 训练的操作op saver:  保存model的类 step:   训练步数 Returns: """ def run_epoch(session, cost_op, train_op, saver, step): # 训练一个epoch # 重复训练步骤直至遍历完Dataset中所有数据 while True: try: # 运行train_op并计算cost_op的结果也就是损失值,训练数据在main()函数中以Dataset方式提供 cost, _ = session.run([cost_op, train_op]) # 步数为10的倍数进行打印 if step % 10 == 0: print('After %d steps, per token cost is %.3f' % (step, cost)) # 每200步保存一个checkpoint if step % 200 == 0: saver.save(session, CHECKPOINT_PATH, global_step=step) step += 1 except tf.errors.OutOfRangeError: break return step """ function: 主函数 Parameters: Returns: """ def main(): # 定义初始化函数 initializer = tf.random_uniform_initializer(-0.05, 0.05) # 定义训练用的循环神经网络模型 with tf.variable_scope('nmt_model', reuse=None, initializer=initializer): train_model = NMTModel() # 定义输入数据 data = MakeSrcTrgDataset(SRC_TRAIN_DATA, TRG_TRAIN_DATA, BATCH_SIZE) iterator = data.make_initializable_iterator() (src, src_size), (trg_input, trg_label, trg_size) = iterator.get_next() # 定义前向计算图,输入数据以张量形式提供给forward函数 cost_op, train_op = train_model.forward(src, src_size, trg_input, trg_label, trg_size) # 训练模型 # 保存模型 saver = tf.train.Saver() step = 0 with tf.Session() as sess: # 初始化全部变量 tf.global_variables_initializer().run() # 进行NUM_EPOCH轮数 for i in range(NUM_EPOCH): print('In iteration: %d' % (i + 1)) sess.run(iterator.initializer) step = run_epoch(sess, cost_op, train_op, saver, step) if __name__ == '__main__': main() ``` 问题如下,不知道怎么解决,谢谢! Traceback (most recent call last): File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1334, in _do_call return fn(*args) File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1319, in _run_fn options, feed_dict, fetch_list, target_list, run_metadata) File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1407, in _call_tf_sessionrun run_metadata) tensorflow.python.framework.errors_impl.InvalidArgumentError: StringToNumberOp could not correctly convert string: This [[{{node StringToNumber}}]] [[{{node IteratorGetNext}}]] During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:/Python37/untitled1/train_model.py", line 277, in <module> main() File "D:/Python37/untitled1/train_model.py", line 273, in main step = run_epoch(sess, cost_op, train_op, saver, step) File "D:/Python37/untitled1/train_model.py", line 231, in run_epoch cost, _ = session.run([cost_op, train_op]) File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 929, in run run_metadata_ptr) File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1152, in _run feed_dict_tensor, options, run_metadata) File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1328, in _do_run run_metadata) File "D:\Anaconda\envs\tensorflow\lib\site-packages\tensorflow\python\client\session.py", line 1348, in _do_call raise type(e)(node_def, op, message) tensorflow.python.framework.errors_impl.InvalidArgumentError: StringToNumberOp could not correctly convert string: This [[{{node StringToNumber}}]] [[node IteratorGetNext (defined at D:/Python37/untitled1/train_model.py:259) ]]

二叉树递归中,将递增的静态变量最后变回零,怎么做?

//按照前序遍历序列建立二叉树 void CreateBTree_Pre(BTNode *&root, DataType Array[]) { static int count=0; //静态变量count char item=Array[count];//读取Array[]数组中的第count个元素 count++; if(item == '#') //如果读入#字符,创建空树 { root = NULL; return ;} else { root = new BTNode; root->data = item; CreateBTree_Pre (root->lchild,Array); //建左子树 CreateBTree_Pre (root->rchild,Array); //建右子树 } } 我发现一个问题,这个建立二叉树,只能在main函数中建立一次,执行了一次CreateBTree_Pre函数后,count的值就非零了。我要让这函数执行完后count变回零,怎么写? 我把count=0放在else块的最后,经测试不行,把count--放在函数最后,经测试也不 行。这个在递归中将递增的静态变量最后变回零,怎么做啊?越想越乱了......

求问一道给我判错的noj问题,这题很水拿出几分钟时间就可的!!!

求各位大佬帮忙看一下.....这么水的题noj判我PE.......真的那一瞬间吐了.....我运行如此正常请问哪里出现了问题呢?? ![图片说明](https://img-ask.csdn.net/upload/202006/07/1591526054_813014.jpg) ![图片说明](https://img-ask.csdn.net/upload/202006/07/1591526073_666209.jpg) ``` #include <iostream> using namespace std; int main(){ int num=2992,copy; int i; int sum[3]; while(num){ copy=num; for(i=0;i<3;i++) sum[i]=0; while(copy){ sum[0]=sum[0]+copy%10; copy=copy/10; } copy=num; while(copy){ sum[1]=sum[1]+copy%16; copy=copy/16; } copy=num; while(copy){ sum[2]=sum[2]+copy%12; copy=copy/12; } if(sum[0]==sum[1]&&sum[1]==sum[2]) cout<<num<<endl; num++; if(num>9999) break; } return 0; } ``` 感谢大佬ヽ(゚∀゚)メ(゚∀゚)ノ

JAVA程序的执行入口怎么看?

我用ADT新建了一个工程,默认的有一个叫MainActivity.java的文档: ``` package com.example.m_note0305; import android.support.v7.app.ActionBarActivity; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } } } ``` 然后我用网上COPY的代码又新建了一个文档SlNotepad.java: ``` package com.example.m_note0305;//把SlNotepad类纳入到m_note0305包内 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import javax.swing.event.*; import java.util.*; import java.awt.datatransfer.*; class text implements Serializable{ /**/ private static final long serialVersionUID = -5303411698842652024L;//序列化版本对象控制 String keyword;//密码 String textmain;//文本部分 } public class SlNotepad extends JFrame implements ActionListener,ListSelectionListener{//公共类名必须和文件名一致 /**/ private static final long serialVersionUID = -1229804758759177927L; //extends表示继承 MenuBar bar;//菜单栏 Menu file,edit,format,help; MenuItem open,dsave,save,newwork,quit,about,fontchoose,colorchoose,backchoose,timeadd,keyopen,keysave,zcancel,copy,paste,cut,delete,selectall,search,autoline; MenuShortcut opencut,dsavecut,savecut,newworkcut,quitcut,aboutcut,fontchoosecut,colorchoosecut,backchoosecut,timeaddcut,keyopencut,keysavecut,zcancelcut,copycut,pastecut,cutcut,deletecut,selectallcut,searchcut,autolinecut; Toolkit tool=this.getToolkit(); Clipboard clip;//剪贴版 Image image=tool.getImage("data/icon.jpg");//框架图标 JTextArea textarea;//文本区域 //此处省略一万字 public static void main(String[] args){ SlNotepad SlNotepad=new SlNotepad("亮亮记事本1.0正式版"); SlNotepad.setVisible(true);//show(); } } ``` 程序跑起来的效果是,就仿佛后面的文档不存在一样。 MainActivity.java里面没有main函数啊,它是怎样开始执行的? 我不知道怎样把自定义的那个记事本类型用起来,求大神指点~~

当s1,s2链表不为空时,s3为空,交集为空时程序停止工作

# 两个有序链表序列的交集 (20分) 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。 输出格式: 在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。 ``` #include <stdio.h> #include <stdlib.h> typedef struct LNode { int Data; struct LNode *Next; }List; int main() { List *s1,*s2,*s3,*p1,*p2,*p3; int x1,x2; s1 = (List *)malloc(sizeof(List)); s2 = (List *)malloc(sizeof(List)); s3 = (List *)malloc(sizeof(List)); s1->Next = NULL; s2->Next = NULL; p1 = s1; scanf("%d",&x1); while(x1 != -1) { p1->Next = (List*)malloc(sizeof(List)); p1->Next->Data = x1; p1 = p1->Next; p1->Next = NULL; scanf("%d",&x1); } scanf("%d",&x2); p2 = s2; while(x2 != -1) { p2->Next = (List*)malloc(sizeof(List)); p2->Next->Data = x2; p2 = p2->Next; p2->Next = NULL; scanf("%d",&x2); } p1 = s1->Next; p2 = s2->Next; p3 = s3; s3->Next = NULL; while(p1!=NULL&&p2!=NULL) { if(p1->Data>p2->Data) { p2 = p2->Next; } if(p1->Data<p2->Data) { p1 = p1->Next; } if(p1->Data == p2->Data) { p3->Next = p1; p1 = p1->Next; p2 = p2->Next; p3 = p3->Next; } p3->Next = NULL; } p3 = s3->Next; if(p3 != NULL) { printf("%d",p3->Data); p3 = p3->Next; while(p3 != NULL) { printf(" %d",p3->Data); p3 = p3->Next; } } if(s3->Next == NULL)//当s1,s2链表不为空时,s3为空,运行c错误 { printf("NULL"); } return 0; } ``` 当s1,s2链表不为空时,s3为空,交集为空时程序停止工作

【c语言】【数据结构】无法找打自己定义的头文件BST.h

#include<stdio.h> #include<stdlib.h> #define MaxSize 100 #include"BST.h" void main() { int T; int data[MaxSize],i=0,num,j,choice,s; printf("请先输入空格符,再输入所要测试的序列T:\n"); while((getchar())!='\n') { scanf("%d",&num); data[i]=num; i++; } T=Create(data,i); printf("指令菜单如下:"); printf("\n 0: exit"); printf("\n 1中序遍历:"); printf("\n 2:查找成功的平均查找长度:"); printf("\n 3:删除:"); while(choice) { printf("\n choose the opperation to continue\n"); scanf("%d",&choice); switch(choice) { case 0: exit(0); case 1: printf("\n此二叉排序树中序遍历结果为:"); InorderTraverse(T,1); break; case 2: s=0; computeASL(T,1,&s,0); printf("\n二叉排序树T查找成功的平均查找长度:ASL=%d/%d",s,i); break; case 3: printf("输入你要删除的数据元素:"); scanf("%d",&num); j=Search(T,num,1); if(j) { T=Delete(T,num); printf("删除后,序列T的中序遍历结果:"); InorderTraverse(T,1); } else printf("此二叉排序树中无数据元素x\n"); break; } } } int Insert(BiTreeNode **root,int item) //插入 { BiTreeNode *current,*parent=NULL,*p; current= *root; while(current != NULL) { if(current->data == item) return 0; parent=current; if(current->data < item) current = current->rightChild; else current= current->leftChild; } p=(BiTreeNode *)malloc(sizeof(BiTreeNode)); if(p==NULL) { printf("空间不够!"); exit(1); } p->data = item; p->leftChild = NULL; p->rightChild = NULL; if(parent == NULL) *root = p; else if(item< parent->data) parent->leftChild =p; else parent->rightChild =p; return 1; } int Search(BiTreeNode *root,int item) { BiTreeNode *p; if(root!=NULL) { p=root; while(p!=NULL) { if(p->data == item) return 1; if(item>p->data) p=p->rightChild; else p=p->leftChild; } } return 0; } void InorderTraverse(BiTreeNode *root) //中序遍历显示 { if(root == NULL) return; if(root->leftChild != NULL) InorderTraverse(root->leftChild); printf("%d ",root->data); if(root->rightChild !=NULL) InorderTraverse(root->rightChild); } BiTreeNode* Delete(BiTreeNode *root,int x) //删除操作 { BiTreeNode *s,*curr,*f,*q; int flag=0; curr=root; while((curr!=NULL)&&(!flag)) //找到要删除的结点 { if(curr->data==x) flag=1; else if(x<curr->data) { f=curr; //记住双亲的指针 curr=curr->leftChild; } else { f=curr; curr=curr->rightChild; } } if(flag) { if(curr->leftChild==NULL&&curr->rightChild==NULL) //左右子树都为空 { if(curr==root) { free(curr); root=NULL; } else { if(curr==f->leftChild) { free(curr); f->leftChild=NULL; } else { free(curr); f->rightChild=NULL; } } } else if(curr->leftChild==NULL&&curr->rightChild!=NULL) //左子树为空 { if(curr==root) { root=curr->rightChild; free(curr); } else { s=curr->rightChild; if(curr==f->leftChild) //判断要删除结点是双亲结点的左子树还是右子树 f->leftChild=s; else f->rightChild=s; free(curr); } } else if(curr->rightChild==NULL&&curr->leftChild!=NULL) //右子树为空 { if(curr==root) { root=curr->leftChild; free(curr); } else { s=curr->leftChild; if(curr==f->leftChild) //判断要删除结点是双亲结点的左子树还是右子树 f->leftChild=s; else f->rightChild=s; free(curr); } } else //左,右子树都有 { q=curr; s=curr->rightChild; while(s->leftChild!=NULL) { q=s; s=s->leftChild; } curr->data=s->data; if(curr=q) { if(s->rightChild==NULL) { free(s); q->rightChild=NULL; } else { q->rightChild=s->rightChild; free(s); } } else { if(s->rightChild==NULL) { free(s); q->leftChild=NULL; } else { q->leftChild=s->rightChild; free(s); } } } } else printf("此二叉排序树为空"); return root; } #include <stdio.h> #include<stdlib.h> #include"math.h" #define MaxSize 100 typedef struct node { int data; struct node *leftChild; struct node *rightChild; }BiTreeNode; #include "BiTree.h" void main() { int T[MaxSize],x,choice; int i=0,n; double ASL; BiTreeNode *root =NULL; printf("请先输入一个空格符,再输入所要测试的序列T:\n"); //getchar()函数的要求 while((getchar()) !='\n') //以\n作为输入结束的标志 { scanf("%d",&T[i]); i++; } n=i; for(int j=0;j<n;j++) Insert(&root,T[j]); printf("指令菜单如下:"); printf("\n 0: exit"); printf("\n 1中序遍历:"); printf("\n 2:查找成功的平均查找长度:"); printf("\n 3:删除:"); while(choice) { printf("\n choose the opperation to continue\n"); scanf("%d",&choice); switch(choice) { case 0: exit(0); case 1: printf("\n此二叉排序树中序遍历结果为:"); InorderTraverse(root); break; case 2: ASL=(log10(n+1))/(log10(2)); printf("\n二叉排序树T查找成功的平均查找长度:%f\n",ASL); break; case 3: printf("输入你要删除的数据元素:"); scanf("%d",&x); if(Search(root,x)) { root=Delete(root,x); printf("删除后,序列T的中序遍历结果:"); InorderTraverse(root); } else printf("此二叉排序树中无数据元素%d\n",x); break; } } } typedef struct { int *data; int size; }BST; void Insert(BST T,int i,int key) { if(i<1||i>MaxSize) printf("overflow!"); if(T.data[i]==-1) T.data[i]=key; else if(key<T.data[i]) Insert(T,2*i,key); else if(key>T.data[i]) Insert(T,2*i+1,key); } BST Create(int *data,int num) { BST T; T.data=(int *)malloc(MaxSize*sizeof(int)); //动态申请数组空间 for(int j=0;j<MaxSize;j++) T.data[j]=-1; T.size=0; //初始化 for(int i=0;i<num;i++) { Insert(T,1,data[i]); T.size++; } return T; } void InorderTraverse(BST T,int i) { if(T.data[i]>=0) { InorderTraverse(T,2*i); printf("%d ",T.data[i]); InorderTraverse(T,2*i+1); } } int Search(BST T,int key,int i) { if(T.data[i]==-1) return 0; else if(key==T.data[i]) return 1; else if(key<T.data[i]) Search(T,key,2*i); else Search(T,key,2*i+1); } BST Delete(BST T,int key) { BST Q; Q.data=(int *)malloc(MaxSize*sizeof(int)); for(int i=0;i<MaxSize;i++) Q.data[i]=-1; for(i=1;i<MaxSize&&T.size>0;i++) { if(T.data[i]==-1||T.data[i]==key) continue; Insert(Q,1,T.data[i]); T.size--; Q.size++; } return Q; } computeASL(BST T,int i,int *s,int j) //计算平均查找长度 { if(T.data[i]!=-1) { j++; //j记录当前结点的在当前树中的深度 *s=*s+j; //记录已遍历过的点的深度之和 if(computeASL(T,2*i,s,j)) //计算左子树的ASL { if(computeASL(T,2*i+1,s,j)) //计算右子树的ASL {j--; return 1;} } } else return 1; }

c语言警告问题,主函数里有一个警告

#include<stdio.h> #include <malloc.h> #include <conio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define QueueElementType BitTree typedef int DataType; typedef struct BitNode { DataType data; struct BitNode *LChild; struct BitNode *RChild; }BitNode,*BitTree; typedef struct Node {QueueElementType data; struct Node *next; }LinkQueueNode; typedef struct BitTree {LinkQueueNode *front; LinkQueueNode *rear; }LinkQueue; int InitQueue(LinkQueue *Q)/*将Q初始化为一个空的链队列*/ {Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if(Q->front!=NULL) {Q->rear=Q->front; Q->front->next=NULL; return(TRUE); } else return(FALSE);/*溢出*/ } int EnterQueue(LinkQueue *Q,QueueElementType x) {LinkQueueNode *NewNode; NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); if(NewNode!=NULL) {NewNode->data=x; NewNode->next=NULL; Q->rear->next=NewNode; Q->rear=NewNode; return(TRUE); } else return(FALSE);/*溢出*/ } int DeleteQueue(LinkQueue *Q,QueueElementType *x) {LinkQueueNode *p; if(Q->front==Q->rear) return(FALSE); p=Q->front->next; Q->front->next=p->next;/*队头元素出队*/ if(Q->rear==p) Q->rear=Q->front; *x=p->data; free(p); return(TRUE); } int IsEmpty(LinkQueue *Q) {if((Q->front)==(Q->rear)) return TRUE; else return FALSE; } int CreatBiTree(BitTree *bt)/*用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点*/ { char ch; do {scanf("%c",&ch); }while(ch=='\n'); if(ch=='0') *bt=NULL; else { *bt=(BitTree)malloc(sizeof(BitNode)); (*bt)->data=ch; CreatBiTree(&((*bt)->LChild)); CreatBiTree(&((*bt)->RChild)); } return OK; } void Visit(char ch)/*访问根节点*/ { printf("%c",ch); } void PreOrder(BitTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { Visit(root ->data); /*访问根结点*/ PreOrder(root ->LChild); /*先序遍历左子树*/ PreOrder(root ->RChild); /*先序遍历右子树*/ } } void InOrder(BitTree root) /*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { InOrder(root ->LChild); /*中序遍历左子树*/ Visit(root ->data); /*访问根结点*/ InOrder(root ->RChild); /*中序遍历右子树*/ } } void PostOrder(BitTree root) /* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ { if(root!=NULL) { PostOrder(root ->LChild); /*后序遍历左子树*/ PostOrder(root ->RChild); /*后序遍历右子树*/ Visit(root ->data); /*访问根结点*/ } } int LayerOrder(BitTree bt) {LinkQueue Q; BitTree p; InitQueue(&Q);/*初始化队列*/ if(bt==NULL) return ERROR;/*二叉树为空树则结束遍历*/ EnterQueue(&Q,bt);/*二叉树非空则根节点bt入队,开始层次遍历*/ while(IsEmpty(&Q)!=1) /*若队列非空则遍历继续*/ {DeleteQueue(&Q,&p);/*对头元素出对并访问*/ Visit(p->data); if(p->LChild!=NULL) EnterQueue(&Q,p->LChild);/*若p的左孩子非空则入队*/ if(p->RChild!=NULL) EnterQueue(&Q,p->RChild); } return OK; } void path(BitTree root,char r) {BitNode *p,*q; int i,top=0; BitTree s[50]; q=NULL; p=root; while(p!=NULL||top!=0) {while(p!=NULL) {top++; if(top>=50) exit(0); s[top]=p; p=p->LChild; } if(top>0) {p=s[top]; if(p->RChild==NULL||p->RChild==q) {if(p->data==r) {for(i=1;i<=top;i++) printf("%c",s[i]->data); return ; } else {q=p; top--; p=NULL; } } else p=p->RChild; } } } int main() { BitTree T; int h,x; char *r; printf("请选择一下内容:\n"); printf("1.建立二叉树的存储结构。\n"); printf("2.求二叉树先序遍历序列。\n"); printf("3.求二叉树中序遍历序列。\n"); printf("4.求二叉树后序遍历序列。\n"); printf("5.求二叉树的层序遍历序列。\n"); printf("6.求根节点到指定节点的路径。\n"); do{ printf("请做出选择:"); scanf("%d",&h); switch(h) {case 1:printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树):\n"); CreatBiTree(&T);break; case 2:printf("先序遍历序列为:"); PreOrder(T);break; case 3:printf("\n中序遍历序列为:"); InOrder(T);break; case 4:printf("\n后序遍历序列为:"); PostOrder(T);break; case 5:printf("\n层序遍历序列为:"); LayerOrder(T); break; case 6:printf("\n根节点到指定节点的路径:"); scanf("%c",&r); path(T,r); break; } }while(h!=0); printf("退出"); } [Warning] passing arg 2 of `path' makes integer from pointer without a cast 这个警告怎么处理啊!!!

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

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

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

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

Python数据分析与挖掘

92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元 &nbsp; 为什么学习数据分析? &nbsp; &nbsp; &nbsp; 人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。 &nbsp; &nbsp; &nbsp; 从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。 &nbsp;&nbsp; 本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。 &nbsp; 二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。 &nbsp; 三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。 &nbsp; 四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。 &nbsp; 五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。

广工操作系统课程设计(文档+代码+可执行文件)

实现作业调度(先来先服务)、进程调度功能(时间片轮转) 实现内存管理功能(连续分配)。 实现文件系统功能(选作) 这些功能要有机地连接起来

Only老K说-爬取妹子图片(简单入门)

安装第三方请求库 requests 被网站禁止了访问 原因是我们是Python过来的 重新给一段 可能还是存在用不了,使用网页的 编写代码 上面注意看匹配内容 User-Agent:请求对象 AppleWebKit:请求内核 Chrome浏览器 //请求网页 import requests import re //正则表达式 就是去不规则的网页里面提取有规律的信息 headers = { 'User-Agent':'存放浏览器里面的' } response = requests.get

linux“开发工具三剑客”速成攻略

工欲善其事,必先利其器。Vim+Git+Makefile是Linux环境下嵌入式开发常用的工具。本专题主要面向初次接触Linux的新手,熟练掌握工作中常用的工具,在以后的学习和工作中提高效率。

Python代码实现飞机大战

文章目录经典飞机大战一.游戏设定二.我方飞机三.敌方飞机四.发射子弹五.发放补给包六.主模块 经典飞机大战 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 ————————————————————————————————————————————————————————— 不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每

Python数据清洗实战入门

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

2019 Python开发者日-培训

本次活动将秉承“只讲技术,拒绝空谈”的理念,邀请十余位身处一线的Python技术专家,重点围绕Web开发、自动化运维、数据分析、人工智能等技术模块,分享真实生产环境中使用Python应对IT挑战的真知灼见。此外,针对不同层次的开发者,大会还安排了深度培训实操环节,为开发者们带来更多深度实战的机会。

apache-jmeter-5.1.1(Requires Java 8+).zip

。Apache JMeter 5.1.1 (Requires Java 8+),需要jdk8以上的版本。

数通HCNP中文理论全套教材.rar

内涵HCNP-IENP中文理论书-内文,

Python可以这样学(第四季:数据分析与科学计算可视化)

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

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

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

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

2019 AI开发者大会

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼,如今蓄势待发:2019年9月6-7日,大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京,进行技术解读和产业论证。我们不空谈口号,只谈技术,诚挚邀请AI业内人士一起共铸人工智能新篇章!

图书管理系统(Java + Mysql)我的第一个完全自己做的实训项目

图书管理系统 Java + MySQL 完整实训代码,MVC三层架构组织,包含所有用到的图片资源以及数据库文件,大三上学期实训,注释很详细,按照阿里巴巴Java编程规范编写

Python数据挖掘简易入门

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

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

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

微信公众平台开发入门

本套课程的设计完全是为初学者量身打造,课程内容由浅入深,课程讲解通俗易懂,代码实现简洁清晰。通过本课程的学习,学员能够入门微信公众平台开发,能够胜任企业级的订阅号、服务号、企业号的应用开发工作。 通过本课程的学习,学员能够对微信公众平台有一个清晰的、系统性的认识。例如,公众号是什么,它有什么特点,它能做什么,怎么开发公众号。 其次,通过本课程的学习,学员能够掌握微信公众平台开发的方法、技术和应用实现。例如,开发者文档怎么看,开发环境怎么搭建,基本的消息交互如何实现,常用的方法技巧有哪些,真实应用怎么开发。

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

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

2021考研数学张宇基础30讲.pdf

张宇:博士,全国著名考研数学辅导专家,教育部“国家精品课程建设骨干教师”,全国畅销书《张宇高等数学18讲》《张宇线性代数9讲》《张宇概率论与数理统计9讲》《张宇考研数学题源探析经典1000题》《张宇考

专为程序员设计的数学课

<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdn590</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>

DDR5_Draft_Spec_Rev05c.pdf

DDR5 spec

Java面试史上最全的JAVA专业术语面试100问 (前1-50)

前言: 说在前面, 面试题是根据一些朋友去面试提供的,再就是从网上整理了一些。 先更新50道,下一波吧后面的也更出来。 求赞求关注!! 废话也不多说,现在就来看看有哪些面试题 1、面向对象的特点有哪些? 抽象、继承、封装、多态。 2、接口和抽象类有什么联系和区别? 3、重载和重写有什么区别? 4、java有哪些基本数据类型? 5、数组有没有length()方法?String有没有length()方法? 数组没有length()方法,它有length属性。 String有length()方法。 集合求长度用

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

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

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

Python界面版学生管理系统

前不久上传了一个控制台版本的学生管理系统,这个是Python界面版学生管理系统,这个是使用pycharm开发的一个有界面的学生管理系统,基本的增删改查,里面又演示视频和完整代码,有需要的伙伴可以自行下

2019数学建模A题高压油管的压力控制 省一论文即代码

2019数学建模A题高压油管的压力控制省一完整论文即详细C++和Matlab代码,希望对同学们有所帮助

4小时玩转微信小程序——基础入门与微信支付实战

这是一个门针对零基础学员学习微信小程序开发的视频教学课程。课程采用腾讯官方文档作为教程的唯一技术资料来源。杜绝网络上质量良莠不齐的资料给学员学习带来的障碍。 视频课程按照开发工具的下载、安装、使用、程序结构、视图层、逻辑层、微信小程序等几个部分组织课程,详细讲解整个小程序的开发过程

相关热词 c#中如何设置提交按钮 c#帮助怎么用 c# 读取合并单元格的值 c#带阻程序 c# 替换span内容 c# rpc c#控制台点阵字输出 c#do while循环 c#调用dll多线程 c#找出两个集合不同的
立即提问