链表插入数据:为什么在成员函数insert中还要判断指针head是否为空指针?

在“list”这个类中的“list(){head=NULL}” 不是已经将“head”定义为空指针了吗?为什么在定义它的成员函数insert的时候还要判断是否为空指针?

class list
{
    node *head;
    public:
        list(){head=NULL;}
        void insertlist(int adata,int bdata);
        void deletelist(int adata);
        void outputlist();
        node *gethead(){return head;}
};
void list::insertlist(int adata,int bdata)
{
    node *q,*p,*s;
    s=(node*)new(node);
    s->data=bdata;
    p=head;
    if(head==NULL)
    {
        head=s;
        s->next=NULL;
    }
}

1个回答

因为head并非恒为空指针。
list(){head=NULL;} 执行构造函数之后的确是空指针了
但是执行insertlist之后,下一次再执行的时候就不是了
所以要判断

weixin_43599456
假装努力的菜鸡 噢懂了谢谢!
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
写了链表插入函数 主函数却没实现插入功能

#include<iostream> #include<stdlib.h> #include<cstdio> #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef int ElemType; typedef int Status; typedef struct LNode { ElemType data; //结点的数据域 struct LNode *next; //结点的指针域 }LNode,*Linklist; //Linklist为指向结构体LNode的指针类型 void CreateList_R(Linklist &L,int n) //正位序输入n个元素的值,建立带表头结点的单链表L { int i; LNode *p,*r; L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 L->next=NULL; //先建立一个带头结点的空链表 r=L; //尾指针r指向头节点 for(i=0;i<n;++i) { p=new LNode; //生成新结点 cin>>p->data; //输入元素值赋给新结点*p的数据域 p->next=NULL; r->next=p; //将新结点*p插入尾结点*r之后 r=p; //r指向新的尾结点*p } } void ListOutput(Linklist L) //输出链表 { LNode *p; p=L->next; while (p != NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } Status ListInsert(Linklist &L,int i,ElemType e) //在带头结点的单链表L中第i个位置插入值为e的新结点 { LNode *p,*r; int j; p=L; j=0; while(p && (j<i-1)) { p=p->next; ++j; //查找第i-1个结点,p指向该节点 } if(!p||j>i-1) return ERROR; //i>n+1或i<1 r=new LNode; //生成新结点*m r->data=e; //将结点*m的数据域置为e r->next=p->next; //将结点*m的指针域指向结点ai p->next=r; //将结点*p的指针域指向结点m return OK; } void nizhi(Linklist &L) { LNode *s,*q; q=L->next; L->next=NULL; ////将链表断开分成两个链表,第二个链表不带头结点,q是头指针 while(q!=NULL) { s=q; //摘下第二个链表的首结点,使s指向它 q=q->next; s->next=L->next; //将结点*s头插到链表L中 L->next=s; } } int main() { Linklist L; ElemType e; int n; int i; cout<<"输入数据个数:"<<endl; cin>>n; cout<<endl; cout<<"输入链表:"<<endl; CreateList_R(L,n); cout<<"插入前的链表:"<<endl; ListOutput(L); cout<<endl<<"插入数据:"; cin>>e; ListInsert(L,i,e); cout<<"插入后的线性表:"<<endl; ListOutput(L); cout<<"逆置:"<<endl; nizhi(L); ListOutput(L); } ``` ```

链表的插入 插入函数写好了 在main函数中调用 然而最后的结果并没有实现插入的功能

