用C++创建单链表,运行到p->next=(*list)->next;时显示发生访问冲突

图片说明
代码如下

#include<iostream>
using namespace std;
struct Node//创建单链表结构体
{
    int date;
    Node *next;
};
int list_headinsert(Node **list, int a[], int n);
int getlist(Node *list, int i);
int main()
{
    int *p, n;
    cout << "请输入n=";
    cin >> n;
    p = new int[n];
    for (int i = 0; i < n; i++)
    {
        cout << "请输入第" << i << "个元素=";
        cin >> p[i];
    }
    Node **list=new Node*;//创建一个空表;
    if (*list == NULL)
    {
        cout << "空间申请失败";
        return 0;
    }
    list_headinsert(list, p, n);
    for (int i = 1; i < n; i++)//按顺序导出数据元素;
        cout << getlist(*list, i) << ' ';
    return 1;
}
int list_headinsert(Node **list, int a[], int n)//头插法新建带头结点的单链表,并将数组元素导入
{
    Node *p = new Node;
    p->next = NULL;
    for (int i = n; i >1; i--)
    {
        Node*p = new Node;
        p->date = a[i];
        p->next = (*list)->next;
        (*list)->next = p;
    }
    return 1;
}
int getlist(Node *list, int i)//查找链表数据元素
{
    Node *p = list->next;
    int j = 0;
    if (p == NULL)
    {
        cout << "空表";
            return 0;
    }
    while (p&& j < i)
    {
        p = p->next;
        j++;
    }
    return p->date;
}
c++

2个回答

你看到 0xCDCDCDCD 了么?这是VC++很方便的一点,它的调试版的程序,当你用new/malloc分配内存的时候,它会把这块内存全部用0xCD填充。
所以你看到这个,想都不用想就知道了,list->next这个指针没有初始化。
你无论new或者malloc创建了Node,都要记得加上node->next = NULL

weixin_43363018
南城啊呀呀呀 可是加上初始化语句还是显示访问冲突
11 个月之前 回复

