C++ 用于实现链表的类模板、继承、类模板声明问题

应该是语法问题,因为如果不选择使用继承的话编译就完全没问题。对于如何声明继承的类模板,定义继承的类模板以及在主类中声明继承类模板感觉好模糊。
后面一大串功能的实现应该和错误没有关系,可以选择忽略,主要是在前三个类。报错的点有问题。
我使用的是VS 2017。
真的查遍了百度翻遍了书实在是求助无门,谢谢好心人能为我指出问题所在。
谢谢!
#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
/*代码在继承模板类、类声明语法、类定义语法、List中的嵌套类声明语法中有错。
下面的调试会报错。但如果取消使用继承,程序能够正常编译通过。
*此程序用于实现List,算法与数据结构C++书中的例子。
*List类中的成员函数定义未全部完成,止于此。
/

template class List;
template class Node;
template class const_iterator;
template class iterator : public const_iterator;

template
class List
{
private:
Node *head, *tail;
class const_iterator;
class iterator : public const_iterator;
int theSize;
void init();
public:
List() { init(); }
List(const List &rhs);
~List();
int size() const { return theSize; }
bool empty() const { return size() == 0; }
void clear()
{
while (!empty())
pop_front();
}
void erase(iterator iter);

iterator begin() { return iterator(head->next;) }
iterator end() { return iterator(tail->prev); }
const_iterator begin() const { return const_iterator(head->next); }
const_iterator end() const { return const_iterator(tail->prev); }

void pop_front();
void pop_back();
void push_front(const Object &x);
void push_back(const Object &x);
Object &front();
const Object &front() const;
Object &back();
const Object &back() const;

};

template
class List::const_iterator
{
public:
const_iterator() : current(NULL) { }
const Object &operator* () { return retrieve(); }
const_iterator &operator++()
{
current = current->next;
return *this;
}
const_iterator operator++(int)
{
const_iterator old = *this;
++(*this);
return old;
}

bool operator==(const Object &rhs) const { return current = rhs.current; }
bool operator!=(const Object &rhs) const { return !(current = rhs.current); }

protected:
Node *current;

Object &retrieve() { return current->data; }
const_iterator(Node<Object> *n) : current(n) {  }

friend class List<Object>;

};

template
class List::iterator : public const_iterator
{
public:
iterator() { }

Object &operator*() { return retrieve(); }
iterator operator++()
{
    current = current->next;
    return *this;
}
iterator operator++(int)
{
    iterator old = *this;
    ++(*this);
    return old;
}

bool operator==(const Object rhs) { return current == rhs.current; }
bool operator!=(const Object rhs) { return !(current == rhs.current) }

protected:
iterator(Node *n) : current(n) { }
friend class List;
};

template
class Node
{
public:
Node *prev, *next;
Object data;
Node(const Object &d = Object(), Object *p = NULL, Object *n = NULL) : data(d), prev(p), next(x)
{ }
};

template
void List::push_front(const Object &x)
{
Node *n = new Node;
n->data = x;
head->next->prev = n;
n->next = head->next;
n->prev = head;
head->next = n;
theSize++;
}

template
void List::push_back(const Object &x)
{
Node *n = new Node;
n->data = x;
tail->prev->next = n;
n->prev = tail->prev;
n->next = tail;
tail->prev = n;
theSize++;
}

template
void List::erase(iterator iter)
{
Node *p = iter.current;
p->next->prev = p->prev;
p->prev->next = p->next;
theSize--;
delete p;
}

template
void List::pop_front()
{
if (head->next == tail)
cout << "List is empty" << endl;
else
erase(begin());
}

template
void List::pop_back()
{
if (head->next == tail)
cout << "List is empty" << endl;
else
erase(end());
}

template
void List::init()
{
theSize = 0;
head = new Node;
tail = new Node;
tail->prev = head;
head->next = tail;
}

template
List::~List()
{
clear();
delete head;
delete tail;
}

int main( )
{

system("pause");
return 0;

}

1个回答

链表呀!思考一下*+*

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++ 用于实现链表的类模板、继承、类模板声明问题

应该是语法问题,因为如果不选择使用继承的话编译就完全没问题。对于如何声明继承的类模板,定义继承的类模板以及在主类中声明继承类模板感觉好模糊。 后面一大串功能的实现应该和错误没有关系,可以选择忽略,主要是在前三个类。报错的点有问题。 我使用的是VS 2017。 真的查遍了百度翻遍了书实在是求助无门,谢谢好心人能为我指出问题所在。 谢谢! #include "stdafx.h" #include <iostream> #include <time.h> #include <vector> #include <string> using namespace std; /*代码在继承模板类、类声明语法、类定义语法、List中的嵌套类声明语法中有错。 *下面的调试会报错。但如果取消使用继承,程序能够正常编译通过。 *此程序用于实现List,算法与数据结构C++书中的例子。 *List类中的成员函数定义未全部完成,止于此。*/ template<typename Object> class List; template<typename Object> class Node; template<typename Object> class const_iterator; template<typename Object> class iterator : public const_iterator<Object>; template<typename Object> class List { private: Node<Object> *head, *tail; class const_iterator; class iterator : public const_iterator<Object>; int theSize; void init(); public: List() { init(); } List(const List &rhs); ~List(); int size() const { return theSize; } bool empty() const { return size() == 0; } void clear() { while (!empty()) pop_front(); } void erase(iterator iter); iterator begin() { return iterator(head->next;) } iterator end() { return iterator(tail->prev); } const_iterator begin() const { return const_iterator(head->next); } const_iterator end() const { return const_iterator(tail->prev); } void pop_front(); void pop_back(); void push_front(const Object &x); void push_back(const Object &x); Object &front(); const Object &front() const; Object &back(); const Object &back() const; }; template<class Object> class List<Object>::const_iterator { public: const_iterator() : current(NULL) { } const Object &operator* () { return retrieve(); } const_iterator &operator++() { current = current->next; return *this; } const_iterator operator++(int) { const_iterator old = *this; ++(*this); return old; } bool operator==(const Object &rhs) const { return current = rhs.current; } bool operator!=(const Object &rhs) const { return !(current = rhs.current); } protected: Node<Object> *current; Object &retrieve() { return current->data; } const_iterator(Node<Object> *n) : current(n) { } friend class List<Object>; }; template<class Object> class List<Object>::iterator : public const_iterator<Object> { public: iterator() { } Object &operator*() { return retrieve(); } iterator operator++() { current = current->next; return *this; } iterator operator++(int) { iterator old = *this; ++(*this); return old; } bool operator==(const Object rhs) { return current == rhs.current; } bool operator!=(const Object rhs) { return !(current == rhs.current) } protected: iterator(Node<Object> *n) : current(n) { } friend class List<Object>; }; template<class Object> class Node { public: Node *prev, *next; Object data; Node(const Object &d = Object(), Object *p = NULL, Object *n = NULL) : data(d), prev(p), next(x) { } }; template<typename Object> void List<Object>::push_front(const Object &x) { Node<Object> *n = new Node<Object>; n->data = x; head->next->prev = n; n->next = head->next; n->prev = head; head->next = n; theSize++; } template<typename Object> void List<Object>::push_back(const Object &x) { Node<Object> *n = new Node<Object>; n->data = x; tail->prev->next = n; n->prev = tail->prev; n->next = tail; tail->prev = n; theSize++; } template<typename Object> void List<Object>::erase(iterator iter) { Node *p = iter.current; p->next->prev = p->prev; p->prev->next = p->next; theSize--; delete p; } template<typename Object> void List<Object>::pop_front() { if (head->next == tail) cout << "List is empty" << endl; else erase(begin()); } template<typename Object> void List<Object>::pop_back() { if (head->next == tail) cout << "List is empty" << endl; else erase(end()); } template<typename Object> void List<Object>::init() { theSize = 0; head = new Node<Object>; tail = new Node<Object>; tail->prev = head; head->next = tail; } template<typename Object> List<Object>::~List() { clear(); delete head; delete tail; } int main( ) { system("pause"); return 0; }