struct Link *InsertNode01(struct Link *head,int nodeData,int i) { int j=1; struct Link *pr = head, *p, *temp = NULL; p = (struct Link *)malloc(sizeof(struct Link)); if(p == NULL) { printf("NO enough memory"); exit(0); } p->next = NULL;//置新节点的指针域为空 p->data = nodeData;//为新节点赋数据域的值 if(head == NULL)//插入新节点前,对原链表的一个判断,不同情况插入的方法不同 { head = p; } else { if(i = 1) { p->next = head; head = p; } else { while(j < i && pr->next != NULL) { temp = pr; pr = pr->next; j++; } if(j = i) { pr = temp; p->next = pr->next; pr->next = p; } else { pr -> next = p; } } } return(head); }; ``` ``` ![图片说明](https://img-ask.csdn.net/upload/201605/21/1463788763_873714.png) ``` int main() { int i = 0; int place = 0; int nodeData; char c; struct Link *head = NULL;//指向链表头 printf("Do you want to append a new node(Y/N)"); scanf(" %c",&c); while(c=='Y' || c=='y') { head = AppendNode(head); DispLink(head);//显示当前各节点信息 printf("Do you want to append a new node(Y/N)"); scanf(" %c",&c); i++; } printf("%d new nodes have been appended!\n",i); printf("please input the nodeData you want to delete:"); scanf("%d",&nodeData); DeleteNode(head,nodeData); DispLink(head); printf("please input the nodeData you want to insert:"); scanf("%d",&nodeData); printf("输入插入的位置"); scanf("%d",&place); InsertNode01(head,nodeData,place); DispLink(head); //InsertNode(head,nodeData); //DeleteMemory(head);//释放分配内存 return 0; } ```

用C语言完成以下功能:数据的录入、显示,链表的创建,插入数据,删除数据。每个功能用一个函数来实现。

1)定义家庭住址结构体adress,包含成员有:省份、城市、街道;定义成绩结构体score,包含成员有:“C程序设计”、“Java程序设计”、“Basic成绩设计”的成绩;再定义学生结构体student,包含的成员有:学号、姓名、性别、成绩、家庭住址、下一个结点指针,其中成绩类型定义为score类型的结构体,家庭住址的类型定义为adress结构体。下一个结点指针的类型定义为学生结构体。 2)定义头结点的结构体head,其成员为指向学生结构体的指针。 3)插入数据时学号要按照升序排列。

C语言链表插入操作,一个函数

Description 已知线性表中元素为整数,且按照升序排列。编写算法实现在线性表中查找值为x的元素,如果查找成功,返回1;否则,返回0,并且把x插入到正确的位置,使线性表仍按升序排列。 依次输出调用查找插入算法后的线性表中的元素。 提示:存储结构采用代表头结点的循环单链表,结点结构如下: typedef struct Node { int data; struct Node *next; }LNode,*LinkList; 要求: (1)编写函数建立循环单链表CreateLinkList(int n),函数返回值类型为LinkList。 LinkList CreateLinkList(int n) { /*按照升序输入n个整数,建立带表头结点的循环单链表*/ } (2) 编写查找函数QueryLinkList(LinkList *L,int x)实现查找并插入功能,函数返回值类型int。 int QueryLinkList(LinkList *L,int x) { /*查找值为x的元素,若查找成功返回1,否则返回0,并把x插入到相应的位置。*/ } (3)编写函数Display(LinkList L),输出线性表中的元素。 (4)main函数调用QueryLinkList()函数,输出查找结果,然后调用Display函数依次输出线性表中的元素。 Input 输入元素个数n 依次输入n个升序排列的整数 输入带查找的元素值x Output 输出查找结果1或者0 依次输出线性表中的元素值 Sample Input sample 1: 6 2 5 8 10 12 16 10 sample2: 6 2 5 8 10 12 16 9 Sample Output sample 1: 1 2 5 8 10 12 16 sample2: 0 2 5 8 9 10 12 16

如图,为什么单链表初始化需要二级指针,而单链表的插入操作不用二级指针?

# 如图![图片说明](https://img-ask.csdn.net/upload/202003/04/1583291800_270710.png),创建单链表时形参head设计成二级指针类型,是因为要改变头指针指向(对吗?)。 # 而单链表的插入操作同样需要改变指针指向,为什么不需要用二级指针?![图片说明](https://img-ask.csdn.net/upload/202003/04/1583292134_425883.png) # 是因为不需要改变头指针指向所以不用传址吗? # 下面这个问题就显示了我的彻底混乱:那为什么插入操作函数里面的指针P改变了指向却不用定义为二级指针类型(这么说对吗)?![图片说明](https://img-ask.csdn.net/upload/202003/04/1583292489_129307.png) # 本来在链表之前我还是会用指针的,一到链表,还加了个二级指针,我就懵了。问题也很混乱,希望有大佬能指导一下。

为什么建立链表一定要用new指针

为什么建立链表一定要用new指针,不用new为什么不行……………………

c语言链表指针的指针问题

