C语言链表头结点的数据域指针域都为NULL的时候头结点指针是NULL吗?
struct STRU{
    char cdata;
    STRU *next;
};

把头结点数据域指针域都赋值为NULL

STRU *head=(STRU *)malloc(sizeof(STRU));
head->cdata=NULL;
head->next=NULL;

这是head为NULL吗,我看我们老师写的一个代码里这时head并不是NULL,谢谢了。

3个回答

当然不是,好比带篮子去菜场买菜,一个是带了篮子,篮子里面是空的。一个是篮子忘带了。
两者当然不同

不是的,链表数据结构是一种数据,和其他的数据结构没有什么不同。当声明或动态申请一个链表数据结构时,假设这个变量是head,不管head中存放的是什么,head是存在的.

谢谢解答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
小白求助:c语言链表头结点无法删除,请各位老师指教,不胜感激.
![图片说明](https://img-ask.csdn.net/upload/201601/24/1453639865_885309.png) 这是运行后的结果 下面是代码,请各位前辈指教,谢谢! ``` #include "stdio.h" #include "string.h" #include "stdlib.h" #define len sizeof(struct student) typedef struct student { char id[10]; char name[20]; struct student *next; }STU; //分割线的输出 void line() { int i; for(i=0;i<30;i++) { printf("-"); } printf("\n"); } //新建链表 STU *link(int n) { STU *head,*p,*p1; int i=1; while(n<=0) { printf("分配失败,请输入你要录入学生的个数:"); scanf("%d",&n); line(); } head=p=p1=(struct student *)malloc(len); printf("请输入第1个学生信息(学号,姓名):\n"); scanf("%s%s",p1->id,p1->name); for(i=2;i<=n;i++) { p1=(struct student *)malloc(len); line(); printf("请输入%d个学生信息(学号,姓名):\n",i); scanf("%s%s",p1->id,p1->name); p->next=p1; p=p1; } p1->next=NULL; return head;//返回头指针 } //链表的输出 void output(STU *head) { STU *p=head; line(); if(p!=NULL) printf("学号\t姓名\n"); while(p!=NULL) { printf("%s\t%s\n",p->id,p->name); p=p->next; } } //链表查找 void find(STU *head,char *name) { STU *p=head; while(p!=NULL) { if (strcmp(p->name,name)==0) { break; } p=p->next; } if(p==NULL) { line(); printf("对不起,找不到此学生\n"); } else { line(); printf("学号\t姓名\n"); printf("%s\t%s\n",p->id,p->name); } } //链表的删除 STU *del(STU *head,char *name) { STU *p=head,*front; if (strcmp(head->name,name)==0) { head=head->next; return head; } while(p!=NULL) { if (strcmp(p->name,name)==0) { break; } front=p; p=p->next; } if (p!=NULL) { front->next=p->next; } else { printf("找不到该学生;"); } return head; } void main() { STU *head; int n; char name[20]; head=NULL; printf("请输入你要录入学生的个数:"); scanf("%d",&n); line(); head=link(n); output(head); /* printf("请输入要查找的学生姓名:\n"); getchar(); gets(name); output(find(head,name));*/ line(); printf("请输入你要删的学生的姓名:\n"); getchar(); gets(name); del(head,name); output(head); } ```
关于链表打印问题,链表头与表头指针所指向的节点。
typedef struct Node { int data; struct Node *next; }SLIST; p = pHead->next; p为头链表的指针,也就是指向第二个节点,应该从用户输入的第二个数字打印才对。 为什么连链表头都打印了?![图片](https://img-ask.csdn.net/upload/201602/18/1455787513_927132.png)![图片](https://img-ask.csdn.net/upload/201602/18/1455787521_576596.png) 这个是看不清部分的代码 SLIST *Creat_SList() { //1 创建头结点并初始化 int data = 0; SLIST *pHead = NULL, *pM = NULL, *pCur; pHead = (SLIST *)malloc(sizeof(SLIST)); pHead->data = 0; pHead->next = NULL; //2循环创建结点,结点数据域中的数值从键盘输入, //以-1作为输入结束标志 printf("\nPlease enter the data of node(-1:quit) "); scanf("%d", &data); //准备环境 让pCur指向pHead pCur = pHead; while(data != -1) { //不断的malloc新节点 并且数据域 赋值 pM = (SLIST *)malloc(sizeof(SLIST)); pM->data = data; pM->next = NULL; //1新节点入链表 pCur->next = pM; //2 当前结点下移(新结点变成当前结点) pCur = pM; // (pCur = pCur->next) pCur之前不是指向head吗?现在指向了PM. printf("\nPlease enter the data of node(-1:quit) "); scanf("%d", &data); } return pHead; } 我链表头也记录数据了,它应该从第二个接点开始打印才对,为什么从链表头开始打印了?
验证线性表及其上的基本操作。
要求 1、 定义单链表类及双向循环链表类。 2、 实现如下功能: 1 根据输入的测试数据(整型)按序从无到有创建一个单链表 L1。 比如,输入{9,2,5},单链表 L1 中结点顺序为,9->2->5 。 2 根据老师输入的测试数据(整型)创建一个非降序单链表 L2。比如, 输入{9,2,5},单链表 L2 中结点顺序为,2->5->9。 3 打印单链表 L2 中表头至表尾所有结点的数据域值,并输出单链表长度 以及这些结点数据域之和。 4 打印单链表 L1 中表尾至表头所有结点的数据域值,并输出最大值及最 小值。 5 由单链表 L1 生成一个双向循环链表 L3. 查找 L3 中任一结点,并输出从 该结点出发沿右指针域访问的线性表遍历序列。
写了链表插入函数 主函数却没实现插入功能
#include<iostream> #include<stdlib.h> #include<cstdio> #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef int ElemType; typedef int Status; typedef struct LNode { ElemType data; //结点的数据域 struct LNode *next; //结点的指针域 }LNode,*Linklist; //Linklist为指向结构体LNode的指针类型 void CreateList_R(Linklist &L,int n) //正位序输入n个元素的值,建立带表头结点的单链表L { int i; LNode *p,*r; L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 L->next=NULL; //先建立一个带头结点的空链表 r=L; //尾指针r指向头节点 for(i=0;i<n;++i) { p=new LNode; //生成新结点 cin>>p->data; //输入元素值赋给新结点*p的数据域 p->next=NULL; r->next=p; //将新结点*p插入尾结点*r之后 r=p; //r指向新的尾结点*p } } void ListOutput(Linklist L) //输出链表 { LNode *p; p=L->next; while (p != NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } Status ListInsert(Linklist &L,int i,ElemType e) //在带头结点的单链表L中第i个位置插入值为e的新结点 { LNode *p,*r; int j; p=L; j=0; while(p && (j<i-1)) { p=p->next; ++j; //查找第i-1个结点,p指向该节点 } if(!p||j>i-1) return ERROR; //i>n+1或i<1 r=new LNode; //生成新结点*m r->data=e; //将结点*m的数据域置为e r->next=p->next; //将结点*m的指针域指向结点ai p->next=r; //将结点*p的指针域指向结点m return OK; } void nizhi(Linklist &L) { LNode *s,*q; q=L->next; L->next=NULL; ////将链表断开分成两个链表,第二个链表不带头结点,q是头指针 while(q!=NULL) { s=q; //摘下第二个链表的首结点,使s指向它 q=q->next; s->next=L->next; //将结点*s头插到链表L中 L->next=s; } } int main() { Linklist L; ElemType e; int n; int i; cout<<"输入数据个数:"<<endl; cin>>n; cout<<endl; cout<<"输入链表:"<<endl; CreateList_R(L,n); cout<<"插入前的链表:"<<endl; ListOutput(L); cout<<endl<<"插入数据:"; cin>>e; ListInsert(L,i,e); cout<<"插入后的线性表:"<<endl; ListOutput(L); cout<<"逆置:"<<endl; nizhi(L); ListOutput(L); } ``` ```
请求大佬支援!!!单链表报空指针异常
![图片说明](https://img-ask.csdn.net/upload/201912/11/1576038663_286088.jpg) **add方法报空指针异常** ``` package exercise.LinearTable.impl; import exercise.LinearTable.LinearList; public class SingleList{ Node head = null;//表头 public boolean isEmpty() { int length = size(); if(length==0) { return true; } return false; } public int size() { int length = 0; Node temp = head; while(temp.next!=null) { length++; temp = temp.next; } return length; } public Object get(int index) { Node temp = head; int i = 1; if(index == 0) { return head; } while(temp.next!=null) { if(index==i) { return temp; } temp = temp.next; i++; } return temp; } public int add(Object element) { int i=0; if(head.next==null) { head.next = (Node) element; return i; } //新建一个节点 Node newnode = new Node(element); Node temp = head; //一个移动的指针(把头结点看做一个指向结点的指针) while(temp.next != null){ //遍历单链表,直到遍历到最后一个则跳出循环。 temp = temp.next; //往后移一个结点,指向下一个结点。 } temp.next = (Node) element; //temp为最后一个结点或者是头结点,将其next指向新结点 i++; //链表为空 return i; } public void insert(int index, Node element) { //首先需要判断指定位置是否合法, if(index<1||index>size()){ System.out.println("插入位置不合法。"); return; } Node temp = (Node) get(index); element.next = temp.next; temp.next = element; } @Override public Object remove(int index) { //判断index是否合理 if(index<1 || index>size()){ System.out.println("给定的位置不合理"); return null; } Node temp = (Node) get(index-1); temp = temp.next.next; return temp; } public void tostring() { Node temp = head; while(temp.next!=null) { System.out.print(" "+temp.data); temp = temp.next; } } public static void main(String[] args) { SingleList s = new SingleList(); s.add("1"); s.add("1"); s.add("1"); s.add("1"); s.tostring(); } } class Node{ Node next = null; Object data; public Node(Object data) { this.data = data; } } ```
SWT Table表头可以调整高度吗
最近在学习swt ,在用到table的时候想设置表头的高度,但是没找到设置高度的方法,求大佬们解答
c语言 图书管理程序设计,当对图书信息进行修改时,如若未找到则程序出错
#include <stdio.h> #include <stdlib.h> #include <string.h> //定义一本书 struct book { char name[10]; char writer[10]; char publisher[21]; char price[5]; }; struct Node { //int data; struct book data; struct Node* next; }; //创建表 struct Node* createList() { //结构体变量表示表头 //指针--->变量 动态内存申请 struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); headNode->next = NULL; return headNode; } //创建结点 struct Node* createNode(struct book data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } //插入结点 void insertNodeByHead(struct Node* headNode, struct book data) { struct Node* newNode = createNode(data); //表头法 newNode->next = headNode->next; headNode->next = newNode; } //指定位置删除 void deleteAppoinNode(struct Node* headNode, char* name) { //struct book struct Node* posNode = headNode->next; struct Node* posFrontNode = headNode; if (posNode == NULL) { printf("数据为空,无法删除!\n"); return; } //书名是字符串,字符串:strcmp while (strcmp(posNode->data.name,name)) { posFrontNode = posNode; posNode = posFrontNode->next; if (posNode == NULL) { printf("未找到指定位置无法删除!\n"); return; } } //找到了 posFrontNode->next = posNode->next; free(posNode); } //查找功能 struct Node* searchInfoByData(struct Node* headNode, char *name) { struct Node* pMove = headNode->next; if (pMove == NULL) return NULL; while (strcmp(pMove->data.name, name)) { pMove = pMove->next; } return pMove; } //打印 void printList(struct Node* headNode) { struct Node* pMove = headNode->next; //设计到数据的处理 printf("书名\t作者\t出版社\t价格\n"); while (pMove) { printf("%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.writer, pMove->data.publisher, pMove->data.price); pMove = pMove->next; } printf("\n"); } void menu() { //所有操作都同步到文件 printf("-------------【图书信息管理系统】-----------\n"); printf("\t\t1.录入图书信息\n"); printf("\t\t2.浏览图书信息\n"); printf("\t\t3.修改图书信息\n"); printf("\t\t4.删除图书信息\n"); printf("\t\t5.查找图书信息\n"); printf("\t\t0.退出系统\n"); printf("-------------------------------------------\n"); } struct Node* list = createList(); //接收指令 void keyDown() { int choice = 0; struct book data; struct Node* pMove = NULL; scanf("%d", &choice); switch (choice) { case 0: printf("正常退出!\n"); system("pause"); exit(0); break; case 1: printf("--------------【录入图书信息】-----------\n"); //插入链表 printf("请输入书名,作者,出版社,价格:\n"); fflush(stdin); //清空缓冲区 scanf("%s%s%s%s", data.name, &data.writer, data.publisher, data.price); insertNodeByHead(list, data); break; case 2: printf("--------------【浏览图书信息】-----------\n"); printList(list); //打印链表 break; case 3: printf("--------------【修改图书信息】-----------\n"); printf("请输入要修改的书名:"); scanf("%s", data.name); pMove = searchInfoByData(list, data.name); if (pMove == NULL) { printf("未找到相关信息,无法修改!\n"); system("pause"); } else { printf("请输入图书名,作者,出版社,价格:"); scanf("%s%s%s%s", data.name, &data.writer, data.publisher, data.price); strcpy(pMove->data.name, data.name); strcpy(pMove->data.writer, data.writer); strcpy(pMove->data.publisher, data.publisher); strcpy(pMove->data.price, data.price); } break; case 4: printf("--------------【删除图书信息】-----------\n"); printf("请输入删除的书名:"); scanf("%s", data.name); deleteAppoinNode(list, data.name); break; case 5: printf("--------------【查找图书信息】-----------\n"); printf("请输入要查找的书名:"); scanf("%s", data.name); pMove = searchInfoByData(list, data.name); if (pMove == NULL) { printf("未找到相关信息,无法删除!\n"); system("pause"); } else { printf("书名\t作者\t出版社\t价格\n"); printf("%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.writer, pMove->data.publisher, pMove->data.price); } break; default: printf("选择错误,重新输入\n"); system("pause"); break; } } int main() { while (1) { menu(); keyDown(); system("pause"); system("cls"); } system("pause"); return 0; }
c语言图书管理系统设计,卡在查找时如果是找不到则程序出错,大神能帮我解决一下吗?
输入是成功,但是如果查找的不是已输入,则程序出错。 #include <stdio.h> #include <stdlib.h> #include <string.h> //定义一本书 struct book { char name[10]; char writer[10]; char publisher[21]; char price[5]; }; struct Node { //int data; struct book data; struct Node* next; }; //创建表 struct Node* createList() { //结构体变量表示表头 //指针--->变量 动态内存申请 struct Node* headNode = (struct Node*)malloc(sizeof(struct Node)); headNode->next = NULL; return headNode; } //创建结点 struct Node* createNode(struct book data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } //插入结点 void insertNodeByHead(struct Node* headNode, struct book data) { struct Node* newNode = createNode(data); //表头法 newNode->next = headNode->next; headNode->next = newNode; } //指定位置删除 void deleteAppoinNode(struct Node* headNode, char* name) { //struct book struct Node* posNode = headNode->next; struct Node* posFrontNode = headNode; if (posNode == NULL) { printf("数据为空,无法删除!\n"); return; } //书名是字符串,字符串:strcmp while (strcmp(posNode->data.name,name)) { posFrontNode = posNode; posNode = posFrontNode->next; if (posNode == NULL) { printf("未找到指定位置无法删除!\n"); return; } } //找到了 posFrontNode->next = posNode->next; free(posNode); } //查找功能 struct Node* searchInfoByData(struct Node* headNode, char *name) { struct Node* pMove = headNode->next; if (pMove == NULL) return NULL; while (strcmp(pMove->data.name, name)) { pMove = pMove->next; } return pMove; } //打印 void printList(struct Node* headNode) { struct Node* pMove = headNode->next; //设计到数据的处理 printf("书名\t作者\t出版社\t价格\n"); while (pMove) { printf("%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.writer, pMove->data.publisher, pMove->data.price); pMove = pMove->next; } printf("\n"); } void menu() { //所有操作都同步到文件 printf("-------------【图书信息管理系统】-----------\n"); printf("\t\t1.录入图书信息\n"); printf("\t\t2.浏览图书信息\n"); printf("\t\t3.修改图书信息\n"); printf("\t\t4.删除图书信息\n"); printf("\t\t5.查找图书信息\n"); printf("\t\t0.退出系统\n"); printf("-------------------------------------------\n"); } struct Node* list = createList(); //接收指令 void keyDown() { int choice = 0; struct book data; struct Node* pMove = NULL; scanf("%d", &choice); switch (choice) { case 0: printf("正常退出!\n"); system("pause"); exit(0); break; case 1: printf("--------------【录入图书信息】-----------\n"); //插入链表 printf("请输入书名,作者,出版社,价格:\n"); fflush(stdin); //清空缓冲区 scanf("%s%s%s%s", data.name, &data.writer, data.publisher, data.price); insertNodeByHead(list, data); break; case 2: printf("--------------【浏览图书信息】-----------\n"); printList(list); //打印链表 break; case 3: printf("--------------【修改图书信息】-----------\n"); printf("请输入要修改的书名:"); scanf("%s", data.name); pMove = searchInfoByData(list, data.name); if (pMove == NULL) { printf("未找到相关信息,无法修改!\n"); system("pause"); } else { printf("请输入图书名,作者,出版社,价格:"); scanf("%s%s%s%s", data.name, &data.writer, data.publisher, data.price); strcpy(pMove->data.name, data.name); strcpy(pMove->data.writer, data.writer); strcpy(pMove->data.publisher, data.publisher); strcpy(pMove->data.price, data.price); } break; case 4: printf("--------------【删除图书信息】-----------\n"); printf("请输入删除的书名:"); scanf("%s", data.name); deleteAppoinNode(list, data.name); break; case 5: printf("--------------【查找图书信息】-----------\n"); printf("请输入要查找的书名:"); scanf("%s", data.name); pMove = searchInfoByData(list, data.name); if (pMove == NULL) { printf("未找到相关信息,无法删除!\n"); system("pause"); } else { printf("书名\t作者\t出版社\t价格\n"); printf("%s\t%s\t%s\t%s\n", pMove->data.name, pMove->data.writer, pMove->data.publisher, pMove->data.price); } break; default: printf("选择错误,重新输入\n"); system("pause"); break; } } int main() { while (1) { menu(); keyDown(); system("pause"); system("cls"); } system("pause"); return 0; }
结构体指针成员变量在赋值后被篡改了是怎么回事?
结构体指针地址没变,值被篡改了什么情况,有没有大神知道啊 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string.h" using namespace std; struct STU_LIST { char name[40]; int num; char sex[4]; int clas; struct STU_LIST *nex; }; /******************************************************************************************************************/ /*------------------------------------ -----数字提取------------ ---------------------------------------------*/ /******************************************************************************************************************/ int strEint(const char *str) { int len = strlen(str),i,num; char *tepnum,*tep; tepnum = new char[40]; tep=tepnum; i=len-1; *(tepnum+len) = '\0'; while (i>=0) { if (*(str+i)>='0'&&*(str+i)<='9') { *(tepnum+i)=*(str+i); } else { tepnum=tepnum+i+1; i=0; } i--; } num = atoi(tepnum); delete[] tep; return num; } struct STU_LIST *STU_insirt(struct STU_LIST *head,int n); struct STU_LIST *PRESENT_class; /******************************************************************************************************************/ /*------------------------------------ -----主程序------------ -------------------------------------------------*/ /******************************************************************************************************************/ int _tmain(int argc, _TCHAR* argv[]) { char *comad; int lep = -1; bool state = true,create_sign = false; comad = new char; cout<<"欢迎使用学生名单录入工具,请输入命令命令进行操作。\n输入help查询可用命令。"<<endl; PRESENT_class = new struct STU_LIST; PRESENT_class->clas = 10; PRESENT_class->num = 0; PRESENT_class->nex = NULL; while (state) { cin>>comad; int nums; struct STU_LIST *temp; nums = strEint(comad); if (nums <= 0) { cout<<"您的操作命令缺少有效参数或参数类型有误!!!"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } else { if(PRESENT_class != NULL) { temp = STU_insirt(PRESENT_class,nums); cout<<"temp->nex->"<<static_cast<const void *>(temp->nex)<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; cout<<temp->clas<<"班"<<temp->name<<"的信息记录已添加。"<<endl; if (temp->nex == NULL) { cout<<"本节点是尾结点"<<endl; } else { cout<<"头节点的学号是"<<temp->num<<endl; cout<<"第二个节点的学号是"<<temp->nex->num<<endl; } } else { cout<<"您要往哪个班级添加学生信息,请在添加信息前先选择一个班级的登记表。"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } } if (strstr(comad,"exit")!=NULL) { state = false; } } return 0; } /******************************************************************************************************************/ /*-----------------------------------------插入学生条目-----------------------------------------------------------*/ /******************************************************************************************************************/ struct STU_LIST *STU_insirt(struct STU_LIST *head,int n) { struct STU_LIST *temp,*stp1,*lastsp; temp = head; lastsp = NULL; bool sign = true; while (sign) { cout<<"当前节点学号是"<<temp->num<<endl; if(temp->num >= n) //假如要插入的学号不大于当前节点学号 { if(temp->num > n ) //假如要插入的学号小于当前节点学号,那么在当前节点前面创建新节点并录入学生数据 { stp1=(struct STU_LIST*) alloca(sizeof(struct STU_LIST)); stp1->num = n; stp1->clas = head->clas; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; stp1->nex = temp; if(temp == head ) //假如当前节点是头结点,那么设置新节点为表头 { head = stp1; sign = false; } else //假如当前节点不是头结点,将上一个节点的指针指向新节点,跳出循环结束命令 { lastsp->nex = stp1; sign = false; } } else //假如要插入的学号等于当前节点学号,那么更新该节点学生数据。 { cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; sign = false; } } else //假如要插入的学号大于当前节点学号 { cout<<"要插入的节点大于当前节点"<<endl; if(temp->num == 0) //假如当前节点学号等于0,意味着当前节点没有录入过数据,那么将本节点作为插入的节点录入学生数据。 { temp->num = n; cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; temp->nex = NULL; sign = false; } else //假如当前节点的学号不等于0。 { if(temp->nex == NULL) //假如当前节点是尾结点,那么在当前节点之后创建新节点 { stp1 = (struct STU_LIST*) alloca(sizeof(struct STU_LIST)); cout<<"stp1 -> "<<static_cast<const void *>(stp1)<<endl; stp1->num = n; cout<<"新节点的学号是"<<stp1->num<<endl; stp1->clas = head->clas; stp1->nex = NULL; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; temp->nex = stp1; cout<<"temp->nex->num="<<temp->nex->num<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; sign = false; } else //假如当前节点不是尾结点,那么将当前节点设置为下个节点 { lastsp = temp; temp = temp->nex; } } } } if(head->nex != NULL) { cout<<"head->nex->num="<<head->nex->num<<endl; cout<<"head->nex->num->"<<static_cast<const void *>(&head->nex->num)<<endl; } return head; } ![图片说明](https://img-ask.csdn.net/upload/201912/28/1577541877_870062.png) 在函数内部时候值不变,一出函数内存里的值就变了这是什么道理。
c++ 数据结构 单链表问题
给定一个带表头结点的单链表,设first为头指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。(要求:不允许使用数组作辅助空间)。
bootstrap添加动态表头的时候,如果表头有那种两行的怎么写?
js如图大概是这样的 ![图片说明](https://img-ask.csdn.net/upload/201907/23/1563881003_417808.png) 比如我要让名称下面对应三个名称 A名称 B名称 C名称 这样的表头应该怎么写 如图这样的表头 ![图片说明](https://img-ask.csdn.net/upload/201907/23/1563881123_539909.png) 具体我要怎么实现 用的bootstraptable 也不是动态表头 是静态的表头 不知道怎么写!
请求大佬支援!!!单链表报错
![图片说明](https://img-ask.csdn.net/upload/201912/10/1575965411_534750.jpg) ``` package exercise.LinearTable.impl; import exercise.LinearTable.LinearList; public class SingleList{ Node head = null;//表头 public boolean isEmpty() { int length = size(); if(length==0) { return true; } return false; } public int size() { int length = 0; Node temp = head; while(temp.next!=null) { length++; temp = temp.next; } return length; } public Object get(int index) { Node temp = head; int i = 1; if(index == 0) { return head; } while(temp.next!=null) { if(index==i) { return temp; } temp = temp.next; i++; } return temp; } public int add(Object element) { int i=0; if(head.next==null) { head.next = (Node) element; return i; } //新建一个节点 Node newnode = new Node(element); Node temp = head; //一个移动的指针(把头结点看做一个指向结点的指针) while(temp.next != null){ //遍历单链表,直到遍历到最后一个则跳出循环。 temp = temp.next; //往后移一个结点,指向下一个结点。 } temp.next = (Node) element; //temp为最后一个结点或者是头结点,将其next指向新结点 i++; //链表为空 return i; } public void insert(int index, Node element) { //首先需要判断指定位置是否合法, if(index<1||index>size()){ System.out.println("插入位置不合法。"); return; } Node temp = (Node) get(index); element.next = temp.next; temp.next = element; } @Override public Object remove(int index) { //判断index是否合理 if(index<1 || index>size()){ System.out.println("给定的位置不合理"); return null; } Node temp = (Node) get(index-1); temp = temp.next.next; return temp; } public void tostring() { Node temp = head; while(temp.next!=null) { System.out.print(" "+temp.data); temp = temp.next; } } public static void main(String[] args) { SingleList s = new SingleList(); s.add("1"); s.add("1"); s.add("1"); s.add("1"); s.tostring(); } } class Node{ Node next = null; Object data; public Node(Object data) { this.data = data; } } ```
java用前插法建立带表头结点的单链表;
下面是我自己写的,编译肯定是过不了的。我不明白的是,是否要接入接口LList,数组要怎么 实现,怎样打印在屏幕上,怎样写,需要怎么改,这类的编程在MyEclipse上要怎么写,是否 要分开写。谢谢你们了,拜托了 class Node<T>{ public T data; public Node<T> next; public Node(T data,Node<T> next){ this.data=data; this.next=next; } public Node(){ this(null,null); } } class SinglyLinkedList<T>{ protected Node<T> head; public SinglyLinkedList(){ this.head=new Node<T>(); } public SinglyLinkedList(T[] element){ this(); for(int i=0;i<element.length;i++){ head.next=new Node<T>(element[i],head.next); } } } public class Ex2_1{ public static void main(String args[]){ SinglyLinkedList s=new SinglyLinkedList(); T[] element={ 6,2,11,5,2,4,2}; System.out.print(); } }
程序运行后txt文本出现乱
程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答 请问这种情况该如何解决 ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134842_865518.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134945_774123.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576135365_278865.png) ``` #include<iostream> #include<string.h> #include<iomanip> #include<fstream> #include<stdio.h> #include <stdlib.h> using namespace std; int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} //打印一个节点的数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { pHead=pnode; pnode->pNext=0; return; } else //否则,插入到链表首部 { pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } if (p1==pHead) //如果要删除的是首结点 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库价格 unsigned int szNumber; char szPrice[20]; char szN; CList ShList; public: Repository(); //构造函数 Repository(char *name,int number,char *price); void SetRecord(char *name, int number,char *price); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,"\0"); szNumber=0; strcpy(szPrice,"\0"); } Repository::Repository(char *name,int number,char *price) { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *price) //输入数据函数 { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; return strcmp(szName,temp.szName); } void Repository::Show() //打印一个结点的数据 { cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl; } void Repository::AddRecord() //将记录添加到链表中 { CNode *pNode; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入新商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { cout<<"请输入新商品入库价格: "; cin>>szPrice; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szPrice); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<"请输入新商品名(输入0退出,并进入系统菜单) "; cin>>szName; } cout<<endl<<endl; } void Repository::Display() //显示全部链表数据 { cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n"; cout<<"目前库存共有商品信息记录是:\n\n"; cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl; ShList.ShowList(); cout<<endl<<endl; system("pause"); system("cls"); } void Repository::LookUpRecord() // 按照商品名查找 { CNode *pLook; char szName[20]; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while (strcmp(szName,"0")) { Repository sh(szName,0,"0"); //生成结点 pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { ShList.DeleteNode(pLook); cout<<szName<<"的信息记录删除成功!"<<endl; delete pLook; count--; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录删除失败!"<<endl; } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::ModifyRecord() //修改商品记录 { CNode *pLook; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: "; cin>>szName; cout<<"请输入修改后的商品数量:"; cin>>szNumber; cout<<"请输入修改后的商品入库价格: "; cin>>szPrice; cout<<"请确定是否修改此记录(Yes (Y) or No(N)):"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { pSh=new Repository; pSh->SetRecord(szName,szNumber,szPrice); pLook->InputData(pSh); cout<<szName<<"的信息记录修改成功!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录修改失败!"<<endl; } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { pSh=(Repository *)pLook->GetData(); cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); if (0==pSh->szNumber) { cout<<"该商品缺货,请及时补充!"<<endl; } else { cout<<"请输入您要取出的商品数量:"; cin>>szNumber; cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { if(pSh->szNumber<=szNumber) { cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl; pSh->szNumber=0; } else { pSh->szNumber-=szNumber; cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl; } cout<<szName<<"成功取出!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"您取消了该操作"<<endl; } } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::SaveToFile() //将链表中的数据保存在文件中 { ofstream outfile("repository.txt",ios::binary); if(! outfile) { cout<<"数据文件打开错误,没有将数据存入文件!\n"; return; } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 } outfile.close(); } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile("repository.txt",ios::binary); if(! infile) { cout<<"没有数据文件,请您先添加!\n\n"; return; } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 } ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); } void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { if (strChoice=="1") AddRecord(); else if (strChoice=="2") Display(); else if (strChoice=="3") LookUpRecord(); else if (strChoice=="4") DeleteRecord(); else if(strChoice=="5") ModifyRecord(); else if(strChoice=="6") Output(); else if (strChoice=="0") SaveToFile(); else cout<<"对不起,您的输入有误,请重新输入您的选择: "; } int main() { Repository repository; cout<<"*******************************************************************\n\n"; cout<<" 欢迎进入库存管理系统 \n\n"; cout<<"*******************************************************************\n\n"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<"【欢迎进入系统菜单】:\n\n\n"; cout<<" <1>.添加新商品信息记录\n\n"; cout<<" <2>.显示库存中商品信息记录内容\n\n"; cout<<" <3>.根据商品名查询库存中商品信息记录\n\n"; cout<<" <4>.根据商品名删除库存中商品信息记录\n\n"; cout<<" <5>.根据商品名修改库存中商品信息记录\n\n"; cout<<" <6>.商品出库\n\n"; cout<<" <0>.退出系统\n\n\n"; cout<<"【请输入您的选择】:"; cin>>strChoice; system("cls"); repository.Operate(strChoice); }while(strChoice!="0"); cout<<"***********************************************************************\n\n"; cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n"; cout<<"***********************************************************************\n\n"; system("pause"); } ```
vue element-ui table多级表头嵌套的问题
1.vue element-ui table多级表头嵌套,上面的行占一行,最后一行占剩下的所有,怎么设置类似rowspan,可以让上面的占用设置的行数。
文件读写失败,求问哪里出了错?
(学生成绩管理系统链表版)应该是文件读写的问题,第一次录入信息可以写入文件,但再次运行时无法读取之前写入的文件, 且会弹出“Debug error”的框,求问哪里出错了,谢谢 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242676_963443.png) 点击忽略以后不影响程序运行 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242700_492778.png) 可以输入信息,且写入了文件 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242713_264771.png) 但关闭文件后,再次运行程序,显示如下 ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242899_516963.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242722_393073.png) 无法读取之前写入的信息,程序也无法 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //创建学生信息结构体 struct student { char ID[20]; //学号 char name[20]; //姓名 int math; //高数成绩 int english; //英语成绩 int eletric; //电路成绩 int c_program; //C语言成绩 float sum; //总分 float aver; //平均分 }; //链式管理系统 struct Node { struct student data; struct Node* next; }; //创建表头,表示整个链表 struct Node* CreateList() { struct Node* head = (struct Node*)malloc(sizeof(struct Node)); head->next = NULL; return head; } //创建结点 struct Node* CreateNode(struct student data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; } //插入操作 void insertNode(struct Node* head, struct student data) { //创建插入结点 struct Node* newNode = CreateNode(data); newNode->next = head->next; head->next = newNode; } //删除操作 void deleteNode(struct Node* head, char *pID) { struct Node* cur, * prev; for (cur = head, prev = NULL;cur != NULL && strcmp(cur->data.ID, pID) != 0;prev = cur, cur = cur->next); if (cur == NULL) { printf("未找到相关数据\n"); system("pause"); return; } if (prev == NULL) head = head->next; else prev->next = cur->next; free(cur); return; } //打印操作 void printList(struct Node* head) { //从第二个结点开始打印 struct Node* p = head->next; printf("学号\t姓名\t高数\t英语\t电路\tC语言\t总分\t平均分\n"); while (p) { printf("%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver); p = p->next; } printf("\n"); } //按照平均分进行排序(冒泡排序法) void sort(struct Node* head) { struct Node* p, * pstart, * pend, * temp, * pre; p = head->next; pend = head; pstart = (struct Node*)malloc(sizeof(struct Node)); pstart->next = head; while (p != NULL) { temp = pstart->next, pre = pstart; while (temp != p && p->data.aver >= temp->data.aver) { temp = temp->next; pre = pre->next; } if (temp == p) pend = p; else { pend->next = p->next; p->next = temp; pre->next = p; } p = pend->next; } head = pstart->next; free(pstart); return; } //链表的文件操作 //链表的读文件操作 void readInfo(struct Node* head, char* fileName) { FILE* read = fopen(fileName, "r"); if (read == NULL) read = fopen(fileName, "w+"); struct student data; while (fscanf(read, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n", data.ID, data.name, data.math, data.english, data.eletric, data.c_program, data.sum, data.aver) != EOF) insertNode(head, data); fclose(read); } //链表的写文件操作 void writeInfo(struct Node* head, char *fileName) { FILE* write = fopen(fileName, "w"); struct Node* p = head->next; while (p) { fprintf(write, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n", p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver); p = p->next; } fclose(write); } //菜单项目 void menu() { printf("--------------学生成绩管理系统------------------\n"); printf("\t\t0.退出系统\n"); printf("\t\t1.录入信息\n"); printf("\t\t2.浏览信息\n"); printf("\t\t3.删除信息\n"); printf("\t\t4.修改信息\n"); printf("\t\t5.成绩排序\n"); printf("------------------------------------------------\n"); } struct Node* studentList = CreateList(); //按键交互 void keydown() { int userkey = 0; printf("请输入指令的相应序号:\n"); scanf("%d", &userkey); struct student userData; switch (userkey) { case 0: printf("--------------【退出系统】---------------\n"); printf("正常退出\n"); system("pause"); exit(0); break; case 1: printf("--------------【录入信息】---------------\n"); printf("请输入以下学生信息:\n"); printf("学号\t姓名\t高数\t英语\t电路\tC语言\n"); scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program); userData.sum = userData.math + userData.eletric + userData.c_program + userData.english; userData.aver = (userData.sum) / 4; insertNode(studentList, userData); break; case 2: printf("--------------【浏览信息】---------------\n"); printList(studentList); break; case 3: printf("--------------【删除信息】---------------\n"); printf("请输入需要删除的学生学号:\n"); scanf("%s", userData.ID); deleteNode(studentList, userData.ID); break; case 4: printf("--------------【修改信息】---------------\n"); printf("请输入需要修改的学生学号:\n"); scanf("%s", userData.ID); deleteNode(studentList, userData.ID); printf("请重新输入以下学生信息:\n"); printf("学号\t姓名\t高数\t英语\t电路\tC语言\n"); scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program); userData.sum = userData.math + userData.eletric + userData.c_program + userData.english; userData.aver = (userData.sum) / 4; insertNode(studentList, userData); printf("修改成功!\n"); break; case 5: printf("--------------【成绩排序】---------------\n"); sort(studentList); printList(studentList); break; default:printf("输入错误,请重新输入\n"); break; } } int main() { readInfo(studentList, "studentInfo.txt"); while (1) { menu(); keydown(); writeInfo(studentList, "studentInfo.txt"); system("pause"); system("cls"); } system("pause"); return 0; } ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242676_963443.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242700_492778.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242713_264771.png) ![图片说明](https://img-ask.csdn.net/upload/202001/06/1578242722_393073.png)
SQL server 将游标查询结果显示在一个表中,现在是每一条显示一个表头
SQL server 将游标查询结果显示在一个表中,现在是每一条显示一个表头,语句该如何修改呢? ![图片说明](https://img-ask.csdn.net/upload/201912/19/1576686056_303771.png) declare @addr varchar(128) declare myCursor CURSOR FOR select distinct cCardCode from dbo.ZLKCardFlow open myCursor fetch next from myCursor into @addr while(@@fetch_status=0) begin select distinct c.cCardCode,c.cName, c.cstatus, a0 as '充值金额',b1 as '消费金额',(a.a0-b.b1) as '余额' from (select SUM(nMoney) a0 from dbo.ZLKCardFlow where cCardCode=@addr and cOPType='充值')a, (select SUM(nMoney) b1 from dbo.ZLKCardFlow where cCardCode=@addr and cOPType='消费')b, (select top 1 * from dbo.ZLKCardFlow where cCardCode=@addr order by cstatus desc )c fetch next from myCursor into @addr end CLOSE myCursor DEALLOCATE myCursor
|undefined reference to `init_student_info_list'| 怎么解决?
大一c语言作业出现bug,求解决 ```main #include "student.h" #include <stdlib.h> #include <stdio.h> void menu(); //学生信息链表 student_info* student_list; //用户可以选择1-7可以分别进行学生信息的查看、添加、删除,修改,计算平均成绩,保存,退出系统操作。 int main() { int choice; int num; printf("**************************\n"); printf("欢迎使用学生信息管理系统\n"); printf("**************************\n"); printf("-----------------------------\n"); init_student_info_list(); if(read_file()) printf("从文件中读取学生信息成功.\n"); else printf("从文字中读取学生信息失败.\n"); printf("-----------------------------\n"); menu(); while(1) { printf("请选择操作: "); scanf("%d",&choice); switch(choice) { case 1: if(student_list_empty()) printf("学生信息表为空,请先添加学生信息.\n"); else display_student_info(); break; case 2: if(add_student_info()) printf("添加学生信息成功.\n"); else printf("添加学生信息失败.\n"); break; case 3: if(student_list_empty()) printf("学生信息表为空,请先添加学生信息.\n"); else { printf("请输入要删除学生信息的学号: "); scanf("%d",&num); if(delete_student_info(num)) printf("成功删除该学号对应的学生信息.\n"); else printf("删除失败.\n"); } break; case 4: if(student_list_empty()) printf("学生信息表为空,请先添加学生信息.\n"); else { printf("请输入要修改学生信息的学号: "); scanf("%d",&num); if(modify_student_info(num)) printf("成功修改该学号对应的学生信息.\n"); else printf("修改失败.\n"); } break; case 5: if(student_list_empty()) printf("学生信息表为空,请先添加学生信息.\n"); else display_average(); break; case 6: if(student_list_empty()) printf("学生信息表为空,请先添加学生信息.\n"); else if(save_file()) printf("保存学生信息成功.\n"); else printf("保存学生信息失败.\n"); break; case 0: printf("欢迎下次使用,再见.\n"); system("pause"); exit(0); break; default: printf("输入错误,请重新选择操作.\n"); } } system("pause"); return 0; } void menu() { printf("1.查看学生信息.\n"); printf("2.添加学生信息.\n"); printf("3.删除学生信息.\n"); printf("4.修改学生信息.\n"); printf("5.输出平均成绩.\n"); printf("6.保存学生信息.\n"); printf("0.退出系统操作.\n"); } ``` student。h #ifndef STUDENT_HEAD #define STUDENT_HEAD typedef struct node /*定义结构体*/ { int num; //学号 char name[15];//姓名 char sex[9]; //性别 int age; //年龄 int english; //英语成绩 int math; //数学成绩 int computer;//计算机成绩 int average; //平均成绩 struct node *next; //链表指针域 }student_info; //学生信息链表 extern student_info* student_list; //全局变量声明 //初始化函数声明 //初始化学生信息链表 void init_student_info_list(); //判断学生信息链表是否为空 int student_list_empty(); //操作函数声明 //向学校信息表中添加学生信息记录 int add_student_info(); //根据学号删除学生信息 int delete_student_info(int num); //根据学号修改学生信息 int modify_student_info(int num); //根据学号查找学生信息 student_info* search_student_info(int num); //输出每个学生的平均成绩 void display_average(); //显示所有学生信息 void display_student_info(); //将学生信息保存到文件 int save_file(); //从文件中读取学生信息 int read_file(); #endif ``` student。cpp #include "student.h" #include <stdio.h> #include <string.h> #include <malloc.h> //初始化学生信息链表 void init_student_info_list() { //学生信息链表头结点 student_list = (student_info*)malloc(sizeof(student_info)); student_list->next = NULL; } //判断学生信息链表是否为空 int student_list_empty() { return student_list->next == NULL; } //操作函数实现 //向学校信息表中添加学生信息记录 int add_student_info() { student_info *pstu = (student_info*)malloc(sizeof(student_info)); if(pstu == NULL) { printf("内存分配失败.\n"); return 0; } printf("请按要求一次输入学生的信息.\n"); printf("请输入学号: "); scanf("%d",&pstu->num); //判断该学号是否已经存在 if(search_student_info(pstu->num) != NULL) { printf("该学号已经存在学生信息表中.\n"); return 0; } printf("请输入姓名: "); getchar(); gets(pstu->name); printf("请输入性别: "); scanf("%s",pstu->sex); printf("请输入年龄: "); scanf("%d",&pstu->age); printf("请输入英语成绩: "); scanf("%d",&pstu->english); printf("请输入数学成绩: "); scanf("%d",&pstu->math); printf("请输入计算机成绩: "); scanf("%d",&pstu->computer); pstu->average = (pstu->english + pstu->math + pstu->computer)/3; //每次从学生信息链表的头部插入; pstu->next = student_list->next; student_list->next = pstu; return 1; } //根据学号删除学生信息 int delete_student_info(int num) { student_info *pstu; student_info *qstu; if(search_student_info(num) == NULL) { printf("不存在该学好为%d的学生信息.\n",num); return 0; } pstu = student_list->next; qstu = student_list; while(pstu->num != num) { qstu = pstu; pstu = pstu->next; } qstu->next = pstu->next; free(pstu); return 1; } //根据学号修改学生信息 int modify_student_info(int num) { int choice; student_info *pstu = search_student_info(num); if(pstu == NULL) { printf("不存在该学好为%d的学生信息.\n",num); return 0; } printf("1.姓名 2.性别 3.年龄 4.英语成绩 5.数学成绩 6.计算机成绩.\n"); printf("请选择修改的信息: "); scanf("%d",&choice); switch(choice) { case 1: printf("请输入新的姓名: "); getchar(); gets(pstu->name); break; case 2: printf("请输入新的性别: "); scanf("%s",pstu->sex); break; case 3: printf("请输入新的年龄: "); scanf("%d",&pstu->age); break; case 4: printf("请输入新的英语成绩: "); scanf("%d",&pstu->english); break; case 5: printf("请输入新的数学成绩: "); scanf("%d",&pstu->math); break; case 6: printf("请输入新的计算机成绩: "); scanf("%d",&pstu->computer); break; default: printf("请按提示要求操作.\n"); } return 1; } //根据学号查找学生信息 student_info* search_student_info(int num) { student_info *pstu; pstu = student_list->next; while(pstu && pstu->num != num) { pstu = pstu->next; } return pstu; } //输出每个学生的平均成绩 void display_average() { student_info *pstu; pstu = student_list->next; while(pstu) { printf("学号为%d,姓名为%s的学生平均成绩为: %d\n",pstu->num,pstu->name,pstu->average); pstu = pstu->next; } } //显示所有学生信息 void display_student_info() { student_info *pstu; pstu = student_list->next; printf("所有学生信息如下所示.\n"); printf("学号\t姓名\t性别\t年龄\t英语\t数学\t计算机\t平均成绩.\n"); while(pstu) { printf("%d\t",pstu->num); printf("%s\t",pstu->name); printf("%s\t",pstu->sex); printf("%d \t",pstu->age); printf("%d \t",pstu->english); printf("%d \t",pstu->math); printf("%d \t",pstu->computer); printf("%d\n",pstu->average); pstu = pstu->next; } } //将学生信息保存到文件 int save_file() { FILE *pfile; student_info *pstu; pfile = fopen("student.txt","w"); if(pfile == NULL) { printf("打开文件失败.\n"); return 0; } pstu = student_list->next; while(pstu) { fprintf(pfile,"%5d%15s%9s%3d%4d%4d%4d%4d",pstu->num,pstu->name,pstu->sex,pstu->age, pstu->english,pstu->math,pstu->computer,pstu->average); pstu = pstu->next; } fclose(pfile); return 1; } //从文件中读取学生信息 int read_file() { FILE *pfile; student_info *pstu; pfile = fopen("student.txt","r"); if(pfile == NULL) { printf("打开文件失败.\n"); return 0; } while(!feof(pfile)) { pstu = (student_info*)malloc(sizeof(student_info)); fscanf(pfile,"%5d%15s%9s%4d%4d%4d%4d%4d",&pstu->num,pstu->name,pstu->sex,&pstu->age, &pstu->english,&pstu->math,&pstu->computer,&pstu->average); pstu->average = (pstu->english + pstu->math + pstu->computer)/3; //每次从学生信息链表的头部插入; pstu->next = student_list->next; student_list->next = pstu; } fclose(pfile); return 1; } ``` 用code blokes运行 出现 D:\Projects\C\3\main.c|19|undefined reference to `init_student_info_list'| D:\Projects\C\3\main.c|20|undefined reference to `read_file'| D:\Projects\C\3\main.c|33|undefined reference to `student_list_empty'| 怎么解决啊?
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方
致 Python 初学者
文章目录1. 前言2. 明确学习目标,不急于求成,不好高骛远3. 在开始学习 Python 之前,你需要做一些准备2.1 Python 的各种发行版2.2 安装 Python2.3 选择一款趁手的开发工具3. 习惯使用IDLE,这是学习python最好的方式4. 严格遵从编码规范5. 代码的运行、调试5. 模块管理5.1 同时安装了py2/py35.2 使用Anaconda,或者通过IDE来安装模
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
相关热词 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片 c# 图片颜色调整 最快 c#多张图片上传 c#密封类与密封方法
立即提问