C++ 在类里面实现链表的合并

我创建了一个类,里面包含链表的输入、输出、排序、打印、合并等等功能。然后我用类定义了两个变量,但是实现他们合并的时候懵了,这个函数应该要获取两个链表的头结点,我就不知道该怎么获取了,因为头结点是私有在类中的,求帮助!!! ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492359556_374242.png) ![图片说明](https://img-ask.csdn.net/upload/201704/17/1492359570_898892.png) 主函数里面只输入了链表的长度,第二张图是结构体跟类的构造函数那部分

ARM开发中,用C语言 实现双向链表

各位前辈 你们好! 如题,我在ARM开发中,需要用到双向链表来管理接受到的数据。 我对双向链表不是很理解,在实际编程的时候遇到一些问题。 希望得到各位的帮助。 我本来打算用数组来做的。但是发现添加数据和删除数据都比较麻烦。 最后决定用双向链表来完成。 使用双向链表的目的 1,链表可以接受不超过64个的数据(结构体) 2,在链表中查询数据ID,可以进行添加和删除还有覆盖相同ID的数据 3,遍历链表中的数据ID,调用数据信息。 项目管理是一个外国人,我看他用链表不用malloc和free,我也想按照他的写法去找列子, 但是国内的列子都是有带malloc和free的。 因为时限快到了,我又学艺不精,所以向各位求教相应的信息或者实现的代码。 谢谢!

C语言中的链表赋值问题

我写了一个存储电影名字以及评级的链表,不理解其中以下三点 1.prev->next=current, 2.prev=current, 3.current=current->next 我目前的理解是:1.把current这个结构体指针变量的地址赋值给prev中的结构体指针变量next;2.把current这个结构体指针变量的地址赋值给结构体指针变量prev;3.令结构体指针变量current的值等于结构体指针变量next的值 不知道对吗? 以下是我的源代码: #include<stdio.h> #include<stdlib.h> //malloc();原型 #include<string.h> //strcpy();原型 #define SIZE 20 //最大字数 typedef struct film { char title[SIZE]; int rating; struct film * next; }Film; int main() { Film *head=NULL; Film *prev,*current; char title2[SIZE]; //写入 puts("Scan first title(0-20 charecter)"); while(gets(title2)!=EOF&&title2[0]!='\0') { current = (Film *)malloc(sizeof(Film)); //存第一个指针head if(head==NULL) { head=current; } //current's address 赋给next else prev->next=current; strcpy(current->title,title2); puts("Rating is...(0-10)"); scanf("%d",&current->rating); getchar(); //节点更换 puts("Enter next movie title"); prev=current; } //显示 if(head) { current=head; while(current!=NULL) { printf("the title is %s,the rating is %d\n",current->title,current->rating); current=current->next; //把下一个结构体指针的地址给current } } else puts("Not find any dota..."); //清内存 current=head; while(current) { free(current); current=current->next; } puts("OK!"); return 0; } 十分感谢

【求指点】C++ 模板类设计的 双向链表 太多了 求大神指点还有改进的吗

#ifndef _NODE_ #define _NODE_ #include"base.h" //模板类,链表-- template<class T> class Node { public: T value; Node<T>* prev;//前驱 Node<T>* next;//后继 Node() { prev=NULL; next=NULL; } ~Node(){} }; template<class T> class LinkList { private: Node<T>* link; Node<T>* real; int len; public: LinkList() { len=0; real=link=new Node<T>; link->next=NULL; link->prev=link; } ~LinkList() { Node<T>* pnode,*temp; pnode = link->next; while(pnode) { temp=pnode->next; delete pnode; pnode=temp; } delete link; link=NULL; len =0; } int InitLink(); // 头 尾 随机 插 改 删 等 int PushInfoFrount(T t); T PopInfoFrount(); int PushInfoReal(T t); T PopInfoReal(); int InsertInfo(const int count,T t); T DeleteInfo(const int count); int SetInfo(const int count,T t);//修改 T GetInfo(const int count); //返回指定位置对象 int isEmpty(); //获得前驱 后继 Node<T>* Next(const int count); Node<T>* Prev(const int count); int GetLen(); }; template<class T> int LinkList<T>::GetLen() { if(!isEmpty()) return -1; return len; } template<class T> int LinkList<T>::isEmpty() { if(link == NULL) return false; return true; } template<class T> int LinkList<T>::InitLink() { Node<T>* pnode,*temp; pnode = link->next; if(!isEmpty()) return false; while(pnode!=link || pnode!=NULL) { temp=pnode->next; delete pnode; pnode=temp; } //第二种:可以使用 PopInfoFrount(); link->prev=link; link->next=NULL; len =0; } //---------------------------- //头 插 头删 template<class T> int LinkList<T>::PushInfoFrount(T t) { if(!isEmpty())return 0; Node<T>* newNode=new Node<T>; newNode->value =t; newNode->next=link->next; newNode->prev=link; //如果是第一次插入 if(len == 0) { link->next=newNode; //调整尾指针 因为如果一直头插入 real永远是最后一个,如果不调整,那他永远指向Link. real=newNode; len++; return true; } //否则... link->next->prev=newNode; link->next=newNode; len ++; return true; } template<class T> T LinkList<T>::PopInfoFrount() { if( !isEmpty() || GetLen()<=0 )exit(-1); Node<T>* pnode=link->next; T t=pnode->value; if(pnode->next!=NULL || pnode!=link) pnode->next->prev=pnode->prev; pnode->prev->next=pnode->next;//link->next = pnode->next; delete pnode; pnode =NULL; len --; //如果链表没有对象 设置尾指针 if(len == 0) { real=link; } return t;//返回对象 } //尾插 尾删 template<class T> int LinkList<T>::PushInfoReal(T t) { if(!isEmpty())return -1; Node<T>* newNode=new Node<T>; newNode->value=t; newNode->next=real->next; newNode->prev=real; real->next=newNode; real=newNode; len++; return true; } template<class T> T LinkList<T>::PopInfoReal() { if(!isEmpty()|| GetLen()==0 ) exit(-1); T t=real->value; real->prev->next=real->next; Node<T>* pnode=real; real=real->prev;//指向前驱 delete pnode; pnode =NULL; len--; return t; } template<class T> int LinkList<T>::InsertInfo(const int count,T t) { if(!isEmpty()|| count<=0 || count > GetLen() ) return -1; int i=1; Node<T>* pnode=link->next; Node<T>* newNode=new Node<T>; newNode->value = t; while(pnode!=NULL) { if(i==count)break; pnode=pnode->next; i++; } if(pnode==NULL || i>count)return -1; //如果是最后一个位置 if(pnode->next==NULL) { newNode->next=pnode->next; newNode->prev=pnode; pnode->next=newNode; len++; real=newNode;//设置尾指针 return true; } newNode->next=pnode->next; newNode->prev=pnode; pnode->next->prev=newNode; pnode->next=newNode; len++; return true; } template<class T> T LinkList<T>::DeleteInfo(const int count) { if(!isEmpty()|| GetLen()<=0 || count > GetLen()) exit(-1); //如果是最后一个 直接PopInfoReal if(count == GetLen()) { return PopInfoReal(); } //如果是头 直接PopInfoFrount; if(count == 1) { return PopInfoFrount(); } //否则执行其他位置的删除 int i=1; T t; Node<T>* pnode; pnode=link->next; while(pnode!=NULL) { if(i == count) break; ++i; pnode=pnode->next; } if(pnode==NULL || i>count)exit(-1); t=pnode->value; pnode->next->prev=pnode->prev; pnode->prev->next=pnode->next; delete pnode; pnode=NULL; len--; return t; } // 修改 set template<class T> int LinkList<T>::SetInfo(const int count,T t) { if(!isEmpty()|| GetLen==0 || count> GetLen())return -1; if(count == 1) { link->next->value=t;return true; } if(count == GetLen()) { real->value=t;return true; } Node<T>* pnode=link->next; int i=1; while(pnode) { if(i == count)break; i++; pnode=pnode->next; } if(pnode==NULL || i>count)return -1; pnode->value=t; return true; } template<class T> T LinkList<T>::GetInfo(const int count) { if(!isEmpty()|| GetLen()==0 || count > GetLen()) exit(-1); if(count ==1) return link->next->value; if(count==GetLen()) return real->value; int i=1; Node<T>* pnode=link->next; while(pnode) { if(i == count)break; i++; pnode=pnode->next; } if(pnode == NULL || i>count)exit(-1); return pnode->value; } //获取 前驱后继 返回节点指针 template<class T> Node<T>* LinkList<T>::Next(const int count) { if(!isEmpty() || count <=0 || count>GetLen())exit(-1); int i=1; Node<T>* pnode=link; while(pnode) { if(i == count)break; i++; pnode =pnode->next; } if(pnode==NULL || i>count)exit(-1); return pnode->next; } template<class T> Node<T>* LinkList<T>::Prev(const int count) { if(!isEmpty() || count <=0 || count>GetLen())exit(-1); int i=1; Node<T>* pnode=link->next; while(pnode) { if(i == count)break; i++; pnode =pnode->next; } if(pnode==NULL || i>count)exit(-1); return pnode->prev; } #endif

C语言中单向的链表反转

node* reverse1(node * head) { node*p,*q,*r; p = head; q = head->next; head->next = NULL; while(q){ r = q->next; q->next = p; p = q; q = r; } head=p; /* while(p) { printf("%d ",p->num); p=p->next; }*/ printf("\n"); return head; }

c语言如何把链表数据写入文件?

在写一个通讯录管理系统,然后要把联系人的信息结构体放到链表中,然后将链表里的信息写入文件中,下次打开时还能从该文件读出数据。 链表头指针TEL,结构体中有name,tel,style,mail 四项,存入“telephone.txt"中。 我是这样写的 /*退出程序时将数据写回telephone.txt进行更新*/ void ReadBack() { FILE *TEL = fopen("telephone.txt","wt+"); ID *te = id->next; while (te != NULL) { fwrite(id,sizeof(ID),1,TEL); te = te->next; } fclose(TEL); } 结果文件中是一串乱字 是 屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯?f 请给出代码,本人初学,多谢!

C++ 链表类 基本操作

用C++构建链表类,并实现基本操作:删除,创建,显示全部,插入。。。

python实现链表重新排序问题

已经实现链表的数据结构和一些基本功能如求长度、插入新的数值等,现要对一个链表中的数字进行 排序,如(1,2,3,4,5)排序后成为(3,2,4,1,5),即以原来链表中第(length/2)个节点作为head,往后依次是原节点左1、右1、左2、右2...类推,求解如何不改变各个节点的地址实现排序。

C语言链表数据输入问题

有链表指针p1,想向结构体中的结构体时间中的变量日输入数值,如何写代码?

C++,类模板作为基类派生及指针的问题。

**C++,类模板作为基类派生某几个类,可不可以定义指向基类的指针,然后通过这个指针来指向各个派生类?大家帮忙解答一下。我是初学者,勿喷啊!** 以下面例子为例。C++的。 #include<iostream> using namespace std; template<class T1> class A { protected: T1 a; public: virtual void output1(); virtual void input(); virtual void output2(); }; template<class T1> void A<T1>::output1() { cout<<"输入a:"<<endl; } template<class T1> void A<T1>::input() { cin>>a; } template<class T1> void A<T1>::output2() { cout<<a<<endl; } template<class T2> class B:virtual public A<T2> { }; template<class T3> class C:virtual public A<T3> { }; int main() { A<int> *pt; B<int> B1; C<double> C1; int choice; cout<<"chioce 1 or 2?"<<endl; cin>>choice; if(choice==1) pt=&B1; else pt=&C1; pt->output1(); pt->input(); pt->output2(); return 0; } --------------------Configuration: 38 - Win32 Debug-------------------- Compiling... 38.cpp E:\SoftDocument\C++\38\38.cpp(58) : error C2440: '=' : cannot convert from 'class C<double> *' to 'class A<int> *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 执行 cl.exe 时出错. 38.exe - 1 error(s), 0 warning(s)

Java写的一个双向链表模板,出了点问题,应用不了自己写的内部类,却能应用String类

[code="java"]package com.read.List; public class DbLinkedList<T> { //定义内部类,用作链表的节点 private class Node<T> { Node<T> pre; //指向前一个节点 Node<T> next; //指向后一个节点 T value; //当前节点的值 public Node(T value, Node<T> next, Node<T> pre) { this.value = value; this.next = next; this.pre = pre; } public String toString() { return this.value + ""; } } public Node<T> header; //定义头节点 public int size; //定义链表的长度 public int flag; //指针所在位置 public DbLinkedList() { this.header = new Node<T>(null, null, null);//空的头节点,用来区分双向循环链表的首尾 this.flag = 0; this.size = 0; } public void add(T value)//在链表的尾巴上面加一个节点 { Node<T> temp=entry(size); temp.value=value; Node<T> next=new Node<T>(null, null, null); next.pre=temp; temp.next=next; this.flag++; this.size=this.flag; } public T get(int index) { return entry(index-1).value; } private Node<T> entry(int index) //迭代至index处的节点 { Node<T> node = this.header; for(int i=1; i<=index; i++) { node = node.next; } return node; } public void clear() { this.header = new Node<T>(null, null, null); this.size = 0; this.flag = 0; } //标志从当前位置前移一位,表示此时后进了一步 public boolean flagpre() { if(flag==0) //标志在第一步,不能再后退了 { return false; } flag--; return true; } //标志从当前位置前后一位,表示此时前进了一步 public boolean flagnext() { if(flag==size) //标志在最后一步,不能再后退了 { return false; } flag++; return true; } //在第一步时返回true public boolean firststep() { if(flag==0) { return true; } return false; } //在最后一步时返回true public boolean endstep() { if(flag==size) { return true; } return false; } public boolean isEmpty() { return this.size == 0; } public int size() { return this.size; } } package com.read.List; public class god { public static class select{ String name; String x; String y; select(){ } public void clear(){ name=null; x=null; y=null; } } public static void main(String[] args){ DbLinkedList<select> List=new DbLinkedList<select>(); select temp=new select(); for(int i=0;i<5;i++) { temp.clear(); temp.name="No."+i; temp.x="x="+i; temp.y="y="+i; List.add(temp); } temp=List.get(List.flag); System.out.println(temp.name); System.out.println(temp.x); System.out.println(temp.y); temp.clear(); System.out.println(List.flag); List.flagpre(); System.out.println(List.flag); temp=List.get(List.flag); System.out.println(temp.name); System.out.println(temp.x); System.out.println(temp.y); DbLinkedList<String> it=new DbLinkedList<String>(); it.add("0"); it.add("1"); it.add("2"); it.add("3"); it.add("4"); System.out.println(it.get(it.flag)); it.flagpre(); System.out.println(it.get(it.flag)); } }[/code] 控制台结果: No.4 x=4 y=4 5 4 null null null 4 3 其中,temp第二次赋值失败了(3个null),it成功了(3) ps:本人是新来的,积分少,见谅!

C语言链表实现学生信息统计(只写了三个功能 输入 删除 输出)

第一个问题 输出的第一组数据的第一个学期不输出 ```#include<stdio.h> //#include #include<string.h> #include<stdlib.h> //#include using namespace std; #define MAX 200 //宏定义,修改数值可以改变程序所包含的最大文件个数 #define LEN sizeof(struct student) int n; int count=0; struct student { char xueqi[20]; //学期 int no; //学号 int clas; //班级 char name[50]; //姓名 int chi; //语文成绩 int math; //数学成绩 int eng; //英语成绩 int com; //计算机成绩 int PE; //体育成绩 int sum; int aver; struct student *next; }; struct student *head=NULL; void menu(); void menu2(); struct student * Insert (struct student *st); void add(); void to_menu(); void to_menu2(); struct student * Delete(int no); //void save_data(); //void read_data(); void view_data(); void delete_data(); //void edit_data(); //void query_data_no(); //void tongji1(); //void tongji2(); //void tongji3(); //void tongji4(); //void query_data_tongji(); int main() //主函数 { int fun; // read_data(); menu(); while(1) { system("color fc"); //编辑菜单及字体颜色 printf("请输入功能号[0-6]:",&fun); scanf("%d",&fun); switch(fun) { case 0: // 退 出 break; case 1: //按班级输出学生成绩 view_data(); break; case 2: //输入学生记录 add(); break; case 3: //删除学生记录 delete_data(); // break; // case 4: //编辑学生记录 // edit_data(); // break; // case 5: //查询学生记录 // query_data_no(); // break; // case 6: //统计系统 // query_data_tongji(); // break; } if(fun==0) break; to_menu(); } } void add() //添加学生信息 { int b,k; while(1) { struct student *st; st= (struct student *)malloc(sizeof(struct student)); k=count; printf("\n请输入学生信息:"); printf("\n学期"); printf("\n-------------------------------------------------------------\n"); getchar(); gets(st->xueqi); printf("\n学号"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->no); printf("\n班级"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->clas); printf("\n姓名"); printf("\n-------------------------------------------------------------\n"); getchar(); gets(st->name); printf("\n语文"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->chi); printf("\n数学"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->math); printf("\n英语"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->eng); printf("\n计算机"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->com); printf("\n体育"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->PE); st->sum=st->chi+st->math+st->eng+st->com+st->PE; st->aver=st->sum/5; count++; head=Insert(st); free(st); printf("\n\n继续添加学生信息[1-yes 0-no]:"); scanf("%d",&b); if(b==0) break; } // save_data(); } struct student * Insert (struct student *stud) { //原链表按num从小到大排列,参数stud是要插入结点 struct student *p0; // 待插入结点 struct student *p1; // p0插入p1之前、p2之后 struct student *p2; p1 = head; p0 = stud; if ( head == NULL ){//第一种情况,链表为空 head = p0;//p0成为链表中第一结点 p0->next = NULL; }else { while ((p0->no > p1->no) && (p1->next != NULL)) {//查找待插入位置 p2 = p1; p1 = p1->next; } if(p0->no <= p1->no) {//表示是从(p0->num > p1->num) 条件跳出循环 if (p1 == head) { //如果p1是表头结点,向第一结点之前插入 head = p0; p0->next = p1; } else{//向p1之前、p2之后插入 p2->next = p0; p0->next = p1; } } else { //表示从 (p1->next != NULL)条件跳出循环,p0插入表尾结点之后 p1->next = p0; p0->next = NULL; } } return (head); } void menu() //输出主菜单函数 { system("cls"); //清空屏幕函数 printf("\n"); printf("\t\t\t*******************************\n"); printf("\t\t\t* \n"); printf("\t\t\t 学生成绩管理系统 \n"); printf("\t\t\t \n"); printf("\t\t\t [0] 退出 \n"); printf("\t\t\t [1] 按学号输出学生成绩 \n"); printf("\t\t\t [2] 输入学生记录 \n"); printf("\t\t\t [3] 删除学生记录 \n"); printf("\t\t\t [4] 编辑学生记录 \n"); printf("\t\t\t [5] 查询学生记录 \n"); printf("\t\t\t [6] 统计学生记录 \n"); printf("\t\t\t \n"); printf("\t\t\t*******************************\n"); } void menu2() //输出统计系统菜单 { system("cls"); //清空屏幕函数 printf("\n"); printf("\t\t\t********************************\n"); printf("\t\t\t* \n"); printf("\t\t\t 统计系统 \n"); printf("\t\t\t \n"); printf("\t\t\t [0] 退出 \n"); printf("\t\t\t [1] 输出班级学生成绩 \n"); printf("\t\t\t [2] 班级各科成绩平均数 \n"); printf("\t\t\t [3] 班级各科成绩总分 \n"); printf("\t\t\t [4] 不及格名单 \n"); printf("\t\t\t \n"); printf("\t\t\t*******************************\n"); } void to_menu() //to_menu函数 { char c1,c2; printf("\n\n\n按回车键返回主菜单..."); scanf("%c%c",&c1,&c2); menu(); //调用menu函数 } void to_menu2() //to_menu函数 { char c1,c2; printf("\n\n\n按回车键返回上一菜单..."); scanf("%c%c",&c1,&c2); menu2(); //调用menu函数 } void view_data() { if(head==NULL) return; struct student *p=head; printf("学期\t学号\t\t班级\t\t姓名\t\t语文\t数学\t英语\t计算机\t体育\t总分\t平均分"); printf("\n-----------------------------------------------------------------------------------------------------------------\n"); do{printf("%s\t\t%d\t%-15d%s\t\t%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",p->xueqi,p->no,p->clas,p->name,p->chi,p->math,p->eng,p->com,p->PE,p->sum,p->aver); p=p -> next; }while(p!=NULL); } struct student * Delete(int no) {//删除值为num的结点 int sb=0; struct student *p1; // 指向要删除的结点 struct student *p2; //指向p1的前一个结点 if (head == NULL) { //空表 return (head); } p1 = head; while(no!= p1->no && p1->next != NULL) { //查找要删除的结点 p2 = p1; p1 = p1->next; } if (no == p1->no) { printf("\n\n删除(学号-%d)成功!",no); sb=1;// 找到了 if (p1 == head) //要删除的是头结点 head = p1->next; else// 要删除的不是头结点 p2->next = p1->next; // free(p1); //释放被删除结点所占的内存空间 } if(sb==0) printf("\n\n删除(学号-%d)成功!",no); return (head); //返回新的表头 } void delete_data() //删除学生记录 { int j; int no; j=count; view_data(); printf("\n请输入要删除学生的学号:"); scanf("%d",&no); head=Delete(no); // save_data(); } ``` ![图片说明](https://img-ask.csdn.net/upload/201906/04/1559647034_557.png)

顺序链表的插入用C语言编程实现

题目是:向递增的顺序链表中插入一个数,将插入后的链表输出。下面是源程序,但只能输入,但一输出就崩溃是咋回事啊?哪位大神求解,,,感激不尽。。。 #include <stdio.h> #include <stdlib.h> typedef struct Lnode { int data; struct Lnode *next; }Lnode,*LinkList; LinkList CreateListR(LinkList L) { int n; LinkList p,s; p=L=(LinkList)malloc(sizeof(Lnode)); L->next=NULL; scanf("%d",&n); for(;n>0;n--) { s=(LinkList)malloc(sizeof(Lnode)); scanf("%d",&s->data); p->next=s; p=s; } p->next=NULL; return L; } LinkList ListInsert(LinkList L) { int m; LinkList s,p=L; scanf("%d",&m); while(p!=NULL) { if(p->data>m) { s=(LinkList)malloc(sizeof(Lnode)); s->data=m; s->next=L->next; L->next=s; break; } else if(p->next->data>m) { s=(LinkList)malloc(sizeof(Lnode)); s->data=m; s->next=p->next; p->next=s; break; } p=p->next; } return L; } int main() { LinkList q=NULL,L=NULL; L=CreateListR(L); q=ListInsert(L); q=q->next; while(q) { printf("%d ",q->data); q=q->next; } return 0; }

c语言链表节点删除问题求解

这是一个删除结点并输出的程序,总共有三个链表 错误为:当删除最后一个链表也就是3时程序发生错误,停止运行。 求大家帮忙解解决! ``` #include <stdio.h> #define NUll 0 #include <stdlib.h> struct stu { char name[6]; int xuehao; int grade; struct stu *next; }; typedef struct stu STU; main() { STU *p,*p_start,*p2,*p_print,*p_charu,*p_charu2; int i,xuehao; //输入 for (i=0;i<3;i++) { p=(STU *)malloc(sizeof(STU)); printf("请输入学生姓名:\n"); scanf("%s",&p->name); printf("请输入学生的学号:\n"); scanf("%d",&p->xuehao); printf("请输入学生的成绩:\n"); scanf("%d",&p->grade); if (i==0) p2=p_start=p; else { p2->next=p; p2=p; if (i==2) p->next=NULL; } } //链表的删除 p_charu=p_start; printf("请输入要删除的学号\n"); scanf("%d",&xuehao); while (1) { p_charu2=p_charu->next; if (p_charu->next->xuehao==xuehao) { p_charu->next=p_charu->next->next; free(p_charu2); break; } if (p_charu->xuehao==xuehao) { p_start=p_charu->next; free(p_charu); break; } p_charu=p->next; } } ```

关于C语言链表学习入门遇到瓶颈

怎样学习C语言中的链表,有没有什么好的文章博客,详细易懂,发一下链接,谢谢

C语言循环单链表解决约瑟夫问题

``` #include <stdio.h> #include <stdlib.h> typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*LinkList; void createlist(LinkList *head,int n) { int i; LinkList p,q; *head=(LinkList)malloc(sizeof(LNode)); (*head)->next=*head; p=(*head)->next; for(i=0;i<n;i++) { q=(LinkList)malloc(sizeof(LNode)); q->data=i+1; q->next=p; p->next=(*head); p=q;//这句代码用处是什么呢? printf("%d\n",q->data); } } void yuesefuList(LinkList head,int n,int m,int k) { int i,rec=0; LinkList p,q; p=head->next; if(m>n) { printf("error!"); } for(i=1;i<m;i++) { p=p->next; printf("%d\n",p->data); if(p->next==head->next) p=p->next; } //开始报数 while(rec!=n){ for(i=0;i<k;i++) { p=p->next; if(p->next==head->next) p=p->next; } printf("%d ",p->data); //delete q=p->next; p->next=q->next; free(p); rec++; p=q->next; } } int main() { LinkList head; int n,m,k; printf("please enter the number of person\n"); printf("n="); scanf("%d",&n); printf("please enter the location of beginning\n"); printf("m="); scanf("%d",&m); printf("please enter the number of gap\n"); printf("k="); scanf("%d",&k); createlist(&head,n); //inputlist(head,n); yuesefuList(head,n,m,k); return 0; } ``` 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 大概思路是建立一个循环链表,先遍历到开始位置,通过while循环找到下一个结点,输出结点的数据域 通过了编译,但是输出结果是乱七八糟的数字。。。 求大神教教小弟orz

将两个递增的双向链表合并问题

将两个排好序的双向链表合并成一个,不允许有重复数据,链表1为1 2 3 4 6 链表2为5 6 8 9 10,合并后为1 2 3 4 6 8 9 10缺少了5,麻烦各位看一下是为什么啊? ``` // shiyan.cpp : 定义控制台应用程序的入口点。 // /* C program to insetail nodes in doubly linked list such that list remains in ascending order on printing from left to right */ #include "stdafx.h" #include <iostream> using namespace std; #include<stdio.h> #include<stdlib.h> #include<fstream> // A linked list node struct Node { int data; struct Node *prior; struct Node *next; }; // Function to insetail new node void nodeInsetail(struct Node **head, struct Node **tail,int key) { struct Node *p = new Node; p->data = key; p->next = NULL; // If first node to be insetailed in doubly linked list if ((*head) == NULL) { (*head) = p; (*tail) = p; (*head)->prior = NULL; return; } // If node to be insetailed has value less than first node if ((p->data) < ((*head)->data)) { p->prior= NULL; (*head)->prior = p; p->next = (*head); (*head) = p; return; } // If node to be insetailed has value more than last node if ((p->data) > ((*tail)->data)) { p->prior = (*tail); (*tail)->next = p; (*tail) = p; return; } // Find the node before which we need to insert p. struct Node *temp = new Node; temp = (*head)->next; while ((temp->data) < (p->data)) temp = temp->next; // Insert new node before temp (temp->prior)->next = p; p->prior= temp->prior; temp->prior = p; p->next = temp; } // Function to print nodes in from left to right void printList(struct Node *temp) { while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } } // Driver program to test above functions struct Node *head1=NULL; struct Node *tail1=NULL; struct Node *head2=NULL; struct Node *tail2=NULL; int _tmain(int argc, _TCHAR* argv[]) { int num[10]; int datalen=0; ifstream file("linklist.txt"); while( ! file.eof() ) file>>num[datalen++]; file.close(); for(int i=0;i<5;i++) { nodeInsetail(&head1, &tail1,num[i]); } printf("Doubly linked list1 is:"); printList(head1); printf("\n"); for(int j=5;j<10;j++) { nodeInsetail(&head2, &tail2,num[j]); } printf("Doubly linked list2 is:"); printList(head2); printf("\n"); Node *phead =head1;//最终返回的头数据节点 Node *p=head1->next;//p循环的是链表1 Node *q=head2;//q循环的是链表2 if(p->data > q->data) { phead = head2; p = head2->next; q = head1; } Node* s=phead;//记录新链表的最后一个节点,方便下一次接上新节点 while(p!=NULL && q!=NULL) { if(p->data < q->data) { s->next = p; p->prior=s; p = p->next; s = s->next; } else if(p->data = q->data) { s->next= p; p->prior=s; p=p->next; Node *x=q->next;//备用元素指向 free(q); q=x; } else if(p->data > q->data) { s->next = q; q->prior=s; q = q->next; s = s->next; } } if(p == NULL)//链表1先遍历完,说明另一链表还有数据得接过来 { s->next = q; q->prior=s; } if(q == NULL)//链表2先遍历完,因为此时主链表的结构已经发生变化,所以仍需拼接过来 { s->next = p; p->prior=s; } while(phead) { printf("%d ",phead->data); phead=phead->next; } return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576048566_174264.png)

c链表 选课系统 链表问题

课设,但是思路断断续续,希望各位大佬给条明路,谢谢各位啦。 课设,但是思路断断续续,希望各位大佬给条明路,谢谢各位啦。![图片说明](https://img-ask.csdn.net/upload/201705/18/1495119321_218483.png)

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

再不跳槽,应届毕业生拿的都比我多了!

跳槽几乎是每个人职业生涯的一部分,很多HR说“三年两跳”已经是一个跳槽频繁与否的阈值了,可为什么市面上有很多程序员不到一年就跳槽呢?他们不担心影响履历吗? PayScale之前发布的**《员工最短任期公司排行榜》中,两家码农大厂Amazon和Google**,以1年和1.1年的员工任期中位数分列第二、第四名。 PayScale:员工最短任期公司排行榜 意外的是,任期中位数极小的这两家公司,薪资...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

数据库——玩转SQL语句(以MySQL为例)

一、前言 照着大学的SQL server来学

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

华为初面+综合面试(Java技术面)附上面试题

华为面试整体流程大致分为笔试,性格测试,面试,综合面试,回学校等结果。笔试来说,华为的难度较中等,选择题难度和网易腾讯差不多。最后的代码题,相比下来就简单很多,一共3道题目,前2题很容易就AC,题目已经记不太清楚,不过难度确实不大。最后一题最后提交的代码过了75%的样例,一直没有发现剩下的25%可能存在什么坑。 笔试部分太久远,我就不怎么回忆了。直接将面试。 面试 如果说腾讯的面试是挥金如土...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

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

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

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

程序员毕业去大公司好还是小公司好?

虽然大公司并不是人人都能进,但我仍建议还未毕业的同学,尽力地通过校招向大公司挤,但凡挤进去,你这一生会容易很多。 大公司哪里好?没能进大公司怎么办?答案都在这里了,记得帮我点赞哦。 目录: 技术氛围 内部晋升与跳槽 啥也没学会,公司倒闭了? 不同的人脉圈,注定会有不同的结果 没能去大厂怎么办? 一、技术氛围 纵观整个程序员技术领域,哪个在行业有所名气的大牛,不是在大厂? 而且众所...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

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

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

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

01、Java入门(Getting Started);02、集成开发环境(IDE);03、项目结构(Eclipse JavaProject);04、类和对象(Classes and Objects);05:词法结构(Lexical Structure);06:数据类型和变量(Data Type and Variables);07:运算符(Operators);08:控制流程语句(Control Flow Statements);

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

立即提问
相关内容推荐