想问一下那个插入函数的类型是结构体指针的指针,输入参数是一个空指针的地址,有没有大神解释一下这个函数如何使用的呢? 还有就是如果直接用结构体指针函数,应该如何改能实现一样的功能 //学生结构体,包含数据:学号、姓名、性别、毕业学校、初试分数、复试分数 //按照学号递增插入信息 //按照学生姓名查询学号和成绩 #include <stdio.h> #include <stdlib.h> #include <string.h> // 数组结构体 typedef struct Node { int num; char name[20]; char sex[10]; char graduate_scholl[20]; int initial_score; int re_score; struct Node *next; }NODE , *PNODE; //NODE为结构体变量名,指向结构的指针 /* 相当于 typedef struct Node { ...... }NODE; //使用typedef关键字用一个单词NODE代替struct TreeNode,并定于指向该结构体类型的指针PNODE: NODE *PNODE; */ /** * 插入数字 * @param ** head 头指针地址 * @param int value 插入的数值 * @return void */ PNODE * insertValue(PNODE*head); /** * 打印数组 * @param * head 头指针 * @return void */ void printfValue(PNODE head); void check(PNODE head);//查询函数 int main(void) { PNODE head = NULL; int index; do { printf("是否录入学生数据?(0否/1是):"); scanf("%d", &index); if (index == 1) { insertValue(&head);//这里为何要这样取空指针 printf("\n\n"); printfValue(head); } } while (index == 1); check(head); return 0; } PNODE *insertValue(PNODE *head) //就是这个函数 看了好几天都没太懂 { PNODE previous = NULL; // 前一个指向地址 PNODE current = *head; // 当前指向地址 PNODE pNew = (PNODE )malloc(sizeof( NODE)); if (pNew == NULL) { printf("申请内存失败"); exit(1); } else { printf("请输入学生学号:"); scanf("%d",&pNew->num); printf("请输入学生姓名:"); scanf("%s",pNew->name); printf("请输入学生性别:"); scanf("%s",pNew->sex); printf("请输入学生毕业学校:"); scanf("%s",pNew->graduate_scholl); printf("请输入学生初试分数:"); scanf("%d",&pNew->initial_score); printf("请输入学生复试分数:"); scanf("%d",&pNew->re_score); } // currnt 不为 NULL => 数组有值 // current的值 < 待插入的值 => 转到下一个指向地址,并把当前地址存入previous。 while (current != NULL && current -> num < pNew -> num) { previous = current; //往后遍历,直到插入的值不大于当前的数 current = current -> next; } // 下一个地址内的值 > 待插入的值 => 待插入的值插入previous和current之间 pNew -> next = current; if (previous == NULL) { // previous == NULL 说明没有执行遍历循环 // 头插法 *head = pNew; } else { // previous(next) -> pNew(next) -> current previous -> next = pNew;//待插入的值插入previous之后 } return head; } void check(PNODE head) { char temp[10]; PNODE p=head; if(NULL == p) { printf("未录入信息,信息查询失败!"); } else { printf("请输入需要查询考生姓名:"); scanf("%s",temp) ; } while(p != NULL) { if(!strcmp(p->name,temp)) { printf("\n考生姓名为:%s的信息如下:\n",p->name); printf("该学生的学号为:%d\n",p->num); printf("该考生的初试成绩为:%d\n",p->initial_score); printf("该考生的复试成绩为:%d\n",p->re_score); break; } p = p->next; } } void printfValue(PNODE head) { PNODE current = head; while (current != NULL) { printf("学号:%d\n",current->num); printf("姓名:%s\n",current->name); printf("性别:%s\n",current->sex); printf("毕业学校:%s\n",current->graduate_scholl); printf("初试分数:%d\n",current->initial_score); printf("复试分数:%d\n",current->re_score); printf("\n"); current = current -> next; } printf("\n"); }

以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用?

#include <iostream> using namespace std; typedef struct Node { int age; struct Node* next; }LIST; void addList1(LIST* pHead,int x)//链表结尾加节点 { LIST* pM=new LIST();//新节点 pM->age=x; pM->next=NULL; if(pHead==NULL) { cout<<"List is NULL"<<endl; cout<<"Creat New List"<<endl; pHead=new LIST();//重新分配内存,头节点 pHead->age=0; pHead->next=pM; } else { LIST* pCur=pHead->next;//当前节点 while(pCur!=NULL) { pCur=pCur->next; } pCur=pM; } } LIST* CreatList1()//创建节点 { int data=0; LIST* Phead=NULL; LIST* Pm=NULL; LIST* Pcur=NULL; cout<<"Enter your data of node (-1 quit):"; scanf("%d", &data); if(data!=-1) { Phead=(LIST*)malloc(sizeof(LIST)); Phead->age=0; Phead->next=NULL; Pcur=Phead; } while (data!=-1) { Pm=new LIST(); Pm->age=data; Pm->next=NULL; Pcur->next=Pm; Pcur=Pcur->next; cout<<"Enter your data of node (-1 quit):"; cin>>data; } return Phead; } void ListOut1(LIST* Phead)//输出节点 { LIST* p=NULL; if(Phead==NULL) { cout<<"List is NULL\n"; } else { p=Phead->next; while(p!=NULL) { cout<<p->age<<endl; p=p->next; } } } void main() { LIST* p1=CreatList1(); ListOut1(p1); addList1(p1,100); //当输入链表为空时,初始化链表 ListOut1(p1); //此时输出为空? 为什么? 我不是在初始化时在堆中分配的内存 不是可以用吗? system("pause"); }

