【链表】为什么用L->Next=NULL就出错

想实现两个东西:1.求链表长度 2.求完链表长度就将链表置空

代码如下:

int Length(List L){//求链表长度
    int i=0;
    while(L){
        L=L->Next;
        i++;
    } 
    L->Next=NULL;
    return i;
}

问题出在:如果去掉函数里面 L->Next=NULL;这个,这个函数就能正常求出表长。但是加了 L->Next=NULL;这个的话,崩溃了。不懂为什么会这样。

如果想要同时实现我第一行说的,就要用下面这段代码:

int Length(List L){
    List p=L;
    int i=0;
    while(p){
        p=p->Next;
        i++;
    } 
    L->Next=NULL;
    return i;
}

再加一个变量来指向表头。

为什么第一段代码不可以同时实现我第一行说的那两个呢?

1个回答

while(L){
L=L->Next;
i++;
}
当跳出循环的时候,肯定是L为NULL了
L->Next=NULL;
就是对一个0指针再读取它的next,显然崩溃了

下面那个代码,虽然不会崩溃,但是会造成内存泄漏。

要注意,p指向L的表头。
而L在循环里是不断变动的,循环结束的时候L指向了最后一个元素的下一个,也就是NULL,而p不变,一直是最初的L的表头

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复和樱: 对,不好意思,我说错了,你说的对,是p不断变动,我笔误,写成L了
大约一年之前 回复
weixin_40836227
和樱 “而L在循环里是不断变动的,循环结束的时候L指向了最后一个元素的下一个,也就是NULL,而p不变,一直是最初的L的表头”这句话是指第二段代码吗?第二段的话,当p为空退出while循环时,L置空。p也是空吧?
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
free释放链表内存总是出错,求高手指点!!

#include <iostream> #include <iomanip> #include <string> using namespace std; #define TRUE 1 #define FALSE 0 typedef struct Student { char num[10]; char name[10]; char grade[10]; }Student; typedef struct StuList { Student data; StuList *next; }StuList, *lpStuList; lpStuList stuList = NULL;//全局的学生信息链表 lpStuList head = NULL; //全局的链表头节点 void menu() { cout << "选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他:退出):" << endl; } int addStu() { int num; cout << "输入数据" << endl << "学生人数:"; cin >> num; if (stuList == NULL) { stuList = (lpStuList)malloc(sizeof(Student)); if (stuList != NULL) { stuList->next = NULL; } } lpStuList cur = NULL; for (int i = 1; i <= num; ++i) { Student student; cur = NULL; cur = (lpStuList)malloc(sizeof(Student)); cout << "第" << i << "个学生(学号 姓名 成绩):"; cin >> student.num >> student.name >> student.grade; cur->data = student; cur->next = NULL; if (head == NULL) { head = cur; } else stuList->next = cur; stuList = cur; } return TRUE; } int display() { cout << "输出数据" << endl; lpStuList cur = NULL; cur = head; if (cur == NULL) { cout << "没有任何学生信息哦" << endl; return FALSE; } else { cout << "学号\t\t姓名\t\t成绩" << endl; while (cur != NULL) { cout << cur->data.num << "\t\t" << cur->data.name << "\t\t" << cur->data.grade << endl; cur = cur->next; } return TRUE; } } void search() { char name[10]; cout << "按姓名查找数据" << endl << "请输入姓名:"; cin >> name; lpStuList cur = NULL; cur = head; int ok = 0; while (cur != NULL) { if (strstr(cur->data.name, name) != NULL) { if (ok == 0) { cout << "学号\t\t姓名\t\t成绩" << endl; ok = 1; } cout << cur->data.num << "\t\t" << cur->data.name << "\t\t" << cur->data.grade << endl; } cur = cur->next; } if (ok == 0) { cout << "未找到符合的信息哦" << endl; } } void exitApp() { if (head != NULL) { lpStuList cur = NULL; while (head != NULL) { cur = head; head = head->next; free(cur); // 运行到这里总会崩溃 cur = NULL; } } } int main() { int start = 1; while (start) { menu(); int num; cin >> num; switch (num) { case 1: {addStu(); break; } case 2: {display(); break; } case 3: {search(); break; } default: {exitApp(); start = 0; } } } system("pause"); }

链表操作中即使函数传入的是链表指针,若根节点没有改变,链表也会改变?

