写了链表插入函数 主函数却没实现插入功能

#include
#include
#include

#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 {
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<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 {
p=p->next;
++j; //查找第i-1个结点,p指向该节点
}
if(!p||j>i-1)
return ERROR; //i>n+1或i 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<<"输入数据个数:"< cin>>n;
cout< cout CreateList_R(L,n);
cout ListOutput(L);
cout cin>>e;
ListInsert(L,i,e);
cout<<"插入后的线性表:"<<endl;
ListOutput(L);
cout<<"逆置:"<<endl;
nizhi(L);
ListOutput(L);
}


c++

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
链表的插入 插入函数写好了 在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++问题,实现双向循环链表的插入删除等基本功能,以及构造函数和析构函数

谢谢各位师哥师姐,么么哒 这是 节点定义 template <class T> struct DoubleNode { T data; DoubleNode<T> *right; DoubleNode<T> *left; DoubleNode() {} DoubleNode(const T& data) {this->data = data;} DoubleNode(const T& data, DoubleNode<T>* right,DoubleNode<T>* left) {this->data = data; this->right = right; this->left = left;} }; 类的定义 template<class T> //类的声明 class HDoubleCircular { public: HDoubleCircular() {}//构造函数不会写 ~HDoubleCircular();//析构函数不会 bool IsEmpty() const {return head->right == head;} int Length() const; bool Find(int k, T& x) const; T Get(int k)const; int Indexof(const T& x) const; int Search(const T& x) const; HDoubleCircular<T>& Delete(int k); HDoubleCircular<T>& Insert(int k, const T& x); void Output(ostream& out) const; private: DoubleNode<T> *head; int size };

用函数怎么给链表分配内存?