C语言链表插入问题 插入节点到头节点之前去 遍历后发现只能显示插入的那个节点。

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> struct student{ char name[10]; struct student *next; }; struct student *charu(struct student *p) { struct student *current; struct student *insert; int a; insert=(struct student*)malloc(sizeof(struct student)); char name[10]; printf("请输入你要插入的位置:"); scanf("%d",&a); printf("请输入要插入的字符:\n"); scanf("%s",name); getchar(); strcpy(insert->name,name); current=p; if(a>0) {} else if(a==0) {insert->next=current; p=insert; } return p; } void main() { struct student *head,*non,*end; char str[10],i,j; int a; head=(struct student*)malloc(sizeof(struct student)); printf("请输入名字:\n"); scanf("%s",str); getchar(); strcpy(head->name,str); printf("是否要继续输入:"); scanf("%c",&i); non=head; while(i!='n') { end=(struct student*)malloc(sizeof(struct student)); printf("请输入名字:\n"); scanf("%s",str); getchar(); strcpy(end->name,str); non->next=end; non=end; printf("是否要继续输入:"); scanf("%c",&i); } non->next=NULL; while(head!=NULL) {printf("%s\n",head->name);head=head->next;} getchar(); printf("你是否要插入字符:"); scanf("%c",&j); if(j=='y') { head=charu(head); printf("插入后的链表为:\n"); while(head!=NULL) {printf("%s\n",head->name);head=head->next;} } } 我插入一个节点第0个位置 就是头结点那个位置 插入完了以后遍历只能显示出第一个节点 这是怎么回事啊请教各位!!

线性链表数据结构的插入与删除

在你自己的文件下,建立一个C语言程序SL.C,完成下列要求: 1、 定义长度为10的数组,输入9个数据(1,3,4,5,7,9,12,20,28),然后输出这九个数组元素的存储单元地址和相应的数值; 2、 建立一个数组元素的插入函数,能够按照数据从小到大的次序自动找到插入位置完成插入元素的操作,调用此函数插入数据15,然后输出数值元素的存储单元地址和相应的数值; 3、 建立一个数组元素的删除函数,能够按照数据自动删除指定元素的操作,调用此函数删除数据值为9的数组元素,然后输出数组元素的存储单元地址和相应的数值。 在你自己的文件下,建立一个C语言程序LL.C,完成下列要求: 4、 定义一个单链表LLIST,按数据1,3,4,5,7,9,12,20,28的次序建立各结点,形成单链表LLIST,然后按链表顺序输出九个结点的存储单元地址和相应的数值; 5、 建立一个插入函数,将数据15作为结点按照从小到大的次序自动插入到链表的相应位置上,完成插入结点的操作,形成新的链表LLIST,然后输出链表结点的存储单元地址和相应的数值; 6、 建立一个删除函数,将链表中第七个结点删除,形成新的链表LLIST,然后输出链表结点的存储单元地址和相应的数值;

数据结构中的线性表中的指针使用

数据结构 单链表 类型定义: typedef struct lnode { elemtype data; struct lnode *next; }Lnode, *LinkList; int InitList(LinkList *L)//构造一个空的线性表L { 构造一个空的线性表L *L=(LinkList)malloc(sizeof(struct LNode)); if(!*L) /* 存储分配失败 */ exit(OVERFLOW); (*L)->next=NULL; /* 指针域为空 */ return OK; } int ListInsert(LinkList L,int i,ElemType e) //在带头结点的单链线性表L中第i个位置之前插入元素e { int j=0; LinkList p=L,s; while(p&&j<i-1) /* 寻找第i-1个结点 */ { p=p->next; j++; } if(!p||j>i-1) /* i小于1或者大于表长 */ return ERROR; s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */ s->data=e; /* 插入L中 */ s->next=p->next; p->next=s; return OK; } void main() { LinkList L; ElemType e; int i; int j; i=InitList(&L); for(j=1;j<=10;j++) ListInsert(L,j,j); } 在类型定义中linklist已经是指向节点的指针了,为什么在构造一个空的线性表L的函数int InitList(LinkList *L) 中形参为LinkList *L(即L为指向指针的指针),而不是LinkList L????linklist作为一个指针也可以操作链表的呀!!! 在链表插入函数int ListInsert(LinkList L,int i,ElemType e)中,形参为什么却变成了LinkList L??? 在main函数中定义的是指针变量LinkList L; 为何不定义成Lnode L???? 什么时候该用LinkList *L,什么时候该用LinkList L,什么时候该用Lnode L?????它们的区别是什么????望大神详细回答,感激万分!!!