函数list_headinsert 里面循环之前缺少把Node *p = new Node;创建的变量赋值给*list的操作,*list仍然是个指针,没赋值就调用 (*list)->next当然会出错

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
用C++创建单链表,运行到p->next=(*list)->next;时显示发生访问冲突
![图片说明](https://img-ask.csdn.net/upload/201905/04/1556935808_498196.png) 代码如下 ``` #include<iostream> using namespace std; struct Node//创建单链表结构体 { int date; Node *next; }; int list_headinsert(Node **list, int a[], int n); int getlist(Node *list, int i); int main() { int *p, n; cout << "请输入n="; cin >> n; p = new int[n]; for (int i = 0; i < n; i++) { cout << "请输入第" << i << "个元素="; cin >> p[i]; } Node **list=new Node*;//创建一个空表; if (*list == NULL) { cout << "空间申请失败"; return 0; } list_headinsert(list, p, n); for (int i = 1; i < n; i++)//按顺序导出数据元素; cout << getlist(*list, i) << ' '; return 1; } int list_headinsert(Node **list, int a[], int n)//头插法新建带头结点的单链表,并将数组元素导入 { Node *p = new Node; p->next = NULL; for (int i = n; i >1; i--) { Node*p = new Node; p->date = a[i]; p->next = (*list)->next; (*list)->next = p; } return 1; } int getlist(Node *list, int i)//查找链表数据元素 { Node *p = list->next; int j = 0; if (p == NULL) { cout << "空表"; return 0; } while (p&& j < i) { p = p->next; j++; } return p->date; } ```
链表插入时while(p)和while(p->Next)有何不同
#include "stdio.h" #include "stdlib.h" typedef struct List { int data; struct List *Next; }Node,*NodePtr; NodePtr ListPtr; void ListInsert(NodePtr L,int i) { NodePtr p; NodePtr q; p = L; while(p) //在这里我用 while(p)的话程序就会卡死在这里,如果用while(p->Next)就可以正常运行,请问是为什么 { p = p->Next; } q = (Node*)malloc(sizeof(Node)); q->data = i; p->Next = q; printf("111\n"); p=q; p->Next = NULL; } void ListCreatTail(NodePtr *L) { *L = (Node*)malloc(sizeof(Node)); (*L)->Next = NULL; } void ListDelete(NodePtr L, int i) { int j = 1; NodePtr p,q; p=L; while(p,j < i) { p=p->Next; ++j; } q=p->Next; p->Next = q->Next; free(q); } void ListPrintf(NodePtr L) { NodePtr p; p=L->Next; while(p) { printf("%d\n",p->data); p=p->Next; } } void main() { ListCreatTail(&ListPtr); ListInsert(ListPtr,1); ListInsert(ListPtr,2); ListInsert(ListPtr,3); ListInsert(ListPtr,4); ListInsert(ListPtr,5); ListDelete(ListPtr,2); ListPrintf(ListPtr); }
问一个很愚蠢的基础问题,p=p->next链表循环里,为什么这样不会覆盖掉链表的值啊
链表循环里 比如L是带头节点的单链表 循环单链表一般都是 ``` list p=(list)malloc(sizeof(link)); p=L->next; while(p) { printf("%d ",p->data); p=p->next; } ``` 为什么节点值没有一个一个被覆盖掉,下一次遍历还存在啊。 比如L 这个链表里面值分别是 1,2,3,4,5,按照p=p->next不应该是1这里的节点被2代替,2被3代替了么,求解求解,以前写代码就只是写写没有思考过。。。 还有 ``` 单链表构建栈反向输出链表节点值 void print(list p) if(p->next!=0) print(p->next); printf("%d",p->data);} 它为什么可以输出最后一个节点以外值不应该输出了最后一个节点值就跳出程序么 ```
请教一个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函数虽然遍历了整个链表,但是也事实上移动到了链表的末端。有没有什么办法能既遍历、又不移动到末端呢? **谢谢了先!**
对俩个链表进行合并用指针p1和p2可以,对L1,L2进行取值为什么不对?
链表中指针的问题 ,新定义指针对链表操作与直接对链表操作区别,代码如下? ``` 代码1 List Merge( List L1, List L2 ) { List L,q; L =malloc(sizeof(struct Node)); q =L; L1=L1->Next; L2=L2->Next; while(L1&&L2) { if(L1->Data<L2->Data) { q->Next=L1; q =L1; L1=L1->Next; } else { q->Next=L2; q =L2; L2=L2->Next; } } q->Next =L1?L1:L2; L1->Next=NULL; L2->Next=NULL; return L; } 代码2 List Merge( List L1, List L2 ) { List L; L=malloc(sizeof(struct Node)); List p;//用P做游标遍历链表 p=L; List p1=L1->Next;//头插法 List p2=L2->Next; while(p1&&p2) { if(p1->Data<p2->Data) { p->Next=p1; p=p1; p1=p1->Next; } else { p->Next=p2; p=p2; p2=p2->Next; } } p->Next=p1?p1:p2; L1->Next=NULL;//为了输出 L2->Next=NULL; return L; }//代码2用p1和p代替L1和L2,代码直接对L1,L2为什么不对 ```
02-线性结构1 两个有序链表序列的合并----答案错误求解
本题要求实现一个函数,**将两个链表表示的递增整数序列合并为一个递增的整数序列。** 函数接口定义: ``` List Merge( List L1, List L2 ); ``` 其中List结构定义如下: ``` typedef struct Node *PtrToNode; struct Node {     ElementType Data; /* 存储结点数据 */     PtrToNode   Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ ``` **L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个递增的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。** 裁判测试程序样例: ``` #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node {     ElementType Data;     PtrToNode   Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() {     List L1, L2, L;     L1 = Read();     L2 = Read();     L = Merge(L1, L2);     Print(L);     Print(L1);     Print(L2);     return 0; } /* 你的代码将被嵌在这里 */ ``` 输入样例: 3 1 3 5 5 2 4 6 8 10 输出样例: 1 2 3 4 5 6 8 10  NULL NULL****   编译器:gcc 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:DS课程组 单位:浙江大学 我的答案: ``` List Merge( List L1, List L2 ){ PtrToNode p1,p2,q1,q2; p1 = L1; q1 = L2; p2 = L1->Next; q2 = L2->Next; while(p2&&q2){ if(p2->Data >= q2->Data){ q1->Next = q2->Next; q2->Next = p2; p1->Next = q2; p1 = p1->Next; q2 = q1->Next; } else{ p1 = p2; p2 = p2->Next; } } if(q2) p1->Next = q2; PtrToNode q3 = L2; L2->Next = NULL; free(q3); PtrToNode front = (PtrToNode)malloc(sizeof(struct Node)); front->Next = L1->Next; L1->Next = front; PtrToNode p3 = L1; L1 = L1->Next; p3->Next =NULL; free(p3); return L1; } ``` ******我的想法是直接在L1中进行排序: 设置p1,p2指向L1链表,其中p2指向L1的当前结点,初始化为第一个节点;p1指向当前结点的前一节点,方便L2结点插入,初始化为头节点。 设置q1,q2指向L2链表,其中q2指向L2的当前结点,初始化为第一个节点;q1指向当前结点的前一节点,方便q2重新定位,不过没太多用处。 然后比较 p2->Data 和 q2>Data,知道其中一方为空。 q2->Data小的话,则将q2指向的结点插入到L1中。 p2->Data小的话,则将p1,p2都指向下一位。 比较到p2,q2其中一方为空。 如果L2还有剩余(即p2先指向NULL),则将其接到的p1后。 最后由于原L1,L2需输出为空,所以建立一个结点 front,先头插到L1原头结点和第一个节点之间。 然后将L1原头结点free,L2则直接free。 思路是如此。但答案错误........ 也从网上看到其他人的答案,思路比我更好,也更容易理解。 但还是不明白自己哪部错了。 向大家求解,多谢!!!******
当s1,s2链表不为空时,s3为空,交集为空时程序停止工作
# 两个有序链表序列的交集 (20分) 已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。 输入格式: 输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。 输出格式: 在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。 ``` #include <stdio.h> #include <stdlib.h> typedef struct LNode { int Data; struct LNode *Next; }List; int main() { List *s1,*s2,*s3,*p1,*p2,*p3; int x1,x2; s1 = (List *)malloc(sizeof(List)); s2 = (List *)malloc(sizeof(List)); s3 = (List *)malloc(sizeof(List)); s1->Next = NULL; s2->Next = NULL; p1 = s1; scanf("%d",&x1); while(x1 != -1) { p1->Next = (List*)malloc(sizeof(List)); p1->Next->Data = x1; p1 = p1->Next; p1->Next = NULL; scanf("%d",&x1); } scanf("%d",&x2); p2 = s2; while(x2 != -1) { p2->Next = (List*)malloc(sizeof(List)); p2->Next->Data = x2; p2 = p2->Next; p2->Next = NULL; scanf("%d",&x2); } p1 = s1->Next; p2 = s2->Next; p3 = s3; s3->Next = NULL; while(p1!=NULL&&p2!=NULL) { if(p1->Data>p2->Data) { p2 = p2->Next; } if(p1->Data<p2->Data) { p1 = p1->Next; } if(p1->Data == p2->Data) { p3->Next = p1; p1 = p1->Next; p2 = p2->Next; p3 = p3->Next; } p3->Next = NULL; } p3 = s3->Next; if(p3 != NULL) { printf("%d",p3->Data); p3 = p3->Next; while(p3 != NULL) { printf(" %d",p3->Data); p3 = p3->Next; } } if(s3->Next == NULL)//当s1,s2链表不为空时,s3为空,运行c错误 { printf("NULL"); } return 0; } ``` 当s1,s2链表不为空时,s3为空,交集为空时程序停止工作
请问如何才能打印出单链表中的元素的值?
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct LNode{ int data; struct LNode *next;//一个指向LNode类型结构的指针变量 (指针域) }LNode,*LinkList; //单链表初始化 int InitList_L(LinkList &L){ L = (LinkList)malloc( sizeof(LNode) ); L->next = NULL; //先建一个带头节点的单链表 printf("单链表初始化成功!\n"); return 0; } //头插法创建链表 int CreateList_L(LinkList &L,int n){ LinkList p;//起始位置 for(int i = n;i > 0;i--){ p = (LinkList)malloc( sizeof(LNode) ); //生成新结点 scanf("%d",p->data); p->next = L->next; L->next = p; } printf("创建成功!\n"); return 0; } //查找第i个元素 int GetElem_L(LinkList &L,int i){ LinkList p; p = L->next; int j = 1; int e; while(p && j < i){ p = p->next; j++; } if(!p || j > i){ printf("第%d个元素不存在\n",i); } e = p->data; printf("查找元素为:%d\n",e); return 0; } //第i个位置插入元素 int ListInsert_L(LinkList &L,int i,int e){ LinkList p = L; LinkList s; int j = 0; while(p && j < i-1){ p = p->next; j++; } if(!p || j > i-1){ printf("插入错误!\n"); } s = (LinkList)malloc( sizeof(LNode) ); s->data = e; s->next = p->next; p->next = s; printf("插入成功!\n"); return 0; } //删除第i个元素 int ListDelete_L(LinkList &L,int i){ LinkList p = L; LinkList q; int j = 0; int e; while( p->next && j < i-1 ){ p = p->next; j++; } if( !(p->next) || j > i-1 ){ printf("删除错误!\n"); } q = p->next; p->next = q->next; e = q->data; printf("删除成功!\n"); free(q); return 0; } //打印链表 int PrintList_L(LinkList &L){ LinkList p; p = L->next; if(p == NULL){ printf("这是一个空链表!\n"); } while(p){ printf("%d ",p->data); p = p->next; } printf("\n"); return 0; } int main(){ LinkList List; int n;//链表元素个数 int i;//链表元素位置 int e;//链表插入的元素 printf("输入链表元素个数:"); scanf("%d",&n); InitList_L(List); printf("输入链表:\n"); CreateList_L(List,n); printf("链表创建如下:\n"); PrintList_L(List); printf("输入查找的位置:"); scanf("%d",&i); GetElem_L(List,i); printf("输入插入的位置和插入元素:"); scanf("%d %d",&i,&e); ListInsert_L(List,i,e); printf("新链表如下:\n"); PrintList_L(List); printf("输入删除的位置:"); scanf("%d",&i); ListDelete_L(List,i); printf("新链表如下:\n"); PrintList_L(List); return 0; } ![图片说明](https://img-ask.csdn.net/upload/202002/04/1580819821_694608.png)
【链表】为什么用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; } ``` 再加一个变量来指向表头。 为什么第一段代码不可以同时实现我第一行说的那两个呢?
[紧急求救]C++:在循环结构中使用链表,程序运行终端
如题。(这是图像处理中的中值滤波,不过问题不涉及图像处理) 链表操作都没有问题,在另外的程序中测试过。这这段代码中第一次调用也没有问题,就是第二次到list.insert()时会跳出中断: ![图片说明](https://img-ask.csdn.net/upload/201505/14/1431535355_2983.png) 这段代码如下: ``` int i, j, x, y, p, t;//p为当前像素位置 int a[arg*arg] = {0}; linklist list; for (y = 0; y<nHeight - arg + 1; y++) { for (x = 0; x<nWidth - arg + 1; x++) { //计算每一点的算术均值滤波,p为模板左上角点 p = x * 3 + y*nByteWidth; t = p; list.create(); for (j = 0; j < arg; ++j) { for (i = 0; i < arg; ++i) { ****list.insert(lpBits[t]);**** t += 3; } t = t - 3 * arg + nByteWidth; }//上面t指向原图中的位置,下面指向滤波后图像的位置 list.display(a); t = p + (nByteWidth + 3)*(arg - 1) / 2; lpTemp[t] = a[(arg*arg+1)/2]; lpTemp[t + 1] = lpTemp[t]; lpTemp[t + 2] = lpTemp[t]; list.del(list); } } ``` 是一点一点设断点找到这个地方的。其他地方应该都没有问题。应该是我链表没delete好。 插入的函数:list.insert()如下: ``` //插入一个节点并构成顺序链表 void linklist::insert(int pix) { node *p, *q; q = new node; int i, len; len = listlength(); p = head; for (i = 0; i < len; ++i) { if (pix < p->data) { q->data = p->data, q->next = p->next; p->data = pix, p->next = q; i = len; } else if (pix < p->next->data) { q->data = pix, q->next = p->next, p->next = q; i = len; } else { p = p->next; } } if (p->next == NULL) q->data = pix, p->next = q, q->next = NULL; } ``` 删除链表的函数list.del(list);如下: ``` //销毁链表 void linklist::del(linklist list) { node *d, *p; p = head; while (p != NULL){ d = p; p = p->next; delete d; } } ``` 整个工程完整的代码如下[代码](http://pan.baidu.com/s/1pJsUe51 "压缩包是工程,下面是单独的cpp文件") ps:明天晚上就要交作业了,这段代码还要用到其他地方。真心请教各位
c++链表操作时出现的指针错误
``` struct Node { int data; Node* next; }; typedef Node* List_Node; class List { public: List(); ~List(); void creat_List_last(); // 创建新链表 void print_List(); // 遍历输出链表 private: List_Node head; }; List::List() { head = NULL; } void List::creat_List_last() { List_Node p, q; p = new Node; q = p; cout << "请输入数据(以-1表示结束):"<<endl; cin >> p->data; while (p->data != -1) { if (head == NULL) head = p; else q->next = p; q = p; p = new Node; cout << "请输入数据(以-1表示结束):" << endl; cin >> p->data; } q->next = NULL; delete p; } void List::print_List() { cout << "所有数据如下:" << endl; List_Node p=head; while (p) { cout<<p->data<<" "; p = p->next; } } List::~List() { List_Node p=head; while (p) { head = p->next; delete p; } } int main() { List l; l.creat_List_last(); l.print_List(); } ``` 提示:c++ - _Block_Type_Is_Valid (pHead->nBlockUse) Error 对指针操作不是很熟悉,望博友指教
小萌新在用C++写一个用数组元素创建一个新链表,创建了一个空表之后调用头插法函数时显示发生异常
//小萌新在用C++写一个用数组元素创建一个新链表,创建了一个空表之后调用头插法函数时显示发生的异常: 0xC0000005: 写入位置 0xCDCDCDD1 时发生访问冲突。求各位大佬帮帮孩子吧,代码如下 #include<iostream> using namespace std; struct Node { int date; Node *next; }; int list_headinsert(Node **list, int a[], int n); int getlist(Node *list, int i); int main() { int *p, n; cout << "请输入n="; cin >> n; p = new int[n]; for (int i = 0; i < n; i++) { cout << "请输入第" << i << "个元素="; cin >> p[i]; } Node **list = new Node*; (*list)->next = NULL; list_headinsert(list, p, n); for (int i = 1; i < n; i++) cout << getlist(*list, i) << ' '; return 1; } int list_headinsert(Node **list, int a[], int n) { Node *p = new Node; p->next = NULL; for (int i = n; i >1; i--) { Node*p = new Node; p->date = a[i]; p->next = (*list)->next; (*list)->next = p; } return 1; } int getlist(Node *list, int i) { Node *p = list->next; int j = 1; if (p == NULL) { cout << "空表"; return 0; } while (p != NULL && j < i) { p = p->next; j++; } return p->date; } ``` ```
关于两条升序的链表,合并成一条新的升序链表; if函数底下的tail已经指向了q,为什么while里面的函数让tail->next继续指向q
plist *merge(plist *ah,plist *bh) //合并函数 { plist *head,*tail,*p=ah,*q=bh,*ptemp; if(ah==NULL)return bh; if(bh==NULL)return ah; tail=p; if(p->no>q->no) tail=q; while(NULL!=p&&NULL!=q) { if(p->no<=q->no) { ptemp=p;p=p->next; } else { ptemp=q;q=q->next; } tail->next=ptemp;tail=ptemp; } if(NULL==p) { p=q; } ptemp=p; tail->next=ptemp; return head; }
一个c语言单向链表,编译通过,运行结果却不知所谓,请求帮助
这段代码在rhel6中用gcc编译通过,运行结果未定义,其中作的链表按number大小排序打印出来是没有排过序的结果,而且输入记录多了,其中某些项的number打印出来会由输入的值变成0或者一个莫名其妙的整数. vs2008中编译通过,打入多项记录只能显示2条,而且前一条是乱码. 最简单的一个数据结构,却忙了半天还查不出原因,帮个忙吧-_-||| **原代码:** /*简单单向链表,输入学生名称和号码,按号码排序, * 如果号码相同则记录合并为一条,附输出函数*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define N 50 #define LEN (sizeof(student *)) static int n=0;//计数器 typedef struct student{ char name[N]; int number; struct student *next;}student;//链表节点结构 int main() { student *add(student *head);//添加记录函数声明 void list(student *head);//列表函数声明 student *head=NULL; while(1){ printf("'N/n' to add,'L/l' to list,other to exit:"); char ch=toupper(getchar()); getchar(); if(ch=='N')head=add(head); else if(ch=='L')list(head); else break;} return 0; }//主函数 student *add(student *head){ student *p,*p1=head,*p2=head; p=(student *)malloc(LEN);//分配一片空间 printf("Input name:"); gets(p->name); printf("Input number:"); scanf("%d",&p->number); scanf("%*[^\n]"); scanf("%*c"); if(p->number<=0){//如果输入号码<=0,直接返回 printf("Wrong number!!\n"); return head;} else{ if(head==NULL){//如果表空直接接到头指针 head=p; head->next=NULL; n++;} else{//表不空 //确定p1指向 while(p->number>p1->number&&p1->next!=NULL){ p2=p1;//p2保存p1指向下一节点之前的值 p1=p1->next;} if(p->number<p1->number){//插入表中的情况 p2->next=p; p->next=p1; n++} //如果号相等,合并记录 else if(p->number==p1->number)strcpy(p1->name,p->name); else if(p1->next==NULL){//输入新记录的号码比链表里所有都大的情况 p1->next=p; p->next=NULL; n++;} } } return head;} void list(student *head){//遍历打印函数 student *p=head; printf("There's %d records!!\n",n); printf("Name:\t\tNumber:\n"); while(p){ printf("%s\t\t%d\n",p->name,p->number); p=p->next;} }
c语言中两个链表的合并(不用结点的方式)总是错误的
初学数据结构,在链表的合成中想尝试不用结点,发现不管咋样都是错误的。 下面是代码 ``` typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List; List Read(); void Print( List L ); List Merge( List L1, List L2 ); //对两个有序链表进行合并 //链表均带有头结点 int main() { List L1, L2, L; L1 = Read(); L2 = Read(); L = Merge(L1, L2); Print(L); Print(L1); Print(L2); return 0; } List Read() { int n; scanf("%d",&n); List L=(List)malloc(sizeof(PtrToNode)); ///申请一个头结点 L->Next = NULL; ///头指针为空 if(n) ///当n不是0时 { List r=L; ///r是一个中间变量的节点 for(int i=0;i<n;i++) { List p=(List)malloc(sizeof(struct Node)); scanf("%d",&(p->Data)); ///尾插法 r->Next = p; r = p; } r->Next = NULL; } return L; } void Print( List L ) { List p=L->Next; if(p) { List r; r = L; while(r->Next) { r = r->Next; printf("%d ",r->Data); } } else { printf("NULL"); } printf("\n "); } List Merge( List L1, List L2 ) { List L,p,a,b; L = (List)malloc(sizeof(struct Node)); p = L->Next; a = L1->Next; b = L2->Next; while(a && b) { if(a->Data < b->Data) { p->Data = a->Data; p = p->Next; a = a->Next; } else if(a->Data == b->Data) { p->Data = a->Data; p = p->Next; a = a->Next; b = b->Next; } else { p->Data = b->Data; p = p->Next; b = b->Next; } } for( ;a;a = a->Next) { p->Data = a->Data; p = p->Next; } for( ;b;b = b->Next) { p->Data = L2->Data; p = p->Next; } L1->Next = NULL; L2->Next = NULL; p = NULL; return L; } ```
C语言:合并有序双向链表问题
从txt文件中读取5 4 2 3 1 10 6 8 7 9 到数组中,建立了两个递增排序的双向链表,内容分别为 1 2 3 4 5和6 7 8 9 10,现在想将两个链表合并输出一个递增的双向链表,输出时少了1和6 两个数字,双向链表创建时没有设置头结点,怎么修改合并时的代码?或者,怎样创建带头结点的有序双向链表呢?大佬们救命 ``` #include "stdafx.h" #include <stdlib.h> #include <string.h> #include <iostream> using namespace std; #include<fstream> #include<stdio.h> /* C program to insetail nodes in doubly linked list such that list remains in ascending order on printing from left to right */ struct LinkList // A linked list node { int data; struct LinkList *prior; struct LinkList *next; }; // Function to insetail new node void nodeInsetail(struct LinkList **head, struct LinkList **tail, int key) { struct LinkList *p = new LinkList; 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. LinkList *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 LinkList *temp) { while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } } // Driver program to test above functions int main() { int num[10],i,j=0; int datalen=0; ifstream file("linklist.txt"); while( ! file.eof() ) file>>num[datalen++]; file.close(); struct LinkList *La = NULL, *pa = NULL; for(int i=0;i<5;i++) { nodeInsetail(&La, &pa,num[i]); } printf("\nDoubly linked listA on printing:"); printList(La); struct LinkList *Lb = NULL, *pb = NULL; for(int i=5;i<10;i++) { nodeInsetail(&Lb, &pb,num[i]); } printf("\nDoubly linked listB on printing:"); printList(Lb); printf("\n"); struct LinkList *Lc=NULL;//头 struct LinkList *pc=NULL;//备用地址 struct LinkList *q=NULL; Lc=(struct LinkList*)malloc(sizeof(struct LinkList)); pc=Lc;//备用合并链表起始地址 pa=La->next; pb=Lb->next; (这里有问题!) while(pa&&pb) { if(pa->data<pb->data) { Lc->next=pa; pa->prior=Lc; pa=pa->next; Lc=Lc->next; } else if(pa->data==pb->data) { Lc->next=pa; pa->prior=Lc; Lc=pa; pa=pa->next; q=pb->next; free(pb); pb=q; } else if(pa->data>pb->data) { Lc->next=pb; pb->prior=Lc; pb=pb->next; Lc=Lc->next; } } Lc->next=pa?pa:pb; free(Lb); printf("the result is:"); pa=pc->next; while(pa) { printf("%d ",pa->data); pa=pa->next; } return 0; } 执行结果如下(工作停止) Doubly linked listA on printing:1 2 3 4 5 Doubly linked listB on printing:6 7 8 9 10 the result is:2 3 4 5 7 8 9 10请按任意键继续. . . ```
请各位帮帮忙:指定一个数据,如果双向非循环链表中的有n个重复数据,往其中插入n个新的节点。打印节点数据后就死循环了?
//*******************双向非循环链表**********************// ``` #include"myhead.h" ```typedef struct dou_list_node { int data; struct dou_list_node *next; struct dou_list_node *prev; }dou_list,*dou_link; ```dou_link init_list() { dou_link head_ptr=malloc(sizeof(dou_list)); head_ptr->prev=NULL; head_ptr->next=NULL; return head_ptr; } ```dou_link creat_node(int data) { dou_link newnode_ptr=malloc(sizeof(dou_list)); newnode_ptr->data=data;//数据域 newnode_ptr->next=NULL;//指针域 newnode_ptr->prev=NULL;//指针域 return newnode_ptr; } ```int insert_tailnode(int data,dou_link head_ptr)//尾增 { dou_link newnode_ptr=creat_node(data); if(newnode_ptr==NULL) { puts("新节点传创建失败"); return -1; } dou_link p=head_ptr;//寻找尾节点 ``` while(p->next) { p=p->next; } //后增数据 newnode_ptr->prev=p; p->next=newnode_ptr; return 0;} ``` int PriDouList(dou_link head_ptr) { dou_link p=head_ptr->next; if(p==NULL) { puts("链表为空"); return -1; } puts("链表数据如下(顺序):"); while(1) { printf("%d\n",p->data); if(p->next==NULL) break; p=p->next; } puts("链表数据如下(逆序):"); while(p) { printf("%d\n",p->data); p=p->prev; if(p==head_ptr) break; } return 0; } ```int NumOfListNode(dou_link head_ptr)//计算链表的节点数量(不包括头节点) { dou_link p=head_ptr->next; if(p==NULL) { puts("链表为空"); return -1; } int count=1; while(p=p->next) { count++; } return count; } ```int NumOfSpecifiedData(int des_data,dou_link head_ptr)//计算链表中指定数据的数量(不包括头节点) { int count=0; dou_link p=head_ptr; if(p->next==NULL) { puts("链表为空"); return -1; } while(p=p->next) { if(p->data==des_data) { count++; } } return count; } ``` int insert2_midnode(int des_data,int newdata,dou_link head_ptr) { while(head_ptr->next==NULL) { puts("无法对指定位置插入数据,链表为空"); return -1; } int num_spe_data=NumOfSpecifiedData(des_data,head_ptr);//寻找目标数据在链表中的数量 if(num_spe_data==0) { puts("找不到指定数据"); return -1; } else { //创建对应数量的新节点 dou_link newnode_ptr[num_spe_data]; for(int i=0;i<num_spe_data;i++) { newnode_ptr[i]=creat_node(newdata); //printf("%p\n%d\n",newnode_ptr[i],newnode_ptr[i]->data); } //找到目标位置并插入数据 dou_link p=head_ptr->next; while(1) { int i=0; if(p->data==des_data&&p->next!=NULL) { newnode_ptr[i]->next=p->next; newnode_ptr[i]->prev=p; p->next=newnode_ptr[i]; newnode_ptr[i]->next->prev=newnode_ptr[i]; i++; p=p->next; } else if(p->data==des_data&&p->next==NULL) { newnode_ptr[i]->prev=p; p->next=newnode_ptr[i]; return 0; } p=p->next; if(p==NULL) return 0; } } } ```int main() { dou_link head_ptr=init_list();//初始化 for(int i=1;i<4;i++) { insert_tailnode(i,head_ptr); } insert_tailnode(2,head_ptr); PriDouList(head_ptr); int des_data,newdata; puts("输入目标节点数据和新节点数据"); scanf("%d%d",&des_data,&newdata); insert2_midnode(des_data,newdata,head_ptr); PriDouList(head_ptr); } 上面的代码希望指定一个数据,在链表中找到相同的数据节点,并往后插入一个数据,如果指定数据在链表中有多个,则插入相应数量的新节点。 情况:编译无报错,如果指定的数据在链表中只有一个,打印出的链表无误。如果有多个,打印出来的链表就死循环了。 弄了好久了,希望热心人帮忙解答,谢谢。
有序单链表的实现 C++
#include<iostream> using namespace std; struct Node { int data; Node *next; }; void insert(Node *&head,int num) { Node *s,*p,*q; s=new Node; s->data=num; s->next=NULL; if(head==NULL) { head=s; return; } if(head->data>s->data) { s->next=head; head=s; return; } for(q=head,p=head->next;p;q=p,p=p->next) if(p->data>s->data) { s->next=p; q->next=s; return; } q->next=s; return; } void ShowNode( Node *head) {cout<<"now the items of list are:"; while(head) { cout<<head->data<<" "; head=head->next;} cout<<endl; } void ReverseList(Node *head) { cout<<"now the change items of list are:"; Node *s,*p,*q; if(head==NULL||head->next==NULL) {return;} s=head->next; p=s->next; s->next=NULL; while(p) {q=s->next; p->next=s; s=p; p=q; head->next=s; cout<<head->data<<" "; head=head->next; }cout<<endl; } int main() { int k; Node *head=NULL; cin>>k; while(k!=0) {insert(head,k); cin>>k;} ShowNode(head); ReverseList(head); } 这是我的代码,有序输出可以用,但逆序输出元素就不成功。求大神,教改程序。
关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点
下面代码主要实现链表的创建,插入,删除,并且能将两个年龄递增链表进行合并成递减链表 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错。。功力不足实在解决不了。。跪求大神解答。。(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去。。我肉眼实在找不出来。。 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> int a[10]={0}; int c[10]={0}; char b[100][10]; char d[100][10]; typedef struct stuInfo { char stuName[10];/*学生姓名*/ int age; /*年龄*/ } ElemType; typedef struct node { ElemType data; struct node *next; }LNode,*ListPtr;/*定义结构*/ ListPtr List_Init(int a[],char b[][10],int n){/*链表载入数据*/ LNode *s,*h; int i; h=NULL; h=(LNode*)malloc(sizeof(LNode)); h->data.age=0; memset(h->data.stuName,0,10*sizeof(char)); h->next=NULL; for(i=n-1;i>=0;i--) { s=(LNode*)malloc(sizeof(LNode));/*分配内存*/ memset(s->data.stuName,0,10*sizeof(char)); s->data.age=a[i];/*把年龄载入*/ strcpy(s->data.stuName,b[i]);/*把名字载入*/ s->next=h->next;/*新的结点指向头节点的下一个结点*/ h->next=s;/*头结点指向新的结点*/ } return h; } ListPtr List_Insert (ListPtr h, ElemType x){/*结点插入*/ LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data.age=x.age; strcpy(s->data.stuName,x.stuName);/*分配空间结点载入*/ s->next=h->next;/*新的结点指向前一个结点的后一个结点*/ h->next=s;/*前一个结点指向新结点*/ return h; } void List_Destroy(ListPtr h,ListPtr L){ LNode *s,*p; s=L->next;/*指向第一个结点*/ p=s; while(s){/*寻找所要删除的数据结点的前一个结点*/ if(s->data.age==h->data.age&&strcmp(s->data.stuName,h->data.stuName)==0) break; p=s; s=s->next; } s=p->next;/*s指定要删除的结点*/ p->next=s->next;/*前一个结点指向所要删除结点的后一个结点*/ free(s); } ListPtr List_Merge(ListPtr La, ListPtr Lb){/*链表变换,使递增链表变为递减链表,并去重*/ LNode *s, *pa, *pb; pa=La->next; pb=Lb->next;/*各指向两个链表的头结点*/ La->next=NULL; while(pa!=NULL&&pb!=NULL){ if(pa->data.age<=pb->data.age){ s=pa->next; pa->next=La->next; La->next=pa; pa=s;/*如果pa指向的年龄比pb的小则保留并逆置,pa指针指向下一个数据*/ if(strcmp(pa->data.stuName,pb->data.stuName)==0){ pb=pb->next;/*如果pa和pb所指的是同一个人,则pb也指向下一个数据,避免重复*/ } } else{ s=pb->next; pb->next=La->next; La->next=pb; pb=s; }/*如果pb指向的年龄比pa的小,则插入到La链表中*/ } while(pa!=NULL){ s=pa->next; pa->next=La->next; La->next=pa; pa=s;}/*处理La未处理的数据*/ while(pb!=NULL){ s=pb->next; pb->next=La->next; La->next=pb; pb=s;}/*处理Lb未处理的数据*/ Lb->next=NULL; free(Lb);/*释放Lb*/ } void OutPut(ListPtr La){/*输出链表*/ LNode *s; s=La->next; while(s){ printf("%s\t%d\n",s->data.stuName, s->data.age); } } int main(){ ElemType x; int n,i,j; ListPtr La=NULL, Lb=NULL; LNode *p,*r; for(i=0;i<10;i++){ memset(b[i],0,10*sizeof(char)); memset(d[i],0,10*sizeof(char)); }/*初始化字符串数组*/ strcpy(b[0],"Levis");a[0]=22; strcpy(b[1],"Adam");a[1]=23; strcpy(b[2],"Lord");a[2]=26; strcpy(b[3],"Fred");a[3]=28; strcpy(b[4],"May");a[4]=30; strcpy(b[5],"York");a[5]=35; La=List_Init(a, b, 6); /*La数据载入*/ strcpy(d[0],"Yuki");c[0]=19; strcpy(d[1],"Soraru");c[1]=27; strcpy(d[2],"Katin");c[2]=29; strcpy(d[3],"Sinsan");c[3]=31; strcpy(d[4],"York");c[4]=35; Lb=List_Init(c, d, 5); /*Lb数据载入*/ printf("choose operation: 1. insert 2. delete 3.nothing: "); scanf("%d",&j); if(j==1){ printf("enter the student's name you want to insert:");/*插入数据操作*/ gets(x.stuName); printf("enter the student's age:"); scanf("%d",&x.age); p=La->next; while(p){/*查找La中是否有此人*/ if(strcmp(p->data.stuName,x.stuName)==0) break; p=p->next; } if(p=NULL){/*如果没则寻找插入位置*/ p=La->next;r=p; while (p){ if(x.age<=p->data.age) break; r=p; p=p->next;/*找到比它大的值后,r记录此结点的前一个结点*/ } List_Insert (r, x);/*在r后插入此数据结点*/ } else{ p=Lb->next;/*La中已有此人,则查找Lb*/ while(p){ if(strcmp(p->data.stuName,x.stuName)==0) break; p=p->next; } if(p=NULL){ p=Lb->next;r=p; while (p){ if(x.age<=p->data.age) break; r=p; p=p->next; } List_Insert (r, x);}}/*同La*/ if(p!=NULL){ printf("inserted fail");}/*如果两链表中已有此人,则表示插入失败*/ } if(j==2){ printf("enter the student's name you want to delete:");/*进行删除操作*/ gets(x.stuName); printf("which lianbiao do you choose, if La, input 1;Lb,input 2:");/*选择要插入的链表*/ scanf("%d",&i); if(i==1){ p=La->next; while(p){ if(strcmp(p->data.stuName,x.stuName)==0)/*查找La中此人的位置*/ break; p=p->next;/*移动到下一个结点*/ } if(p!=NULL){ List_Destroy(p,La);} else {printf("查无此人");}/*移动到下一个结点*/ } if(i==2){ p=Lb->next; while(p){ if(strcmp(p->data.stuName,x.stuName)==0) break; p=p->next; } if(p!=NULL){List_Destroy(p,Lb);} else {printf("查无此人");}}/*同La*/ } printf("now ranking......\n");/*显示递增合并为递减的信息*/ List_Merge(La, Lb); OutPut(La);/*输出函数*/ return 0; } ``` 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错。。功力不足实在解决不了。。跪求大神解答。。(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去。。我肉眼实在找不出来。。
关于c++实现单链表的问题
Link_List为基类,S_Link_List是继承的单链表,现在只写了单链表的创建和显示,求大佬帮帮忙 ``` #include<iostream> using namespace std; struct D_Node{ double data; D_Node *next; }; class Link_List{ public: Link_List(int num); //初始化节点个数 virtual void Create(D_Node *pHead)=0; //创建单链表 //virtual void D_Insert(double element,int n)=0; //插入节点 virtual void showNode(D_Node *pHead)=0; //显示链表 //virtual void getNode(D_Node *pHead)=0; //获取节点个数 protected: D_Node node; int num; }; Link_List::Link_List(int num){ this->num=num; } class S_Link_List:public Link_List{ //单链表 继承于Link_List public: S_Link_List(); S_Link_List(int num); D_Node *getHead(){ return pHead; } //获取头节点 virtual void Create(D_Node *pHead); virtual void showNode(D_Node *pHead); private: D_Node *pHead; }; S_Link_List::S_Link_List(int num):Link_List(num){ pHead=new D_Node; pHead->next=NULL; }; void S_Link_List::Create(D_Node *pHead){ D_Node *temp; D_Node *p; temp=pHead; for(int i=1;i<num;i++){ int a; p=new D_Node; cin>>a; p->data=a; p->next=NULL; temp->next=p; } temp->data=NULL; delete temp,p; } void S_Link_List::showNode(D_Node *pHead){ cout<<"pHead->"; D_Node *temp; temp=pHead; while(temp->next!=NULL){ temp=temp->next; cout<<temp->data<<"->"; } delete temp; cout<<endl; } int main(){ cout<<"下面创建单链表,请输入节点个数:"; int NO; cin>>NO; cout<<endl; S_Link_List list(NO); cout<<"请输入节点数据:"; list.Create(list.getHead()); cout<<endl<<"下面是创建的单链表:"<<endl; list.showNode(list.getHead()); system("pause"); return 0; } ```
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
立即提问