事情是这样的,今天刷剑指offer时,对书中的内容产生了一点点小质疑,所以就拿VS2013和Code::Blocks都跑了一遍,两者结果是一致的,但程序执行的结果让我有点疑惑。 题目如下: 在一个排序的链表中,删除链表中重复的节点。 例如: 1->2->3->3->4->4->5,删除后的结果为1->2->5。 书中说由于头节点也可能被删除,所以函数应申明为 ``` void deleteDuplication(ListNode** pHead) ``` 而不是 ``` void deleteDuplication(ListNode* pHead) ``` 然后我就试了一下第二者,发现如果函数deleteDuplication处理完毕后,如果以形参形式传入的根节点pHead没有发生改变,则在main()函数里打印出链表的时候,链表和处理前的不一样了(即发生了改变);但如果根节点发生了改变,在mian()函数里打印结果却发现链表和处理前一样(即没有发生改变)。 所以我就懵了,按书上这句话的意思,应该就是如果传入的根节点为链表指针(即ListNode* pHead),则链表应该出了函数也不会发生任何变化。 但实际的结果却是由根节点是否发生了变化而决定,求大家赐教哈。 (注:ListNode** pHead是正常的,却是是出了函数也会改变链表实参本身)。 还有一个问题就是如果在函数里delete掉形参链表一个节点,也会影响链表实参本身,这又是什么原理。 完整代码如下: 1)当形参根节点未发生变化时: ``` #include <stdio.h> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: void deleteDuplication(ListNode* pHead) { if (pHead == NULL || pHead->next == NULL) return; ListNode* pNode = pHead; ListNode* preNode = NULL; while (pNode) { bool deleteflag = false; if (pNode->next && pNode->val == pNode->next->val) deleteflag = true; if (!deleteflag) { preNode = pNode; pNode = pNode->next; } else { int value = pNode->val; ListNode* next = pNode; while (pNode && pNode->val == value) { next = pNode->next; //delete pNode; pNode = next; } if (preNode == NULL) pHead = pNode; else preNode->next = pNode; } } } }; int main() { //生成链表1->2->3->3->4->4->5 ListNode* pHead = new ListNode(1); pHead->next = new ListNode(2); ListNode* pNode = pHead; pNode = pNode->next; pNode->next = new ListNode(3); pNode = pNode->next; pNode->next = new ListNode(3); pNode = pNode->next; pNode->next = new ListNode(4); pNode = pNode->next; pNode->next = new ListNode(4); pNode = pNode->next; pNode->next = new ListNode(5); Solution so; so.deleteDuplication(pHead); pNode = pHead; while (pNode) { printf("%d ", pNode->val); pNode = pNode->next; } printf("\n"); return 0; } ``` 输出结果如下图: ![图片说明](https://img-ask.csdn.net/upload/201904/07/1554621274_199353.jpg) 2)当形参根节点发生变化时: ``` #include <stdio.h> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: void deleteDuplication(ListNode* pHead) { if (pHead == NULL || pHead->next == NULL) return; ListNode* pNode = pHead; ListNode* preNode = NULL; while (pNode) { bool deleteflag = false; if (pNode->next && pNode->val == pNode->next->val) deleteflag = true; if (!deleteflag) { preNode = pNode; pNode = pNode->next; } else { int value = pNode->val; ListNode* next = pNode; while (pNode && pNode->val == value) { next = pNode->next; //delete pNode; pNode = next; } if (preNode == NULL) pHead = pNode; else preNode->next = pNode; } } } }; int main() { //生成链表1->1->3->3->4->4->5 ListNode* pHead = new ListNode(1); pHead->next = new ListNode(1); ListNode* pNode = pHead; pNode = pNode->next; pNode->next = new ListNode(3); pNode = pNode->next; pNode->next = new ListNode(3); pNode = pNode->next; pNode->next = new ListNode(4); pNode = pNode->next; pNode->next = new ListNode(4); pNode = pNode->next; pNode->next = new ListNode(5); Solution so; so.deleteDuplication(pHead); pNode = pHead; while (pNode) { printf("%d ", pNode->val); pNode = pNode->next; } printf("\n"); return 0; } ``` 输出结果如下图: ![图片说明](https://img-ask.csdn.net/upload/201904/07/1554621424_901317.jpg) 3)当函数中delete掉形参链表的一个节点时 无论形参根节点是否改变,实现链表都会发生变化。且在VS2013下,形参根节点发生改变时,程序会报内存访问出错。 ``` #include <stdio.h> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: void deleteDuplication(ListNode* pHead) { if (pHead == NULL || pHead->next == NULL) return; ListNode* pNode = pHead; ListNode* preNode = NULL; while (pNode) { bool deleteflag = false; if (pNode->next && pNode->val == pNode->next->val) deleteflag = true; if (!deleteflag) { preNode = pNode; pNode = pNode->next; } else { int value = pNode->val; ListNode* next = pNode; while (pNode && pNode->val == value) { next = pNode->next; delete pNode; //删除当前节点 pNode = next; } if (preNode == NULL) pHead = pNode; else preNode->next = pNode; } } } }; int main() { ListNode* pHead = new ListNode(1); pHead->next = new ListNode(1); ListNode* pNode = pHead; pNode = pNode->next; pNode->next = new ListNode(3); pNode = pNode->next; pNode->next = new ListNode(3); pNode = pNode->next; pNode->next = new ListNode(4); pNode = pNode->next; pNode->next = new ListNode(4); pNode = pNode->next; pNode->next = new ListNode(5); Solution so; so.deleteDuplication(pHead); pNode = pHead; while (pNode) { printf("%d ", pNode->val); pNode = pNode->next; } printf("\n"); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201904/07/1554622769_237692.png)

新手写链表,错误已找出,求解决

``` #include<iostream> using namespace std; struct linklist { linklist* next; int data; }; linklist* initll() { linklist* temp = new linklist; temp->next = NULL; temp->data = 0; return temp; } void output(linklist* head) { cout << "该链表的长度为:" << head->data << endl; if (head->data != 0) { cout << "该链表的内容为:"; linklist* temp = head->next; for (int i = 0; i < head->data; i++) { cout << temp->data << ","; } cout << endl; } } void insert(linklist* head, int pos, int value) { linklist* a = new linklist; a->data = value; linklist* p = head; for (int i = 1; i < pos; i++)//查找位置 { p = p->next; } a->next = p->next; p = a->next; head->data++; } int main() { linklist* head; head = initll(); output(head); for (int i = 0; i < 10; i++) { insert(head, 1, i); } output(head); cout << endl; } ``` 错误在主函数中最后一个输出函数,在输出内容的时候出错?为什么呢?

对链表头写入next,一直显示0xC0000005: 写入位置 0x00000068 时发生访问冲突

代码如下 #include <stdio.h> #include<malloc.h> #define ElementType int typedef struct Node{ int Data; struct Node *Next; } List; List L, *PtrL; void Listinput(List *ptrL,int max) { long int i,next_temp,l_temp; int data_temp; List *l,*L_temp; //ptrL->Next=l; for(i=0;i<max;i++) { l = (List *)malloc(sizeof(List)); scanf("%5ld%d%5ld",&l_temp,&l->Data,&l->Next); //l = (List *)malloc(sizeof(List)); l=(List *)l_temp; if(i==0) ptrL->Next=l; //l->Data=(int)data_temp; //l->Next=(List *)next_temp; } } int main() { int k,N,i; long int next_temp,l_temp; int data_temp; List *l; scanf("%d%d%d",&l_temp,&N,&k); PtrL = (List *)malloc(sizeof(List)); PtrL=(List *)l_temp; PtrL->Next=NULL; //Listinput(PtrL,N); //PtrL->Next=l; //ptrL->Next=l; for(i=0;i<N;i++) { l = (List *)malloc(sizeof(List)); scanf("%5ld%d%5ld",&l_temp,&l->Data,&l->Next); //l = (List *)malloc(sizeof(List)); l=(List *)l_temp; if(i==0) { PtrL->Next=l; ///////这一行报错 //l->Next=PtrL; } //l->Data=(int)data_temp; //l->Next=(List *)next_temp; } l=PtrL; for(i=0;i<N;i++) { l_temp=(int)l; data_temp=l->Data; next_temp=(int)l->Next; printf("%d %d %d",l_temp,data_temp,next_temp); } return 0; }

请教一个C++链表(linked list)的创建和遍历的基础问题

我从前对C++链表不太熟悉,现在看书上有一个例子讲链表的创建和遍历: ``` struct ListNode { int content; ListNode *next; }; // 请问:这里写或者不写“ListNode *head=NULL;”有什么区别? void List_Create(ListNode *&LN, int array[], int n) { ListNode* p; int i; LN = (ListNode*)malloc(sizeof(ListNode)); // 请问:这里的LN为什么要用malloc分配内存呢?直接ListNode* LN为什么不行呢? LN->next = NULL; // 把LN作为结尾指向NULL. for(i=n-1; i>=0; i--) { p = (ListNode*)malloc(sizeof(ListNode)); // 请问:这里的p为什么要用malloc分配内存呢?直接ListNode* p为什么不行呢? p->content = array[i]; p->next = LN->next; // 直接写p->next = LN为什么不对呢? LN->next = p; // 请问:为什么前面是把LN-next赋给p-next、这里却把p整个赋给了LN呢? } } void List_Display(ListNode *&LN) { cout << "\nThe displayed list is: " << endl; while(LN -> next != NULL) { cout << LN->next->content << " "; LN = LN->next; } cout << endl; } ``` 请教一下大家4个问题: 1 最开始的struct那一段,结尾处写或者不写 ListNode *head=NULL有什么区别? 2 Create函数中,LN=(ListNode*)malloc(sizeof(ListNode)) 以及 p=(ListNode*)malloc(sizeof(ListNode)); 请问:这里的LN为什么要用malloc分配内存呢?直接ListNode* LN和ListNode* p为什么不行呢?最开始struct那里 ListNode*head定义的时候也没malloc分配内存啊? 3 Create函数中,p->next = LN->next; LN->next = p;这应该是实现p的插入。但是为什么前面是把LN-next赋给p-next、后面却把p整个赋给了LN-next呢? 如果写 p->next = LN; LN->next = p; 这样看起来更一致,为什么不对呢? 4 Display函数虽然遍历了整个链表,但是也事实上移动到了链表的末端。有没有什么办法能既遍历、又不移动到末端呢? **谢谢了先!**

关于归并算法出错的提问

这个算法的归并部分有什么问题?求解释 #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef int status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; LinkList InitLinkList( ) { LinkList L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; return L; } /*LinkList Create(LinkList L,int n)逆位序输入 { LinkList p; int i; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for( i=n;i>0;--i) { p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=L->next; L->next=p; } }*/ void Create(LinkList L) { int n; LinkList p,q; p=L; printf("请输入结点个数n和n个数据元素:\n"); scanf("%d",&n); while (n--) { q=(LinkList)malloc(sizeof(LNode)); scanf("%d",&q->data); q->next=NULL; p->next=q; p=q; } } void Print(LinkList L) { int num=0; LinkList p; p=L->next; while (p) { num++; printf("%d ",p->data); p=p->next; } printf("\n该链表长度为%d\n",num); } status GetElem(LinkList L,int i) { int j; ElemType e; LinkList p; p=L->next; j=1; while(p&&j<i) { p=p->next; j++; } if(!p||j>i) printf("错误!程序强制退出!"); exit(!0); e=p->data; return e; } status ListInsert(LinkList L,int i,ElemType e) { int j; LinkList p,s; p=L; j=0; while (p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) printf("错误!程序强制退出!"); exit(!0); s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return 1; } void Delete(LinkList L,int i) { LinkList p,q; int j=0; p=L; while(p->next&&j<i-1) { p=p->next; ++j; } if(!(p->next)||j>i-1) printf("错误!程序强制退出!"); exit(!0); q=p->next; p->next=q->next; free(q); } LinkList MergeList(LinkList La,LinkList Lb) { LinkList pa,pb,pc,Lc; pa=La->next; pb=Lb->next; Lc=La; pc=La; while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } pc->next=pa?pa:pb; } free(Lb); return pc; } int main() { int i,get,a,b,Del; LinkList la,lb,lc,l; /* printf("-----创建链表阶段-----\n"); l=InitLinkList( ); Create(l); //int n;逆位序输入所需代码 //printf("请输入欲创建的函数的结点个数:");逆位序输入所需代码 //scanf("%d",&n);逆位序输入所需代码 //l=Create(l,n);逆位序输入所需代码 Print(l); printf("-----查找数据阶段-----\n"); printf("请输入欲查找的位置:"); scanf("%d",&i); get=GetElem(l,i); printf("查找得这个位置上的数据为:%d\n",get); printf("-----插入数据阶段-----\n"); printf("请输入欲插入的位置:"); scanf("%d",&a); printf("请输入插入的数据:"); scanf("%d",&b); ListInsert(l,a,b); Print(l); printf("-----删除数据阶段-----\n"); printf("请输入欲删除的数据的位置:\n"); scanf("%d",&Del); Delete(l,Del); Print(l);*/ printf("-----归并链表阶段-----\n"); printf("请输入链表La的数据:"); la=InitLinkList( ); Create(la); printf("请输入链表Lb的数据:"); lb=InitLinkList( ); Create(lb); lc=MergeList(la,lb); Print(lc); return 0; }

链表读取访问权限冲突

刚开始学链表,写了一个非递减单链表,先po程序吧 ``` #include<iostream> using namespace std; struct List //构建构建新节点的结构体 //非递减顺序排列 { int data; List * next; }; void insert(List * & headnode, int num) { List *s, *p = headnode, *q; //*s用于建立新节点 *p用于跟踪最新结点 //以下三行为构建新结点 s = new List; s->data = num; s->next = NULL; //以下if语句用于插入第一个结点 if (p->next == NULL) { headnode->next = s; p = s; return; } //新节点数据最小时的操作 if (headnode->next->data > s->data) { s->next = headnode->next; headnode->next = s; return; } //常规对比插入排序 for (q = headnode->next, p = headnode->next->next; p; q = p, p = p->next) { if (p->data >= s->data) { s->next = p; q->next = s; return; } } q->next = s; return; } void ShowList(const List * headnode) { cout << "您所输入的数为:"; while (headnode) { cout << headnode->data << '\t'; headnode = headnode->next; } cout << endl; } int main() { int k = 0, m = 0; //k用于输入新数据 m用于计算节点数 List * headnode = NULL; cout << "请输入除零以外的任何数" << endl; cin >> k; while (k != 0) { insert(headnode, k); cin >> k; m++; headnode->data = m; } ShowList(headnode); //输出链表 } ``` 然后再po出错的截图~ ![图片说明](https://img-ask.csdn.net/upload/201605/16/1463393731_478534.png) _**# 先在此谢过大神了!~**_

单链表里有三种类型元素,将它们按类型分为三个循环链表 这个算法哪里出错?

#include<iostream> #include<stdlib.h> #include<malloc.h> typedef char ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode , *LinkList , *CiList ; void CreateList( LinkList &L ,int n ) { LinkList p , q ; L = ( LinkList ) malloc ( sizeof ( LNode) ); L ->next = NULL ; q = L ; for ( int i=0 ; i < n ; i++) { p = ( LinkList ) malloc ( sizeof ( LNode) ); scanf( " %c", &p->data ); p->next = q->next ; q->next = p ; q = p ; } } void DipList ( LinkList L ) { LinkList p = L ; while ( p->next != NULL ) { p = p->next ; printf ( "%c", p->data); printf(" "); } } void Separate_List ( LinkList L , CiList &La ,CiList &Lb ,CiList &Lc ) { LNode *p,*q,*r,*s ; La = ( CiList ) malloc ( sizeof( LNode )); p = La ; Lb = ( CiList ) malloc ( sizeof( LNode )); q = Lb ; Lc = ( CiList ) malloc ( sizeof( LNode )); r = Lc ; s = L->next ; while ( s!= NULL ) { if ( s->data >= '0' && s->data <= '9') { p->next = s ; p = s ; s = s->next ; } if( s->data >= 'a' && s->data <= 'z') { q->next = s ; q = s ; s = s->next ; } else { r->next = s ; r = s ; s = s->next ; } } p->next = La ; q->next = Lb ; r->next = Lc ; } void main() { LinkList L; CiList La , Lb ,Lc ; int n ; printf( "请输入单链表长度:\n"); scanf("%d",&n); printf("请输入单链表元素:\n"); CreateList( L , n ); printf("输入的单链表为:\n"); DipList ( L ) ; Separate_List ( L , La ,Lb ,Lc ); printf("分离后的循环链表La为:\n"); DipList ( La ) ; printf("分离后的循环链表Lb为:\n"); DipList ( Lb ) ; printf("分离后的循环链表Lc为:\n"); DipList ( Lc ) ; } 到分离这个函数的时候就会出错 但是我自己检查自己的算法始终不知道错在哪 求指点 十分感谢!!

反转单向链表,C语言,运行出错

#include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct LNode{ int node; struct LNode *next; } LNode,*LinkList; LinkList Head_Node() { LinkList head; head=(LinkList)malloc(sizeof(LNode)); if(head==NULL) { printf("空间分配失败\n"); return head; } head->next=NULL; return head; } int CreateList(LinkList head) { int data; char c; LinkList p,q; q=head; printf("请输入数据:"); do { scanf("%d",&data); c=getchar(); p=(LinkList)malloc(sizeof(LNode)); if(p==NULL) { printf("空间分配失败\n"); return -1; } p->node=data; p->next=q->next; q->next=p; q=p; } while(c!='\n'); return 0; } LinkList Reverse(LinkList head) { LinkList p,q,r; p=head; q=head->next; head->next=NULL; if(q->next!=NULL) { r=q->next; q->next=p; p=q; q=r; } q->next=p; head->next=q; return head; } void Output(LinkList head) { LinkList p; p=head->next; while(p) { printf("%d ",p->node); p=p->next; } } int main() { LinkList head; head=Head_Node(); CreateList(head); Reverse(head); Output(head); system("pause"); return 0; }

C++链表头指针位置不知为什么出错

希望实现第一行输入n和m,后面共输入n+m行 后面有n行由四个数字组成,第一个为1,表示创建新的结点,第二个为此 结点的数据域,第三个为某个结点的数据域(如果为-1则表示此为第一个 创建的结点),第四个为0或者1,若为0表示新结点 建立在第三个数字代表的结点的左边,若为1则表示在右边。 后面有m行由2个数字组成,第一个为0,表示删除结点,第二个为需要删除 的结点的数据域。 最终把最后的链表打印出来,并在末尾加-1表示输出结束。 代码如下: #include<iostream> #include<conio.h> using namespace std; typedef struct node //同学结点 { int data; //同学编号 struct node *next; //结点指针,指向下一个 }NODE; class list { private: NODE *head; int length; public: list(){head=NULL;length=0;} ~list(){} int find(int i) { NODE *p=head; int j=1; //元素地址,第一位标记为第1位 while(p&&p->data!=i&&p&&p!=NULL) { p=p->next; j++; } if(p==NULL)return 0; //未找到返回0 return j; } int Insert(int i,int x,int k) { NODE *p=head, *s; int j=0; int location=find(x); if(location==0) { s=(NODE *)new NODE[1]; s->data=i; s->next=p; head=s; length++; return 1; } if(k==0) //插入左边 { while(p&&j<location-2){p=p->next;j++;} if(!p)return 0; s=(NODE *)new NODE[1]; s->data=i; s->next=p->next; p->next=s; length++; return 1; } else if(k==1) //插入右边??? { while(p&&j<location-1){p=p->next;j++;} if(!p)return 0; s=(NODE *)new NODE[1]; s->data=i; s->next=p->next; p->next=s; length++; return 1; } return 0; } int Delete(int i) { NODE *p=head,*q; int j=0; int location=find(i); if(!p)return 0; if(location==1) { head=head->next; delete p; p=NULL; length--; return 1; } while(p->next&&j<i-1){p=p->next;j++;} if(!(p->next)||j>i-1)return 0; q=p->next; p->next=q->next; delete q; q=NULL; length--; return 1; } void setlength(int n,int m) { length=n-m; } void print() //打印函数 { NODE *p=head; for(int i=0;i<length&&p!=NULL&&p;i++) { cout<<p->data<<' '; p=p->next; } } }; int main() { list student; int m,n,a1,a2,a3,a4,a5; scanf("%d",&n); scanf("%d",&m); student.setlength(n,m); for(int i=0;i<n+m;i++) { scanf("%d",&a1); if(a1==1) { scanf("%d",&a2); scanf("%d",&a3); scanf("%d",&a4); student.Insert(a2,a3,a4); } if(a1==0) { scanf("%d",&a5); student.Delete(a5); } } student.print(); cout<<-1; return 0; } 结果指针的顺序倒是没问题,但是打印出来的结果 经常不是从头开始打印,请问这是为什么?

用C语言实现数据结构的链表创建时出错

请教大家,下面的程序哪里有错啊?十分感谢 #include "stdio.h" #include "malloc.h" #include "stdlib.h" #define NULL 0 #define OK 1 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,LinkList; Status InitLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); return 0; } Status CreatLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); L->next=NULL; LinkList *p,*q; p=L; ElemType temp=0; printf("请按递增的顺序输入数据,输入-1结束\n"); for(int i=0;;i++) { scanf("%d",&temp); if(temp == -1)break; q=(LinkList *)malloc(sizeof(LNode)); q->data=temp; q->next=NULL; p->next=q; p=q; L->data++; } return OK; } Status PrintfLinkList(LinkList *L) { LinkList *p; p=L->next; while(p!=NULL) { printf("%d\t",p->data); p=p->next; } printf("\n"); return 0; } void main() { LinkList *m; m=(LinkList *)malloc(sizeof(LNode)); CreatLinkList(m); PrintfLinkList(m); }

c语言链表显示出错 求大佬帮忙

选项6出错 ![图片说明](https://img-ask.csdn.net/upload/201805/28/1527503476_559126.png) #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> //定义全局变量 int isEmpty=0;//标志,判断链表是否为空 //!!!定义单链表结构体!!! typedef struct Node{ int NUM;//类型总数 char NAME[100];//各类型名称 int num; //各类型下的货物总数 struct Node*next; }Node; //函数声明 Node*create(int n,Node*L); Node*input(Node*L); Node*output(Node*L); Node*outnum(Node*L); Node*outname(Node*L); Node*current(Node*L); void search(Node*L); void print(Node*L); void searchnum(Node*L); void searchname(Node*L); void display(int n,Node*L); //========新增加的函数======== Node*append(Node*L); //主函数 void main() { int x; int n;//初次输入的大小 Node *L; if(!(L=(Node *)malloc(sizeof(Node)))) //分配空间 { printf("\n"); exit(1); } printf("欢迎使用我的仓库管理系统!\n"); while(1) { //主菜单开始 printf("==========================\n"); printf("1.显示货物类型列表\n"); printf("2.增加货物类型\n"); printf("3.删除货物类型\n"); printf("4.货物入库\n"); printf("5.货物出库\n"); printf("6.库存显示\n"); printf("7.退出\n"); printf("==========================\n"); //主菜单结束 printf("选择1-7:"); scanf("%d",&x); switch(x) { case 1:;break; case 2:printf("请输入最初的货物类型数量:\n"); scanf("%d",&n); create(n,L); break; case 3:;break; case 4:;break; case 5:;break; case 6:display(n,L);break; case 7:;break; default:printf("input error!\nplaese input1-7"); } } } //函数 //1.创建链表节点 Node*create(int n,Node*L) { Node*pTail=L; L->next=NULL; Node*p; p=(Node*)malloc(sizeof(Node)); if(p==NULL) { printf("申请内存空间失败!\n"); } //利用尾插建立单链表 int i; for(i=1;i<=n;i++) { printf("请输入第%d种类型编号:",i); scanf("%d",&p->NUM); printf("请输入第%d种类型名称:",i); scanf("%s",&p->NAME); printf("请输入第%d种类型库存:",i); scanf("%d",&p->num); putchar('\n'); pTail->next=p; pTail=p; } p->next=NULL; return L; } //2.增加货物类型 /*Node*append(Node*L) { Node*ptail=L; L->next=NULL; Node*p; p=(Node*)malloc(sizeof(Node)); if(p==NULL) { printf("申请内存空间失败!\n"); } else { printf("请输入新增加的类型编号:\n"); scanf("%d",&p->NUM); printf("请输入第%d种类型名称:\n",i); scanf("%s",&p->NAME); printf("请输入第%d种类型库存:\n",i); scanf("%d",&p->num); while(p->NUM>) { } pTail->next=p; pTail=p; } p->next=NULL; } return L; } */ //货物显示函数 void display(int n,Node*L) { Node*p; p=(Node*)malloc(sizeof(Node)); p=L->next; int i=0; //for(i=0;i<n;i++) //{ while(p!=NULL) { printf("第%d种类型名称:",&p->NUM); printf("%s\n",&p->NAME); printf("第%d种类型库存:",&p->NUM); printf("%d\n",&p->num); p=p->next; //} } }

写一个删除链表的倒数第n个节点的问题能通过,但是提交答案显示出错

编程小白,写一个删除链表的倒数第n个节点的问题能通过,但是提交答案显示出错,求大神解答一下,谢谢 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n){ int i; ListNode *p1=head->next; ListNode *p=head;; while(p1 !=NULL && n>0){ p1=p1->next; --n; } while(p1 !=NULL) { p1=p1->next; p=p->next; }; p->next=p->next->next; return head; } }; 错误;Line 24: member access within null pointer of type 'struct ListNode'

新手:链表问题 编译通过 运行出错

#include <stdio.h> #include <stdlib.h> typedef struct LNODE{ char data; struct LNODE* next; }LNODE; void creatlist(LNODE* head); void insert(LNODE* head); void output(LNODE* head); int main(int argc,char* argv[]) { LNODE* head=NULL; creatlist(head); insert(head); output(head); return 0; } void creatlist(LNODE* head){ //创建一个只有表头节点的链表 head=(LNODE*)malloc(sizeof(LNODE)); } void insert(LNODE* head){ LNODE* p=NULL; p=(LNODE*)malloc(sizeof(LNODE)); p->data=getchar(); p->next=NULL; p->next=head->next; head->next=p; } void output(LNODE* head){ LNODE* p=NULL; p=head->next; while(p!=NULL){ putchar(p->data); p=p->next; } }

c语言运行出错 是链表哪里出错了吗

![图片说明](https://img-ask.csdn.net/upload/201806/13/1528859680_335574.png) ![图片说明](https://img-ask.csdn.net/upload/201806/13/1528859695_89773.png) ![图片说明](https://img-ask.csdn.net/upload/201806/13/1528859715_415797.png) #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct NODE { char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; struct NODE *next; }node; //下面这部分是啥??? typedef struct { char name[MAXSIZE]; int p_num; double p_price; }str; #if 0 void create(node *head); /*创建货物 main 194line*/ void del(node *head); /*删除指定货物*/ void find(node *head) /*查找货物*/ void all_delete(node *head); /*清空全部货物*/ void change(node *head); /*修改货物信息*/ int display() /*菜单*/ #endif void create(node *head) /*创建货物 main 194line*/ { node *p; /*判断货物是否存在的指针变量*/ int i = 1; char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; printf("*****************请输入货物名称:************\n"); scanf("%s",name); //getchar(); p = head->next; while(p != NULL) { if(strcmp(p->name,name) == 0) { printf("*********货物已存在************\n"); p = NULL; i = 0; /* 货物已存在,不执行输入货物命令*/ } else { p = p->next; } } while( 1 == i) { node *q; printf("**************请输入货物单位价格:**************\n"); scanf("%lf",&p_price); printf("**************请输入货物数量:**************\n"); scanf("%d",&p_num); printf("*****************请输入货物所属类型:************\n"); scanf("%s",kind); q = (node*)malloc(sizeof(node)); if(NULL == q) { printf("error2\n"); } strcpy(q->name,name); //strcpy(q->p_num,p_num); q->p_num=p_num; q->p_price=p_price; strcpy(q->kind,kind); q->next = head->next; head->next = q; /*头插法*/ i = 0; } } //我的代码跟这个的区别:没有在函数内重新定义变量 然后使用strcpy这些赋值 void order(node *head,int len1) //给货物排序 { node *p; /*用来排序的变量*/ node *q; /*同上*/ p = head->next; while(len1 > 0) /*实现货物按字母排列*/ { while(p != NULL && p->next!= NULL) { char tempname[MAXSIZE]; /*相当于中间变量用来存储货物信息*/ int tempp_num; double tempp_price; char tempkind[MAXSIZE]; if(strcmp(p->name,p->next->name) > 0) { strcpy(tempname, p->next->name); tempp_price=p->next->p_price; tempp_num=p->next->p_num; strcpy(tempkind,p->next->kind); strcpy(p->next->name,p->name); p->next->p_price=p->p_price; p->next->p_num=p->p_num; strcpy(p->next->kind,tempkind); strcpy(p->name,tempname); p->p_price=tempp_price; p->p_num=tempp_num; strcpy(p->kind,tempkind); } else { p=p->next; } } len1--; } } void print(node *head) /*打印联系人的函数*/ { int i = 1; node *p; p = head->next; printf("现在货物为:\n"); printf("编号 名称 价格 数量 所属类型\n"); while(p != NULL) { printf("%d %s %.2lf %d %s\n", i,p->name,p->p_price,p->p_num,p->kind); p = p->next; i++; } } void del(node *head) /*删除指定货物函数*/ { node *p; node *q; q = head; p = q->next; char name[MAXSIZE]; printf("************请输入要删除的货物名称:*********\n"); scanf("%s",name); while((p != NULL) && (strcmp(p->name,name) != 0)) { q = p; p = p->next; } if(NULL == p) { printf("************未查找到***************\n"); } else { q->next = p->next; free(p); printf("***********删除成功****************\n"); } } void find(node *head) //查找货物 { node *p; char name[MAXSIZE]; printf("*******请输入要查找货物名称:**********\n"); scanf("%s",name); p = head->next; while(p != NULL && strcmp(p->name,name) != 0) { p = p->next;//为什么del函数里面还定义了一个指针q } if(NULL == p) { printf("********没有这个货物*********\n"); } else { printf(" 名称:%s\n 价格:%.2lf 数量:%d 所属类型:%s", p->name,p->p_price,p->p_num,p->kind); } } void all_delete(node *head) //清空全部货物 { while(head->next != NULL) { node *q; q = head->next; head->next = q->next; free(q); } if(NULL == head->next) { printf("*********清除所有货物成功*********\n"); } } void change(node *head) //修改货物信息 { node *p; char name[MAXSIZE]; double p_price; int p_num; char kind[MAXSIZE]; p = head->next; printf("请输入要修改的货物名称\n"); scanf("%s",name); while( p != NULL) { if(strcmp(p->name,name) == 0) { printf("请输入要修改的货物价格\n"); scanf("%lf",p_price); p->p_price=p_price; printf("修改成功\n"); break; } else { p = p->next; } } if(p == NULL) { printf("未查找到此联系人!\n"); } } int sum(node *head) //求链表中有多少货物 { int count_node = 0; node *p; p = head->next; if(p != NULL) { count_node++; p = p->next; } return count_node; } /*void write_to_file(node *head,int len) //链表中的货物信息写到文件 { int i; str string[100]; FILE *fp = fopen("a2","wb"); if(NULL == fp) { printf("open error\n"); exit(1); } //printf("1111\n"); while( head->next != NULL) { for(i = 0;i < len;i++) { strcpy(string[i].name,head->next->name); strcpy(string[i].p_num,head->next->p_num); fwrite(&string[i],sizeof(str),1,fp); //依次将结构体数组写到文件 head = head->next; } } fclose(fp); } void read_to_linklist(node *head) //将文件中的数据读到链表中 { int i; int m; int j = 0; node *p; node *q; p = head; FILE *fp; fp = fopen("a2","rb"); fseek(fp,0,SEEK_END); i = ftell(fp); fseek(fp,0,SEEK_SET); m = (i/(sizeof(str))); // m :文件中有多少个联系人 str string[100]; //结构体数组,存放所有联系人 fread(string,sizeof(str),m,fp); while(m > 0) { q = (node*)malloc(sizeof(node)); strcpy(q->name,string[j].name); strcpy(q->p_num,string[j].p_num); m--; j++; p->next = q; p = q; } fclose(fp); }*/ int display() //菜单 { printf( "\n**************请选择要进行的操作***********\n"); printf("-----------------------------------------------\n"); printf("*|************* 1 .添加货物******************|*\n"); printf("*|************* 2 .删除货物******************|*\n"); printf("*|**************3 .查找货物******************|*\n"); printf("*|**************4 .显示货物******************|*\n"); printf("*|**************5 .修改货物******************|*\n"); printf("*|**************6 .清空货物******************|*\n"); printf("*|**************7 .退 出******************|*\n"); printf("-----------------------------------------------"); } int main() { int a; int n = 1; node *head; node *q; head = (node*)malloc(sizeof(node)); if(NULL == head) { printf("error\n"); } q = head; head->next = NULL; //read_to_linklist(q); while(n == 1) { printf("\n",display()); printf("\n**********************请输入要进行的操作**********\n\n"); scanf("%d",&a); switch(a) { case 1: while(getchar() != '\n'); create(q); order(q,sum(q)); a = 0; break; case 2: while(getchar() != '\n'); del(q); getchar(); print(q); break; case 3: find(q); break; case 4: while(getchar() != '\n'); print(q); break; case 5: while(getchar() != '\n'); change(q); break; case 6: all_delete(q); break; case 7: //write_to_file(q,sum(q)); n = 0; break; default: { printf("*****输入错误,请重新选择指令:******\n"); } while(getchar() != '\n'); break; } } free(head); }

Lintcode 链表插入排序

Given 1->3->2->0->null, return 0->1->2->3->null /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution { public: /* * @param head: The first node of linked list. * @return: The head of linked list. */ ListNode * insertionSortList(ListNode * head) { // write your code here ListNode* temp1=head; if(temp1->next==NULL) return head; vector<int> vec; while(temp1!=NULL) { vec.push_back(temp1->val); temp1=temp1->next; } sort(vec.begin(),vec.end()); ListNode* returnhead; ListNode* temp2=returnhead; for (auto c:vec) { temp2 = new ListNode(c); temp2=temp2->next; } return returnhead; } }; 请问哪里出错了?

链表输出出错,不知道具体是哪里出错,麻烦大神帮忙指正?

两链表求差集 ``` #include <stdio.h> #include<stdlib.h> #define LEN sizeof(struct Node) struct Node { int a; struct Node* next; }; int n; struct Node *creat(int a) { int i; struct Node*head; struct Node* p1,*p2; n=0; p1=p2=(struct Node*)malloc(LEN); scanf("%d",&p1->a); for(i=0;i<a;i++) { n++; if(n==1) { head=p1; } else p2->next=p1; p2=p1; p1=(struct Node*)malloc(LEN); scanf("%d",&p1->a); } p2->next=NULL; return(head); }; struct Node*Different(Node*A, Node*B) { Node*pa=A; Node*pb=B; Node*pre=NULL; Node*del; while(pa) { Node*pb=B; while(pb&&pa->a!=pb->a) { pb=pb->next; } if(pb) { if(pre==NULL) { head=pa->next; } else { pre->next=pa->next; } del=pa; pa=pa->next; delete del; } else { pre=pa; pa=pa->next; } } return(head);//返回表头位置 } void p(Node *A)//输出链表 { Node *p; p=A; while(p->next!=NULL) { printf("%d ",p->a); p=p->next; } } int main() { struct Node*m; struct Node*n; struct Node*B; int a,b; scanf("%d\n",&a);//结点数 m=creat(a); scanf("%d\n",&b);//结点数 n=creat(b); struct Node*A; B=Different(m,n); p(B); return 0; } ```

C语言求教merge(struct node *p,struct node *q)哪里出错了?

#include "stdio.h" #include "stdlib.h" struct node { int data; struct node *next; }; struct node *creat(int *a) { struct node*h,*p,*q; int i; h=p=(struct node*)malloc(sizeof(struct node)); for(i=0;i<10;i++) { q=(struct node*)malloc(sizeof(struct node)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void output(struct node*h) { struct node*p; p=h->next; if(p==NULL) printf("The list is NULL!\n"); else { printf("\nHead"); while(p->next!=0) { printf("->%d",p->data); p=p->next; } printf("->End\n"); } } void merge(struct node *p,struct node *q) { struct node *s,*r; r=p; while(r->next!=NULL) { if(r->next->data<q->next->data) { s=r->next; r=s->next; s->next=r; r=s; r=r->next; } else if(r->next->data>q->next->data) { s=q->next; q->next=s->next; s->next=q; r->next=s; r=r->next; } else { r=r->next; s=q->next; q=q->next; free(s); } } if(q->next!=NULL) { r->next=q->next; free(q); } } void main() { struct node *p,*q; int a[10]={1,2,3,4,5,7,9,11,13,15}; int b[10]={1,2,3,4,5,8,10,12,14,16}; p=creat(a); printf("The first list before merging:\n"); output(p); q=creat(b); printf("The second list before merging:\n"); output(q); merge(p,q); printf("The list after merging:\n"); output(p); } ===C程序题:假设链表p和链表q中的结点值都是整数,且按结点值递增次序链接起来的带表头结点的单链表,在每个链表中,每个结点的值各不相同,但链表p和链表q可能有值相同的结点。下面函数将链表q合并到链表p中,使得合并后的链表仍为按结点值递增有序的单链表,且链表中每个结点的值各不相同。====求教void merge(struct node *p,struct node *q)哪里出错了,导致以上程序运行结果不对呢?

数据结构链表创建出错

麻烦大家帮我看看哪里出错了,十分感谢啊 #include "stdio.h" #include "malloc.h" #include "stdlib.h" #define NULL 0 #define OK 1 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,LinkList; Status InitLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); return 0; } Status CreatLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); L->next=NULL; LinkList *p,*q; p=L; ElemType temp=0; printf("请按递增的顺序输入数据,输入-1结束\n"); for(int i=0;;i++) { scanf("%d",temp); if(temp == -1)break; q=(LinkList *)malloc(sizeof(LNode)); q->data=temp; q->next=NULL; p->next=q; p=q; L->data++; } return OK; } Status PrintfLinkList(LinkList *L) { LinkList *p; p=L->next; while(p!=NULL) { printf("%d\t",p->data); p=p->next; } printf("\n"); return 0; } void main() { LinkList *m; m=(LinkList *)malloc(sizeof(LNode)); CreatLinkList(m); PrintfLinkList(m); }

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

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

删库了,我们一定要跑路吗?

在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。 在 mysql 数据库中,我们知道 binlog 日志记录了我们对数据库的所有操作,所以 binlog 日志就是我们自救的利器。 接下来就来开启程序员自救之路。 想要自救成功,binlog 这把利器一定要好,在自己之前,我们一定要确定我们有 binlog 这把利器,以下就是确保有 bi...

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

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

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

数据结构与算法思维导图

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

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

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

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

和黑客斗争的 6 天!

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

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

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

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

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

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

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

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

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

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

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

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

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

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

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

现代的 “Hello, World”,可不仅仅是几行代码而已

作者 |Charles R. Martin译者 | 弯月,责编 | 夕颜头图 |付费下载自视觉中国出品 | CSDN(ID:CSDNnews)新手...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 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主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

立即提问
相关内容推荐