编程题 ⑴ 创建一个链表,每个链表结点包括2个成员?

66. 编程题 ⑴ 创建一个链表,每个链表结点包括2个成员:1个整数和1个next指针,要求每个节点的整数成员从键盘输入整数值,当输入0表示数据输入结束; ⑵ 输出链表中每个结点的数据成员的值。 要求使用typedef机制给结点的结构体类型起一个简短的类型名字,并使用这个短类型名来定义变量。 请认真测试程序的正确性。将源代码以文本方式提交,不要直接提交文件。

在单链表中统计某区域内的元素,将获得元素插入新单链表,并打印新链表元素在原链表中的序号

注:一道题写一个子函数,由主函数调用;在子函数里不能调用书上的函数。 1、 在一个带头结点的单链表中,头指针为h,编写算法CountItems (),统计所有数据域大于min,而小于max的元素,将所得元素插入一个新的单链表,新链表的头指针为s,最终输出范围内统计的元素数目,遍历新链表,并且打印出新链表元素在原链表中的序号。

链表中按顺序插入的操作用C语言实现的结果不对

listnodep insert_mid(listnodep head, listnodep newnode) //按排序顺序进行链表的建立 { if (head == NULL) head = newnode; listnodep temp = head; listnodep pre; while (temp->nextptr != NULL) { if (newnode->data > temp->data) { pre = temp; temp = temp->nextptr; } else break; } pre->nextptr = newnode; newnode->nextptr = temp; return head; } 这是我刚刚写的一个调用函数,实现的功能:按升序顺序进行链表排列;传入的参数:指向链表的头指针,要插入新的结点; 但是没有达到想要实现的功能,请大神赐教

链表问题,这一句为什么是二级指针