因为我身边也没有什么太会的人,上网查的也没有写得详细; 最近刚好在做链表的题目,所以把问题整理出来,希望有人看到能帮我解答一下; 首先你们先看看这三张图 > ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200303193328834.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTcyOTIxMg==,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200303193341877.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTcyOTIxMg==,size_16,color_FFFFFF,t_70)![在这里插入图片描述](https://img-blog.csdnimg.cn/20200303193350835.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTcyOTIxMg==,size_16,color_FFFFFF,t_70) **问题一**:我在GCC的编译器写了像图三一样的代码,有了这样的提示," data *&p"是什么意思?为什么和"data *p"是同一种类型? ~~是像p=&a?像指针那样,指针的指针?首地址?什么鬼?不懂!~~ (百度什么的找不到较为详细的结论。。。。 >![在这里插入图片描述](https://img-blog.csdnimg.cn/20200303194344494.jpg) **问题二**:图一和图二进行比较得到的,没有分配内存,就算调用分配了,也没有用?为什么? (如果主函数和子函数都有分配内存,结果赋值成功,但是头节点的地址变了,就是 | 赋值 | 主函数有分配内存 | 主函数没有分配内存| |--|--|--| | 子函数有分配内存 | 成功 | 失败 | | 子函数没有分配内存 | 成功 | 失败 | ) (这是我主观的结论。。。。大佬求解释!!!!

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

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

单链表中的插入和删除

要求: (1)建立一个数据域存储1,3, 5,7的单链表; (2)将6插入到单链表中,使其仍保持递增的顺序; (3)将5删除。

有一道关于单链表的题,今天考试对于小白来说太难了,希望有大神能帮忙解一下

模拟手机通讯录管理系统,实现对通讯录进行管理。需要对联系人姓名、电话进行管理,利用结构体变量记录联系人的姓名、电话,建立单向链表来存放联系人的信息。 要求实现如下功能: (1)写函数create()实现建立单链表来存放联系人的信息,如果输入大写‘Y’字符则继续创建结点存储联系人信息,否则按任意键结束输入。 (2)写自定义函数输出链表中联系人信息。 (3)写自定义函数查询联系人的信息。 (4)写自定义函数释放链表所占内存。 (在主函数依次调用各函数即可) 结构体类型定义如下: struct friends{ char name[20]; char phone[12]; struct friends*next; }; 程序运行示例1: 请依次输入每个联系人姓名,电话: wu 13623456 是否继续输入,按Y键继续输入,其他键就结束. Y 请依次输入每个联系人姓名,电话: zhang 34567812 是否继续输入,按Y键继续输入,其他键就结束. Y 请依次输入每个联系人姓名,电话: zhao 891234 是否继续输入,按Y键继续输入,其他键就结束. 输出所有联系人信息为:姓名 电话 wu 13623456 zhang 34567812 zhao 891234 请输入要查找联系人姓名: li 不存在此联系人 程序运行示例2: 请依次输入每个联系人姓名,电话: wu 13623456 是否继续输入,按Y键继续输入,其他键就结束. Y 请依次输入每个联系人姓名,电话: zhang 34567812 是否继续输入,按Y键继续输入,其他键就结束. Y 请依次输入每个联系人姓名,电话: zhao 891234 是否继续输入,按Y键继续输入,其他键就结束. 输出所有联系人信息为:姓名 电话 wu 13623456 zhang 34567812 zhao 891234 请输入要查找联系人姓名: wu 该联系人的姓名:wu 电话:13623456 输入提示:"请依次输入每个联系人姓名,电话: \n" 输入格式:"%s %s" 输入提示:"是否继续输入,按Y键继续输入,其他键就结束.\n" 输入提示:"请输入要查找联系人姓名:\n" 输入格式:%s 输出提示:"输出所有联系人信息为:姓名 电话\n" 输出格式:"%s %s\n" 查找输出提示:找到了则输出:"该联系人的姓名:%s 电话:%s \n" 找不到则输出提示:"不存在此联系人\n"

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

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

c语言程序设计-将文件内容赋到一个链表里 然后写一个增加节点的函数 将新增加的节点连到那个链表后面

***********就是功能1和功能2的实现************ #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* delet(Node*L,int del_n); 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() { //创建文件 FILE*fp; fp = fopen("storehouse.txt","w"); int x; int n;//初次输入的大小 int del_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:printf("请输入最初的货物类型数量:\n"); scanf("%d",&n); create(n,L); break; case 2: break; case 3:printf("******请输入要删除货物类型的编号:******\n"); scanf("%d",&del_n); printf("删除成功!\n"); delet(L,del_n); break; case 4:;break; case 5:;break; case 6:display(n,L);break; case 7:printf("bye!see you next time!\n"); exit(0); break; default:printf("input error!\nplaese input1-7"); } } } //函数 //1.创建链表节点 Node*create(int n,Node*L) { Node*pTail=L; L->next=NULL; Node*p; //利用尾插建立单链表 int i; for(i=1;i<=n;i++) { p=(Node*)malloc(sizeof(Node)); if(p==NULL) { printf("申请内存空间失败!\n"); } 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; } //货物显示函数 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); putchar('\n'); p=p->next; //} } } //删除货物类型 Node*delet(Node*L,int del_n) { Node *del_p,*p; p = L; del_p = L; if(del_n==1) { L=p->next; free(del_p); } int i; for(i=1;i<del_n-1;i++) { p=p->next; } del_p=p->next; p->next=del_p->next; free(del_p); return L; }

一、 创建一个字符单链表,实现对字符的插入、删除、查找、元素个数的统计等基本操作,要求为用户提供选择式菜单?

C语言 数据结构 一、 创建一个字符单链表,实现对字符的插入、删除、查找、元素个数的统计等基本操作,要求为用户提供选择式菜单。

通过键盘创建有若干个元素(可以是整型数值)的单链表,实现对单链表的初始化,对已建立的顺序表插入操作、删除操作、查找操作、遍历输出单链表?

通过键盘创建有若干个元素(可以是整型数值)的单链表,实现对单链表的初始化,对已建立的顺序表插入操作、删除操作、查找操作、遍历输出单链表。 要求各个操作均以函数的形式实现,并且在主函数中调用各个函数实现以下操作: ( 1 )键盘输入单链表 x 、 x 、 x 、 x 、 x 、 x ,并输出显示,其中 x 为任意整数。 ( 2 )在单链表的第 4 个位置插入 67 ,并输出单链表中的各元素值。 ( 3 )删除单链表中的第 2 个数据元素,并输出单链表中的各元素值。 ( 4 )查找单链表中的第 5 个元素并输出该元素的值。

c++链表按输入顺序去创建

输入一批正整数,以0为结束标志,按输入顺序创建链表,并输出该链表,新的结点插入在后

VS2019运行单链表的插入和删除操作时引发异常?

代码运行时具体异常如下: ![图片说明](https://img-ask.csdn.net/upload/202005/19/1589850127_110144.png)![图片说明](https://img-ask.csdn.net/upload/202005/19/1589850178_771306.png)!![图片说明](https://img-ask.csdn.net/upload/202005/19/1589850290_893366.png)![图片说明](https://img-ask.csdn.net/upload/202005/19/1589850300_200185.png) 具体代码如下 ``` /*======开发环境:Windows10,Visual Studio Community 2019 版本:16.5.4===========*/ /*=================头文件=====================*/ #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> typedef struct node //定义结点 { char data[10]; //结点的数据域为字符串 struct node* next; //结点的指针域 }ListNode; typedef ListNode* LinkList; //自定义LinkList单链表类型 /*=====================函数声明=========================*/ LinkList CreatListR1(); //用头插入法建立带头结点的函数 ListNode* LocateNode(LinkList head, char* key); //函数,按值查找结点 void insertlist(LinkList head, int i, char key); //函数,插入结点 void deletelist(LinkList head, char* key); //函数,删除指定值的结点 void printlist(LinkList head); //函数,打印链表中的所有值 void deleteall(LinkList head); //函数,删除整个链表 /*====================主函数=======================*/ int main() { char* ch; char num[4]; char b[8]; ch = &b[0]; int i; LinkList head; head = CreatListR1(); //用头插入法建立单链表,返回头指针 printlist(head); printf("输入y或n选择是否插入结点。\n"); scanf("%s", num); if (strcmp(num, "y") == 0 || strcmp(num, "Y") == 0) { printf("请输入要插入的字符串:"); scanf("%s", ch); printf("\n请输入要插入的位置:"); scanf("%d", &i); insertlist(head, i, ch); printlist(head); } printf("输入y或n选择是否删除结点。\n"); scanf("%s", num); if (strcmp(num, "y") == 0 || strcmp(num, "Y") == 0) { printf("请输入要删除的字符串:"); scanf("%s", ch); deletelist(head, ch); printlist(head); } deleteall(head); system("pause"); } /*============用头插入法建立带头结点的函数==============*/ /*@param void*/ /*@return 返回头指针*/ /*@note 让用户自己输入字符串,创建单链表*/ LinkList CreatListR1(void) { char* ch; char a[8]; ch = &a[0]; LinkList head = (LinkList)malloc(sizeof(ListNode)); //创建头结点 ListNode* s, * r, * pp; r = head; r->next = NULL; //初始为空链表 printf("输入“#”代表输入结束。\n"); printf("请输入不重复的字符串:\n"); scanf("%s", ch); while (strcmp(ch, "#") != 0) { pp = LocateNode(head, ch); //查找是否输入的字符串已经存在 if (pp == NULL) { s = (ListNode*)malloc(sizeof(ListNode)); //创建新的结点 strcpy(s->data, ch); s->next = r->next; r->next = s; //将新结点插入表中 } else { printf("输入了重复的字符串。\n"); } printf("输入“#”代表输入结束。\n"); printf("请输入不重复的字符串:\n"); scanf("%s", ch); } return head; //返回头指针 } /*============按值查找结点,找到则返回结点位置,否则返回NULL==================*/ /*@param LinkList head:要查找的单链表的头指针*/ /*@param char* key:要查找的字符串*/ /*@return 若未查找到,返回NULL,如果查找到,返回字符串的结点位置*/ /*@note 按值查找结点*/ ListNode* LocateNode(LinkList head, char* key) { ListNode* p = head->next; //开始结点比较 while (p && (p->data != key)) //直到p=NULL或者p->data==key为止 p = p->next; //扫描下一个结点 return p; //若p=NULL则查找失败,返回NULL,否则p指向查找的字符串的结点位置 } /*=================向指定结点插入指定值===================*/ /*@param LinkList head:要插入指定值的单链表的头指针*/ /*@param int i:要插入字符串的位置*/ /*@param char* key:要删除的字符串*/ /*@return void*/ /*@note 在指定位置插入指定字符串*/ void insertlist(LinkList head, int i, char* key) { ListNode* p, * t, * pp; int j; p = head; j = 0; pp = LocateNode(head, key); //查找是否输入的字符串已存在 if (pp == NULL) { while (p != NULL && j < i - 1) //寻找第i-1个结点 { p = p->next; j++; } if (j != i - 1) { printf("错误的插入位置。\n"); return; } t = (ListNode*)malloc(sizeof(ListNode)); strcpy(t->data, key); //将字符串s赋值给数据域 t->next = p->next; p->next = t; } else printf("输入的字符串已存在。\n"); } /*===================删除指定值的结点=======================*/ /*@param LinkList head:要删除指定值的单链表的头指针*/ /*@param char* key:要删除的字符串*/ /*@return void*/ /*@note 删除指定字符串的结点*/ void deletelist(LinkList head, char* key) { ListNode* p, * r, * q = head; p = LocateNode(head, key); //按照key值查找结点 if (p = NULL) //若没有找到key值,退出 { printf("输入的字符串不存在。\n"); exit(0); } while (q->next != p) //p为要删除的结点,q为p的前结点 q = q->next; r = q->next; q->next = r->next; //将r的指针域赋值给q的指针域 free(r); //释放结点 } /*==============打印单链表=============*/ /*@param LinkList head:要打印的单链表的头指针*/ /*@return void*/ /*@note 打印单链表*/ void printlist(LinkList head) { ListNode* p = head->next; //从开始结点打印 while (p) { printf("%s, ", p->data); p = p->next; } printf("\n"); } /*==================删除整个单链表,释放空间=================*/ /*@param LinkList head:要删除的单链表的头指针*/ /*@return void*/ /*@note 删除整个单链表*/ void deleteall(LinkList head) { ListNode* p = head, * r; while (p->next) { r = p->next; free(p); p = r; } free(p); } ```

静态链表为什么实现不了数据反转,哪里错了,具体的代码如何实现?

``` //vc6.0实现的C++版 //功能:静态链表实现线性表的基本功能 #include <iostream.h>//读入必须包含的头文件 #include <windows.h>//清屏和颜色设置需要 #include <iomanip.h> enum returninfo{success,fail,overflow,underflow,range_error};//定义返回信息清单 #define NULLP -1//静态链表的空地址模拟 const int MAXSIZE=10;//静态链表的总空间大小 class node { public: int data;//数据域 int next;//指针域 }; /* 定义一个线性表类staticlinklist */ class staticlinklist { private: node dataarray[MAXSIZE];//定义静态链表的数组 int freep,headp;//freep管理空闲空间,headp管理实际线性表空间 int count;//计数器 统计结点个数即线性表的长度 public: staticlinklist();//构造函数 ~staticlinklist();//析构函数 int getnewnode(void);//申请一个新的可用空间 returninfo create(int number);//静态链表的初始化 bool empty(void) const;//判断是否空链 int size(void) const;//求静态链表的长度 void deletenode(int position);//把某个空间地址归还给空闲空间 returninfo traverse(void);//遍历静态链表所有元素 returninfo retrieve(int position,int &item) const;//读取一个结点 returninfo replace(int position,const int &item);//修改一个结点 returninfo insert(int position,const int &item);//插入一个结点 returninfo remove(int position);//删除一个结点 returninfo invertlist(void);//静态链表所有数据反转 void showinfo(void);//显示静态链表相关信息 }; staticlinklist::staticlinklist()//构造函数 { //静态链表初始化,约定开始时地址域为从小到大顺序挂链,最后一个为NULLP(即-1) int i; for(i=0;i<MAXSIZE;i++) dataarray[i].next=i+1; dataarray[MAXSIZE-1].next=-1; freep=0;//设置空闲区的指针 count=0;//计数器清零,表明开始时没有实际数据 headp=NULLP; } staticlinklist::~staticlinklist()//析构函数 { } staticlinklist::getnewnode(void) { int tempaddress;//定义一个临时地址指针 tempaddress=freep;//保存目前可用空间的第一个地址 freep=dataarray[freep].next;//可用空间头指针后移 return tempaddress; } returninfo staticlinklist::create(int number)//静态链表的初始化 { int tempaddress,tempp; cout<<"请依次输入数据(用空格隔开):"; for(int i=1;i<=number;i++) { tempaddress=getnewnode(); cin>>dataarray[tempaddress].data; dataarray[tempaddress].next=NULLP; count++; if(i==1)//挂第一个结点 { headp=tempaddress; tempp=headp; } else//挂其他结点 { dataarray[tempp].next=tempaddress; tempp=tempaddress; } } return success; } bool staticlinklist::empty(void) const//判断是否空链 { if(headp==NULLP) return true; else return false; } int staticlinklist::size(void) const//求静态链表的长度 { return count; } void staticlinklist::deletenode(int position) { dataarray[position].next=freep; freep=position; } returninfo staticlinklist::traverse(void)//遍历静态链表中的所有元素 { int searchp;//启用搜索指针 if(empty()) return underflow;//空表的处理 searchp=headp; cout<<"静态链表中的全部数据为:Headp->";//提示显示数据开始 while(searchp!=NULLP)//循环显示所有数据 { cout<<"["<<dataarray[searchp].data; if(dataarray[searchp].next==NULLP) cout<<"|^]"; else cout<<"|-]->"; searchp=dataarray[searchp].next; } cout<<endl;//最后有一个回车的控制 return success;//本次操作成功 } returninfo staticlinklist::retrieve(int position,int &item) const//读取一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) item=dataarray[searchp].data;//返回读取的数据 return success;//本次操作成功 } returninfo staticlinklist::replace(int position,const int &item)//修改一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) dataarray[searchp].data=item;//实际修改数据的语句 return success;//本次操作成功 } returninfo staticlinklist::insert(int position,const int &item)//插入一个结点 { if(position<=0||position>=count+2) //处理意外,范围不正确 return range_error; int newnodep,searchp=headp,followp=NULLP; newnodep=getnewnode();//此处需要申请新的一个可用空间,地址赋给newnodep if(newnodep==NULLP) return overflow; dataarray[newnodep].data=item;//给数据赋值 if(position==1) { dataarray[newnodep].next=headp; headp=newnodep; count++; return success; } for(int i=1;i<position&&searchp!=NULLP;i++)//以下为查找插入位置 { followp=searchp; searchp=dataarray[searchp].next; } //以下开始修改链表,完成插入数据 dataarray[newnodep].next=dataarray[followp].next;//注意此处的次序相关性 dataarray[followp].next=newnodep; count++;//计数器加1 return success; } returninfo staticlinklist::remove(int position)//删除一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp,followp=NULLP;//这里两个指针的初始值设计一前一后 if(position==1) { searchp=headp; headp=dataarray[headp].next; deletenode(searchp);//释放该结点空间 count--;//计数器减1 return success; } for(int i=1;i<position&&searchp!=NULLP;i++) { followp=searchp; searchp=dataarray[searchp].next; } dataarray[followp].next=dataarray[searchp].next;//删除结点的实际语句 deletenode(searchp);//释放该结点 count--;//计数器减1 return success; } returninfo staticlinklist::invertlist(void)//静态链表所有数据反转 { int nowp,midp,lastp;//启用多个辅助指针 if(empty()) return underflow; nowp=dataarray[headp].next; midp=NULLP; while(nowp!=NULLP) { lastp=midp; midp=nowp; nowp=dataarray[nowp].next; dataarray[midp].next=lastp; } dataarray[headp].next=midp; return success; } void staticlinklist::showinfo(void)//显示静态链表相关信息 { int searchp; cout<<"目前静态链表总空间:"<<setw(3)<<MAXSIZE<<"地址为(0--"<<MAXSIZE-1<<")"<<endl; cout<<"其中自由空间大小为:"<<setw(3)<<MAXSIZE-count<<"编号为:"; searchp=freep; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; cout<<"线性表的已用空间为:"<<setw(3)<<count<<"编号为:"; searchp=headp; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; } /* 定义一个实现静态链表功能的菜单处理类interfacebase */ class interfacebase { private: staticlinklist listonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 returninfo processmenu(int menuchoice);//菜单函数 }; void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"静态链表基本功能菜单"<<endl; cout<<"=================="<<endl; cout<<"1.输入数据(键盘输入)"<<endl; cout<<"2.显示数据(遍历全部数据)"<<endl; cout<<"3.修改数据(要提供位置和新值)"<<endl; cout<<"4.插入数据(要提供位置和新值)"<<endl; cout<<"5.删除数据(要提供位置)"<<endl; cout<<"6.读取数据(要提供位置)"<<endl; cout<<"7.求表长度"<<endl; cout<<"8.数据反转(全部数据逆序存储)"<<endl; cout<<"9.静态链表相关信息"<<endl; cout<<"0.退出程序"<<endl; cout<<"=================="<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } returninfo interfacebase::processmenu(int menuchoice) { int position,item,returnvalue; switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: cout<<"请问你要输入数据的个数,注意要在"<<MAXSIZE<<"个以内:"; cin>>item; if(item>MAXSIZE) cout<<"对不起,输入数据超限,操作已取消!请按任意键继续..."<<endl; else { returnvalue=listonface.create(item); if(returnvalue==success) cout<<"建立静态链表操作成功!请按任意键继续..."<<endl; } break; case 2: returnvalue=listonface.traverse(); if(returnvalue==underflow) cout<<"静态链表目前为空,没有数据可以显示!请按任意键继续..."<<endl; else cout<<"静态链表遍历操作成功!请按任意键继续..."<<endl; break; case 3: cout<<"请输入要修改数据的位置:"; cin>>position; cout<<"请输入要修改的新数据:"; cin>>item; returnvalue=listonface.replace(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,修改的位置超出了范围!请按任意键继续..."<<endl; else cout<<"修改操作成功!请按任意键继续..."<<endl; break; case 4: cout<<"请输入要插入数据的位置:"; cin>>position; cout<<"请输入要插入的新数据:"; cin>>item; returnvalue=listonface.insert(position,item);//注意这个位置的参数 if(returnvalue==overflow) cout<<"对不起,静态链表溢出,无法插入新数据!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,插入的位置超出了范围!请按任意键继续..."<<endl; else cout<<"插入操作成功!请按任意键继续..."<<endl; break; case 5: cout<<"请输入要删除数据的位置:"; cin>>position; returnvalue=listonface.remove(position);//注意这个位置的参数 if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,删除的位置超出了范围!请按任意键继续..."<<endl; else cout<<"删除操作成功!请按任意键继续..."<<endl; break; case 6: cout<<"请输入要读取数据的位置:"; cin>>position; returnvalue=listonface.retrieve(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,读取的位置超出了范围!请按任意键继续..."<<endl; else cout<<"读取的数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl; break; case 7: cout<<"静态链表目前的长度为:"<<listonface.size()<<endl; cout<<"求静态链表长度操作成功!请按任意键继续..."<<endl; break; case 8: returnvalue=listonface.invertlist(); if(returnvalue==underflow) cout<<"对不起,链表已空!请按任意键继续......"<<endl; else cout<<"链表所有元素反转操作成功!请按任意键继续..."<<endl; break; case 9: listonface.showinfo(); break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } return success; } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; staticlinklist linklistnow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```

单链表的基本操作 c语言

用C语言实现单链表的各种基本操作

大一作业:有关链表的问题

可以帮忙看一下这些代码吗?该代码的目的是实现物品 的输入,然后把输入的物品用链表串联起来,老师我我们写一个物品竞拍的管理系统, 刚开始就遇到问题了,求大神帮帮; #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <ctime> #include <algorithm> typedef struct things //物品信息:编号,名称,价格,朝代,简介 { int id; char name[30]; int price; char dynasty[10]; char introduce[100]; struct things *next; struct user *user; struct UserThings *UserThings; }things,*thing; //定义全局变量 thing head; void insert_thing(thing thing1) //物品结构体插入 { thing p1,s; p1 = head; s = thing1; if(p1->next == NULL) { printf("jdj"); s->next = p1->next; p1->next = s; } else { while(p1->next->id < s->id && p1->next != NULL)//按id从小到大排序 { p1 = p1->next; } if(p1->next != NULL && p1->next->id == s->id)//如果有相同的编号 { printf("该编号已存在,请从新输入\n"); } else { s->next = p1->next; p1->next = s; } } } void input_thing() //物品信息录入 { thing thing1; thing1 = (things*)malloc(sizeof(things)); printf("\n请输入物品数据,输入0结束输入."); printf("\n请输入物品ID(8位数字):"); scanf("%d",&thing1->id); while(thing1->id!=0) { //initialize and create printf("\n请输入物品名称:"); scanf("%s",thing1->name); printf("\n请输入物品朝代(如唐代):"); scanf("%s",thing1->dynasty); printf("\n请输入物品价格:"); scanf("%d",&thing1->price); printf("\n请输入物品介绍(140字以内):"); scanf("%s",thing1->introduce); thing1->next=NULL; thing1->user=NULL;// insert_thing(thing1); //select_n(p1); printf("\n请输入物品ID(8位数字):"); scanf("%d",&thing1->id); } } int main() { head = (things*)malloc(sizeof(things));//刚开始忘了给头指针分配空间 head->next = NULL; input_thing(); printf("%d",head->next->id);//输出第一个节点(用来测试的) } 问题:这个链表串联不起来,可能是我在使用指针 的过程中理解错了一些东西,求大神帮帮,谢谢。而且我在最后输入id跳出循环的时候,主函数的printf("%d",head->next->id)输出的是最后输入的id(也就是0,因为我跳出循环的条件是0)

求大侠帮忙:C语言程序设计---编程题(以下所有题目程序应是非递归的)

1. 编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2. 2. 学校工会组织活动,要求有8名教师参加,这8名教师将分别从A学院3名教师、B学院5名教师、C学院6名教师中任意抽取,且其中必须有B学院的教师参加,请编程输出所有可能的方案 3. 已知在C盘根目录下存有文本文件“file1.txt”,编程统计文件“file1.txt”中每个字母字符和每个数字字符出现的频率,在屏幕上显示统计结果,并将统计结果写入磁盘文件“file2.txt”中 4. 输入一个字符串,内有数字和非数字字符,如:AS234fgh456d 17968x7654,将其中连续的数字作为一个整体,依次存放到一数组a中,例如234存入a[0],456存入a[1],…,编程统计其共有多少个整数,并输出这些数。要求: 1) 编写函数完成将字符串中连续的数字作为一个整体,依次存放到一数组a中 2) 在主函数中完成数据的输入与结果的输出 5. 按由大到小的顺序对一个含有N个整型数据的数组A[N]进行排序,利用如下改进的选择排序方法:第一次选出最大者存入A[1],第二次选出最小者存入A[N],第三次选出次大者存入A[2],第四次选出次小者存入A[N-1],如此大小交替地选择,直到排序完成。要求: 1) 编写函数sort完成排序 2) 在主函数中完成数据的输入与结果的输出 6. 已知用两个单链表分别存储的两个字符串,均按递增次序排列。编程实现将这两个单链表归并为一个按数据域值递减次序排列的单链表。要求: 1) 单链表中每个结点只存放一个字符 2) 利用原链表中的结点空间存储归并后的单链表,不另外生成新链表 3) 单链表的建立写一函数create实现 4) 两个链表归并过程写一函数sub实现 5) 输出结果写一函数output实现 6) 主函数调用这三个函数完成程序功能

一个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;} }

设计算法统计循环单链表中结点的关键字值为x的结点信息(包括结点位置和结点个数)

要求列出1.循环单链表结点类型数据结构定义2.主函数3.统计信息函数

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

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

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

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

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

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

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

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

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

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

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

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

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

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

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

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

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

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

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

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

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

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

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

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

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

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

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

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

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

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

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

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

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

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

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

正确选择比瞎努力更重要!

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

正确选择比瞎努力更重要!

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

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

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

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

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

阿里面试官让我用Zk(Zookeeper)实现分布式锁

他可能没想到,我当场手写出来了

终于,月薪过5万了!

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

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

立即提问
相关内容推荐