#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ Status visit(ElemType c) { printf("%d ",c); return OK; } typedef struct Node { ElemType data; struct Node *next; }Node; typedef struct Node *LinkList; /* 定义LinkList */ /* 初始化顺序线性表 */ Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ if(!(*L)) /* 存储分配失败 */ return ERROR; (*L)->next=NULL; /* 指针域为空 */ return OK; } /* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ Status ListEmpty(LinkList L) { if(L->next) return FALSE; else return TRUE; } /* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ Status ClearList(LinkList *L) { LinkList p,q; p=(*L)->next; /* p指向第一个结点 */ while(p) /* 没到表尾 */ { q=p->next; free(p); p=q; } (*L)->next=NULL; /* 头结点指针域为空 */ return OK; } /* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ int ListLength(LinkList L) { int i=0; LinkList p=L->next; /* p指向第一个结点 */ while(p) { i++; p=p->next; } return i; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:用e返回L中第i个数据元素的值 */ Status GetElem(LinkList L,int i,ElemType *e) { int j; LinkList p; /* 声明一结点p */ p = L->next; /* 让p指向链表L的第一个结点 */ j = 1; /* j为计数器 */ while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */ { p = p->next; /* 让p指向下一个结点 */ ++j; } if ( !p || j>i ) return ERROR; /* 第i个元素不存在 */ *e = p->data; /* 取第i个元素的数据 */ return OK; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */ /* 若这样的数据元素不存在,则返回值为0 */ int LocateElem(LinkList L,ElemType e) { int i=0; LinkList p=L->next; while(p) { i++; if(p->data==e) /* 找到这样的数据元素 */ return i; p=p->next; } return 0; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */ /* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */ Status ListInsert(LinkList *L,int i,ElemType e) { int j; LinkList p,s; p = *L; j = 1; while (p && j < i) /* 寻找第i个结点 */ { p = p->next; ++j; } if (!p || j > i) return ERROR; /* 第i个元素不存在 */ s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */ s->data = e; s->next = p->next; /* 将p的后继结点赋值给s的后继 */ p->next = s; /* 将s赋值给p的后继 */ return OK; } /* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */ /* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */ Status ListDelete(LinkList *L,int i,ElemType *e) { int j; LinkList p,q; p = *L; j = 1; while (p->next && j < i) /* 遍历寻找第i个元素 */ { p = p->next; ++j; } if (!(p->next) || j > i) return ERROR; /* 第i个元素不存在 */ q = p->next; p->next = q->next; /* 将q的后继赋值给p的后继 */ *e = q->data; /* 将q结点中的数据给e */ free(q); /* 让系统回收此结点,释放内存 */ return OK; } /* 初始条件:顺序线性表L已存在 */ /* 操作结果:依次对L的每个数据元素输出 */ Status ListTraverse(LinkList L) { LinkList p=L->next; while(p) { visit(p->data); p=p->next; } printf("\n"); return OK; } /* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */ void CreateListHead(LinkList *L, int n) { LinkList p; int i; srand(time(0)); /* 初始化随机数种子 */ *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; /* 先建立一个带头结点的单链表 */ for (i=0; i<n; i++) { p = (LinkList)malloc(sizeof(Node)); /* 生成新结点 */ p->data = rand()%100+1; /* 随机生成100以内的数字 */ p->next = (*L)->next; (*L)->next = p; /* 插入到表头 */ } } /* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */ void CreateListTail(LinkList *L, int n) { LinkList p,r; int i; srand(time(0)); /* 初始化随机数种子 */ *L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */ r=*L; /* r为指向尾部的结点 */ for (i=0; i<n; i++) { p = (Node *)malloc(sizeof(Node)); /* 生成新结点 */ p->data = rand()%100+1; /* 随机生成100以内的数字 */ r->next=p; /* 将表尾终端结点的指针指向新结点 */ r = p; /* 将当前的新结点定义为表尾终端结点 */ } r->next = NULL; /* 表示当前链表结束 */ } int main() { LinkList L; ElemType e; Status i; int j,k; i=InitList(&L); printf("初始化L后:ListLength(L)=%d\n",ListLength(L)); for(j=1;j<=5;j++) i=ListInsert(&L,1,j); printf("在L的表头依次插入1~5后:L.data="); ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L)); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); i=ClearList(&L); printf("清空L后:ListLength(L)=%d\n",ListLength(L)); i=ListEmpty(L); printf("L是否空:i=%d(1:是 0:否)\n",i); for(j=1;j<=10;j++) ListInsert(&L,j,j); printf("在L的表尾依次插入1~10后:L.data="); ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L)); ListInsert(&L,1,0); printf("在L的表头插入0后:L.data="); ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L)); GetElem(L,5,&e); printf("第5个元素的值为:%d\n",e); for(j=3;j<=4;j++) { k=LocateElem(L,j); if(k) printf("第%d个元素的值为%d\n",k,j); else printf("没有值为%d的元素\n",j); } k=ListLength(L); /* k为表长 */ for(j=k+1;j>=k;j--) { i=ListDelete(&L,j,&e); /* 删除第j个数据 */ if(i==ERROR) printf("删除第%d个数据失败\n",j); else printf("删除第%d个的元素值为:%d\n",j,e); } printf("依次输出L的元素:"); ListTraverse(L); j=5; ListDelete(&L,j,&e); /* 删除第5个数据 */ printf("删除第%d个的元素值为:%d\n",j,e); printf("依次输出L的元素:"); ListTraverse(L); i=ClearList(&L); printf("\n清空L后:ListLength(L)=%d\n",ListLength(L)); CreateListHead(&L,20); printf("整体创建L的元素(头插法):"); ListTraverse(L); i=ClearList(&L); printf("\n删除L后:ListLength(L)=%d\n",ListLength(L)); CreateListTail(&L,20); printf("整体创建L的元素(尾插法):"); ListTraverse(L); return 0; } Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ if(!(*L)) /* 存储分配失败 */ return ERROR; (*L)->next=NULL; /* 指针域为空 */ return OK; } 形参改写成LinkLis L 传递实参写成InitList(La); 实现的初始化操作没什么区别把 为什么要用二级指针呢, 统一成一级指针不好吗?

【小白】数据结构链表插入结点时左右连接顺序问题

在一个双向链表中,p是中间某个结点,,在p后插入s的语句序列为什么不可以调换顺序?比如图中的1 2两句调换位置会有什么问题?![图片](https://img-ask.csdn.net/upload/201510/27/1445912686_183105.jpg)

c语言链表插入节点出错,不知道插入函数错在哪一步

#include<stdio.h> #include<stdlib.h> #include<string.h> struct date { int year; int month; int day; }; struct student { int num; char name[10]; int score[2]; struct date birth; struct student *pnext; }; int icount; struct student *create() { struct student *phead=NULL; struct student *pnew,*pend; icount=0; printf("please input the information:\n"); pend=pnew=(struct student*)malloc(sizeof(struct student)); scanf("%d",&pnew->num); scanf("%s",pnew->name); scanf("%d,%d",&pnew->score[0],&pnew->score[1]); scanf("%d,%d,%d",&pnew->birth.year,&pnew->birth.month,&pnew->birth.day); while(pnew->num!=0) { icount++; if(icount==1) { pnew->pnext=phead; pend=pnew; phead=pnew; } else { pnew->pnext=NULL; pend->pnext=pnew; pend=pnew; } printf("please input the information:\n"); pend=pnew=(struct student*)malloc(sizeof(struct student)); scanf("%d",&pnew->num); scanf("%s",pnew->name); scanf("%d,%d",&pnew->score[0],&pnew->score[1]); scanf("%d,%d,%d",&pnew->birth.year,&pnew->birth.month,&pnew->birth.day); } free(pnew); return phead; } struct student *Insert(struct student *phead) { struct student *ptemp,*pnew; int i=1,n; ptemp=phead; printf("please enter the location you want to insert:\n"); scanf("%d",&n); while((n<0)||(n>icount)) { printf("input error,please reinput:\n"); scanf("%d",&n); } while(i<n) { ptemp=ptemp->pnext; i++; } printf("please input the information:\n"); pnew=(struct student*)malloc(sizeof(struct student)); scanf("%d",&pnew->num); scanf("%s",pnew->name); scanf("%d,%d",&pnew->score[0],&pnew->score[1]); scanf("%d,%d,%d",&pnew->birth.year,&pnew->birth.month,&pnew->birth.day); pnew->pnext=ptemp->pnext; ptemp->pnext=pnew; icount++; return phead; } void Print(struct student *phead) { struct student *ptemp; int j=1; ptemp=phead; printf("there are all %d students' information:\n",icount); while(ptemp!=NULL) { printf("this is the NO.%d students' information:\n",j); printf("number:%d\n",ptemp->num); printf("name:%s\n",ptemp->name); printf("Maths:%d,Chinese:%d\n",ptemp->score[0],ptemp->score[1]); printf("birthday--year:%d,month:%d,day:%d\n",ptemp->birth.year,ptemp->birth.month,ptemp->birth.day); ptemp=ptemp->pnext; j++; } } int main() { struct student *p; p=create(); p=Insert(p); Print(p); return 0; }

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

事情是这样的,今天刷剑指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)

链表一遇到OutPut函数程序就停止运行

初学《数据结构与算法》链表,不知道代码哪里有问题,代码编译和运行都没有问题,但是一遇到OutPut函数程序就停止运行了,选取了一部分代码,求大神解决。 ``` #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef int Status; typedef struct lnode { ElemType data; struct lnode*next; }LNode; void CreateList(LNode*L,int n) { int i; LNode*p; L=malloc(sizeof(LNode)); L->next=NULL; printf("请连续输入%d个元素:",n); for(i=n;i>0;i--) { p=malloc(sizeof(LNode)); scanf("%d",&p->data); p->next=L->next; L->next=p; } }//逆位序建表 void OutPut(LNode*L) { LNode *p=L->next; if(L->next==NULL) printf("该链表为空!"); else { while(p) { printf("%d\t",p->data); p=p->next; } } } void main() { LNode la; int length; printf("请输入链表la长度:"); scanf("%d",&length); CreateList(&la,length); printf("该链表的元素有:"); OutPut(&la); } ``` ![图片说明](https://img-ask.csdn.net/upload/202005/12/1589296144_91935.png)

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

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

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

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

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

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

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

抖音上很火的时钟效果

反正,我的抖音没人看,别人都有几十万个赞什么的。 发到CSDN上来,大家交流下~ 主要用到原生态的 JS+CSS3。 具体不解释了,看注释: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Title&lt;/tit...

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

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

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

手机经常收到"回复TD退订",回还是不回?今天总算是弄清楚了

自从有了微信和QQ,手机短信几乎很少再用了,但是我们手机里面还是经常会收到"回复TD退订"的消息,那到底要不要回复呢?今天就来告诉大家! 信息内容可能包括 推销信息 品牌活动日的时候,会根据你的用户浏览信息,或者购买记录,后续发送一些降价消息。 但是笔者想说我是缺那10块钱的人嘛,我缺的是1000块。 垃圾信息 虽然我们已经不经常用短信功能,但是还是有不少...

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

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

面试官问我:如何加载100M的图片却不撑爆内存

还记得当年面试一个面试官问我怎么加载巨图才能不撑爆内存,我没回答上来,他说分片显示,我寻思特么分片能减少内存使用??现在可以打他脸了! 内容扩展 1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 2.内存中如果加载一张 500*500 的 png 高清图片.应该是占用多少的内存? 3.Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM? A...

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

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

又出事了?网站被攻击了?高中生?

北京时间2020年3月27日9点整,如往常一样来到公司,带开电脑,正准备打开Github网站看一会源代码,再开始手头的工作。哟吼,一直打不开,一直出现如下页面: 我想很多网友也尝到了甜头,各大技术群炸开了锅,据网友反馈有攻击者正在发起大规模的中间人挟持,京东和Github等网站等网站都受到了影响。 什么是中间中间人挟持呢? 简而言之,就是攻击者在数据网络传输的过程中,截获传输过程中的数据并篡改...

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

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

培训班出来的人后来都怎么样了?(二)

接着上回说,培训班学习生涯结束了。后面每天就是无休止的背面试题,不是没有头脑的背,培训公司还是有方法的,现在回想当时背的面试题好像都用上了,也被问到了。回头找找面试题,当时都是打印下来天天看,天天背。 不理解呢也要背,面试造飞机,上班拧螺丝。班里的同学开始四处投简历面试了,很快就有面试成功的,刚开始一个,然后越来越多。不知道是什么原因,尝到胜利果实的童鞋,不满足于自己通过的公司,嫌薪水要少了,选择...

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

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

6年开发经验女程序员,面试京东Java岗要求薪资28K

写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她.来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源...

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

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

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

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

工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

近日,有网友在某职场社交平台吐槽,自己裸辞两个月了,但是找工作却让自己的心态都要崩溃了,全部无果,不是已查看无回音,就是已查看不符合。 “工作八年,两年一跳,裸辞两个月了,之前月薪60K,最近找工作找的心态崩了!所有招聘工具都用了,全部无果,不是已查看无回音,就是已查看不符合。进头条,滴滴之类的大厂很难吗???!!!投简历投的开始怀疑人生了!希望 可以收到大厂offer” 先来看看网...

推荐9个能让你看一天的网站

分享的这9个保证另你意外的网站,每个都非常实用!非常干货!毫不客气的说,这些网站最少值10万块钱。 利用好这些网站,会让你各方面的技能都得到成长,不说让你走上人生巅峰,但对比现在的你,在眼界、学识、技能方面都有质的飞跃。 一、AIRPANO 传送门:https://www.airpano.com/360photo_list.php 这是一个可以躺在家里,就能环游世界的神奇网站。 世界那么大,绝大多...

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

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

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

月薪22K程序员,打卡迟到10次,收到工资短信一脸懵逼

每家公司为了保证公司员工每天的工作时间,一般都会采用上下班打卡的工作制度,这其实是一个很常见的是,本身也没有什么问题的。正所谓无规矩不成方圆,公司肯定是有公司的规矩,虽然每个员工都很不喜欢这些规矩来束缚我们,但是公司也只是为了能更好的管理员工。但是一家公司如果一成不变的使用打卡制度,而不会去变通管理,也真不一定是好事。 打卡制度特别对于销售部门来说,不但会让公司发展不起来,还很容易丢失员工。但如...

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

什么是a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站?00后的世界我不懂!

A站 AcFun弹幕视频网,简称“A站”,成立于2007年6月,取意于Anime Comic Fun,是中国大陆第一家弹幕视频网站。A站以视频为载体,逐步发展出基于原生内容二次创作的完整生态,拥有高质量互动弹幕,是中国弹幕文化的发源地;拥有大量超粘性的用户群体,产生输出了金坷垃、鬼畜全明星、我的滑板鞋、小苹果等大量网络流行文化,也是中国二次元文化的发源地。 B站 全称“哔哩哔哩(bilibili...

十个摸鱼,哦,不对,是炫酷(可以玩一整天)的网站!!!

文章目录前言正文**1、Kaspersky Cyberthreat real-time map****2、Finding Home****3、Silk – Interactive Generative Art****4、Liquid Particles 3D****5、WINDOWS93****6、Staggering Beauty****7、Ostagram图片生成器网址****8、全历史网址*...

我真的错了,我被跳槽后的高薪冲昏了头脑...

国内疫情已接近尾声,疫情对生活各个方面造成的影响,就是一场真实的“蝴蝶效应”。“全球最大安全套制造商因疫情停产,已造成一亿个安全套缺口”“口罩印钞机,月入千万的暴富神话”“百程旅行...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

​能让德国人放弃现金支付​,也没谁了

在新冠疫情中,德国人越来越多地选择在超市,加油站或其他商店付款时使用非接触式付款方式。德国信贷协会Deutschen Kreditwirtschaft (DK) 的一位发言人告诉德国新...

相关热词 c# 按行txt c#怎么扫条形码 c#打包html c# 实现刷新数据 c# 两个自定义控件重叠 c#浮点类型计算 c#.net 中文乱码 c# 时间排序 c# 必备书籍 c#异步网络通信
立即提问