单链表中的插入和删除

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
一、 创建一个字符单链表,实现对字符的插入、删除、查找、元素个数的统计等基本操作,要求为用户提供选择式菜单?
C语言 数据结构 一、 创建一个字符单链表,实现对字符的插入、删除、查找、元素个数的统计等基本操作,要求为用户提供选择式菜单。
单链表的插入,删除,基本问题!着急!!!
刚刚开始学习单链表,遇到一点问题,之前学过一点点的c语言。运行结果好像没有办法调用函数似的,实在不知道是哪里出了问题,请求大神帮助! #include<stdio.h> #include<malloc.h> #define INIT_SIZE 50 #define INCREM 10 #define OK 1 #define ERROR 0 typedef struct Node{ int data; struct Node *next; }Node,*List;// List InitList(); List CreateList(); void FreeList(List); List InsertList(List, int, int); List DeleteList(List, int); List InitList()// { List H = (Node*)malloc(sizeof(Node)); if (H == NULL) printf("申请空间失败!"); H->next = NULL; return H; } List CreateList() { int x; List H = (Node*)malloc(sizeof(Node)); H->next = NULL;// while (scanf_s("%d", &x)!=EOF) { List p = (Node*)malloc(sizeof(Node)); p->data = x; p->next = H->next; H->next = p; } return H; } List InsertList(List H, int i, int e) { List q = H; int k=0; for (k = 1; k < i; k++)//找到i的前驱结点 q = q->next; if (q == NULL) return ERROR; List y = (Node*)malloc(sizeof(Node));//给要新插入的结点分配内存 y->data = e;//给要新插入的结点赋值为e y->next = q->next; q->next = y; return H; } List DeleteList(List H,int i)//删除单链表中第i位置的元素 { int k; List q = H; //定义p为要查找的结点 for (k = 1; k i; k++) q = q->next; if (q == NULL) return ERROR; List p = q->next; q->next = p->next; free(p); return H; } void FreeList(List H)//销毁单链表 { List p = H; while (p) { p = p->next; free(p); p = H; } } int main() { List p,q; int i,e; printf("请输入单链表中的数据:\n"); q = InitList(); q=CreateList(); for (p=q->next; p!=NULL; p=p->next) printf("%d", q->data); printf("\n"); printf("在第二个位置处插入元素10:\n"); InsertList(q, 2, 10); for (p = q->next; p != NULL; p = p->next) printf("%d", q->data); printf("\n"); DeleteList(q, 2); printf("删除第二个位置元素后的单链表p:\n"); for (p = q->next; p != NULL; p = p->next) printf("%d", q->data); printf("\n"); return 0; }
单链表的创建与插入.删除
typedef struct node { int data; struct node *next; }NODE; typedef NODE Head; typedef NODE *Pointer; void CreateList(Head *head,int n){ Pointer q; int i; head->data=0; head->next=NULL; head=(Pointer)malloc(sizeof(NODE)); q=head; printf("输入%d个元素:\n",n); for(i=n;i>0;n--){ q=(Pointer)malloc(sizeof(NODE)); scanf("%d",&q->data); q->next=head->next; head->next=q; } } int InsertList(NODE*head,int idx,int e) { Pointer s,p; int j=0; p=head; while(p&&j<idx-1) p=p->next;j++; if(!p||j>idx-1) return 0; s=(Pointer)malloc(sizeof(NODE)); s->data=e;s->next=p->next; p->next=s; return 1; } int DeleteList(NODE *head,int idx,int *e){ NODE *p,*q;int j=0;q=head; while(p->next&&j<idx-1){ p=p->next;j++; } if(!(p->next)||j>idx-1) return 0; q=p->next;p->next=q->next; e=q->data;free(q); return 1; } void DispList(Head*head){ Pointer p; p=head->next; while(p!=NULL){ printf("%d",p->data); p=p->data; } printf("\n"); } int main() { Head L,La; int n,e,a,b; printf("输入元素个数:\n"); scanf("%d",&n); CreateList(&L,n); printf("输入要插入的元素及位置:\n"); scanf("%d%d",&a,&b); InsertList(&L,a,b); DispList(&La) printf("输入要删除的元素及位置:\n"); DeleteList(&L,1,&e); return 0; }
数据结构单链表的插入与删除
设单链表某一节点为p,怎样在p节点前插入一个结点?怎样删除p节点自身?(要求:用Java语言写出具体程序语言)
c语言单链表每次进行查找操作和排序操作的时候程序就闪退
刚学单链表,但是程序每到进行查找操作和排序操作,程序就闪退 编译的时候也没有报错,深夜求助,下面是测试程序的一些片段,单链表初始化和其他操作如插入、删除、输出等都没什么问题,就是一到下面两种操作就闪退了,两个操作函数都是void型的 ``` Linklist L; ElemType *e; case 9:printf("请输入元素的位置\n");scanf("%d",&flag);GetElem(L,flag,e);break;//找到flag位置的数据并print出来 case 14:LinkSort(&L);break;//对单链表中的数据排序 ``` 下面是查找操作的函数 ``` void GetElem(Linklist L,int i,Elemtype *e) { if (L==NULL) { printf("单链表不存在\n"); } else { if (L->next==NULL) { printf("单链表为空\n"); }//前提判断 else{ int length; length=ListLength(L); if (i>length||i<0) { printf("输入错误\n"); }//判断输入合法性 else { int j=0; for (j = 0; j < i; j++) { (*e)=(L->next)->data; L=L->next; }//循环i次,将L->next指向第i个节点,并传值给*e printf("第%d个位置的数据为%d\n",i,*e); } } } } ``` 下面是排序操作的函数,排序操作的我的思想是,创建一个新单链表,然后将传入的单链表的每个节点的数据先与新单链表中的数据进行比较,从小到大确定位置,然后再用插入操作,将每个数据插入新的单链表中 ``` void LinkSort(Linklist *L) { if ((*L)==NULL) { printf("单链表不存在\n"); } else { int l=ListLength(*L); if (l<2) { printf("单链表中至少要有两个元素才能进行排序\n"); } else { int i; Linklist p=(*L)->next; Linklist q,s; q=(Linklist)malloc(sizeof(LNode)); q->next=NULL; s=(Linklist)malloc(sizeof(LNode)); s->data=p->data; s->next=NULL; q->next=s;//先将传入单链表的第一个节点的数据添加到新单链表中去 Linklist r=q->next; p=p->next; while(p->next!=NULL) { i=1;//i是用来确定后续插入位置的 while((p->data)>(r->data)&&r->next!=NULL) { i++; r=r->next; } if ((p->data)>(r->data)) { i++; ListInsert(&q,i,p->data); } else ListInsert(&q,i,p->data); p=p->next; r=q->next; } i=1; while((p->data)>(r->data)&&r->next!=NULL) { i++; r=r->next; } if ((p->data)>(r->data)) { i++; ListInsert(&q,i,p->data); } else ListInsert(&q,i,p->data); *L=q; printf("排序完成\n"); } } } ``` 再附上插入操作函数 ``` void ListInsert(Linklist *L,int i,Elemtype e) { if (*L==NULL) { printf("单链表不存在\n"); } else { int length=ListLength(*L); if (i<1||i>length+1) { printf("输入错误\n"); }//判断输入的合法性 else { Linklist p=*L; int j=0; for (j = 0; j <i-1 ; j++) { p=p->next; }//通过循环使p指向所要插入节点位置的前一个节点 Linklist *r; (*r)=(Linklist)malloc(sizeof(LNode)); (*r)->data=e; (*r)->next=p->next; p->next=*r;//将新建立的节点插入 printf("插入成功\n"); } } } ``` 这是操作情景,直接退回桌面了 呜呜呜 ![图片说明](https://img-ask.csdn.net/upload/201910/21/1571593640_443751.png)
线性链表数据结构的插入与删除
在你自己的文件下,建立一个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,然后输出链表结点的存储单元地址和相应的数值;
链表插入删除顺序问题
Java新手,现在在学习链表,发现链表的插入和删除操作不能很好的掌握,不参考代码不知道先修改哪一个reference,再比如在单链表头插入连接点,代码如下 newLink.next = first; first = newLink; 书上写第一行的first是旧的first,第二行的是新的,都是first怎么还分新旧? 所以请教大家添加和删除连接点有什么通用的原则吗?怎样才能灵活的掌握各个连接点引用的修改?
用单链表实现学籍管理系统
设计题目: 成绩管理系统: 1、输入10名学生的信息:学号、姓名、专业、数学、英语、计算机三门课的成绩。 2、按成绩排序 3、能够实现学生信息的插入和删除 4、能够根据学号进行查找和修改 5、求最高分、最低分学生的信息,求平均分 6、用文件存取 7、用单链表实现 最好能附上注释
c的单链表数据结构实现
设计要求: 有论文参考文献如下: 1.Billinghurst M, Billinghurst M, Clark A. A Survey of Augmented Reality[J]. Foundations and Trends in Human-computer Interaction, 2015, 8(2-3): 73-272. 2.Oskiper T, Sizintsev M, Branzoi V. Augmented Reality Binoculars[J]. IEEE Transactions on Visualization and Computer Graphics, 2015. 3. Chowriappa A, Raza S, Raza S. Augmented‐reality‐based skills training for robot‐assisted urethrovesical anastomosis: a multi‐institutional randomised controlled trial[J]. BJUI, 2015, 115(2): 336-345. 4. Gans E, Roberts D, Bennett M. Augmented reality technology for day/night situational awareness for the dismounted Soldier[J]. Spie Defense Security, 2015. 5. Magnenat S, Magnenat S, Ngo D. Live Texturing of Augmented Reality Characters from Colored Drawings[J]. IEEE Transactions on Visualization and Computer Graphics, 2015, 21(11): 1201-1210. 6. Kinect康复训练辅助系统研究Study of Kinect Rehabilitation Training Aid System[J]. 2013. 7. 达 杨, 孝通 王, 冠雷 徐. 海上视频增强关键技术研究进展 The Key Technologies of Maritime Video Enhancement: A Survey[J]. Journal of Image and Signal Processing, 2014. 8. Ji L, Zhang F, Fu Y. 3D Interaction Techniques Based on Semantics in Virtual Environments[J]. Journal of Software, 2006. 根据上述参考文献,完成以下功能: l单链表,链表的结点的结构包括:作者、题名、文献类型(J代表期刊)、期刊名、出版年份、卷(期)、起始页码、结束页码; l查询所有2015年参考文献并输出; l第7条文献前插入如下的参考文献: Ng L, Wang Z, Ong S. Integrated product design and assembly planning in an augmented reality environment[J]. Assembly Automation, 2014. l第3题的基础上删除包含kinect的参考文献
如何正确创建一个单链表(学生表)?
有大佬解释下代码运行出错的原因么,单链表初学者小白= ``` #include "stdio.h" #include "stdlib.h" #define OK 1 #define ERROR 0 typedef int num; typedef char *str; typedef struct stu { num code; num number; str name; num class; num grade; str department; struct stu *next; }*stu; stu student = NULL; stu e = NULL; int linkcreatehead(stu *phead, int n) { stu p = NULL; int i; *phead = (stu)malloc(sizeof(stu)); (*phead)->next = NULL; for (i = 0; i < n; i++) { p = (stu)malloc(sizeof(stu)); p->code = (i + 1); printf("请输入第%d个学生的\n学号\n", (i + 1)); scanf("%d", &p->number); printf("姓名\n"); scanf("%s", &p->name); printf("班级\n"); scanf("%d", &p->class); printf("年级\n"); scanf("%d", &p->grade); printf("专业\n"); scanf("%s", &p->department); p->next = (*phead)->next; (*phead)->next = p; } return OK; }//头插函数 int linkcreateiail(stu *phead, int n) { stu p, q; int i; *phead = (stu)malloc(sizeof(stu)); q = (*phead); for (i = 0; i < n; i++) { p = (stu)malloc(sizeof(stu)); p->code = (i + 1); printf("请输入第%d个学生的\n学号\n", (i + 1)); scanf("%d", &p->number); printf("姓名\n"); scanf("%s", &p->name); printf("班级\n"); scanf("%d", &p->class); printf("年级\n"); scanf("%d", &p->grade); printf("专业\n"); scanf("%s", &p->department); q->next = p; q = p; } q->next = NULL; return OK; }//尾插函数 int getelem(stu phead, int n, stu *e) { stu p; int i = 1, j = n; p = phead->next; while (i < j) { p = p->next; ++i; } if (!p || j > i) { return ERROR; } (*e)->number = p->number; (*e)->code = p->code; (*e)->name = p->name; (*e)->class = p->class; (*e)->grade = p->grade; (*e)->department = p->department; (*e)->next = NULL; return OK; }//读取 int linklistinsert(stu *phead, int n, stu *e) { stu p, s; int i, j = n; p = (stu)malloc(sizeof(stu)); p = (*phead)->next; i = 0; while (p && i < j) { p = p->next; i++; } if (!p || j > i) { return ERROR; } printf("11"); s = (stu)malloc(sizeof(stu)); s->number = (*e)->number; s->code = (p->code + 1); s->name = (*e)->name; s->class = (*e)->class; s->grade = (*e)->grade; s->department = (*e)->department; s->next = p->next; p->next = s; s = s->next; while (!s) { s->code = (s->code + 1); s = s->next; } return OK; }//插入 int linklistdelete(stu *phead, int n, stu *e) { stu p, r; int i = 1; p = *phead; while (p && !(p->number = n)) { p = p->next; i++; } if (!p) { return ERROR; } r = p->next; p->next = r->next; (*e)->number = r->number; (*e)->code = r->code; (*e)->name = r->name; (*e)->class = r->class; (*e)->grade = r->grade; (*e)->department = r->department; free(r); return OK; }//删除单结点 stu linkclear(stu *phead) { stu p, r; p = *phead; if (p) { return ERROR; } while (!p) { r = p; p = p->next; free(r); } free(*phead); (*phead) = NULL; return *phead; }//整表清空 int main() { printf("\t=========================================================================================\n"); printf("\t*\t\t\t\t\t\t\t\t\t\t\t*\n"); printf("\t*\t\t\t\t\t\t\t\t\t\t\t*\n"); printf("\t*\t\t\t\t\t\t\t\t\t\t\t*\n"); printf("\t*\t\t\t\t欢迎进入学生学籍管理系统\t\t\t\t*\n"); printf("\t*\t\t\t\t\t\t\t\t\t\t\t*\n"); printf("\t*\t\t\t\t\t\t\t\t\t\t\t*\n"); printf("\t*\t\t\t\t\t\t\t\t\t\t\t*\n"); printf("\t=========================================================================================\n"); do { int jud1; int jud2; int jud3; int numberofstu = (int)malloc(sizeof(int)); int number = 0; int confirm = (int)malloc(sizeof(int)); if (student == NULL) { printf("请输入您要执行的操作:(1)创建一个学生表;(0)退出系统\n"); jud1 = (int)malloc(sizeof(int)); scanf("%d", &jud1); if (jud1 == 1) { printf("您是要如何创建学生表呢?(1)倒序(2)顺序\n"); scanf("%d", &jud2); printf("请输入您的学生总数:\n"); scanf("%d", &numberofstu); if (jud2 == 1) { linkcreatehead(&student, numberofstu); printf("头插函数运行成功!\n"); } else if (jud2 == 2) { linkcreateiail(&student, numberofstu); printf("尾插函数运行成功!\n"); } else { printf("操作参数错误,系统崩溃,正在退出---\n"); return ERROR; } } else if (jud1 == 0) { printf("正在退出系统,请稍后---\n"); return ERROR; } else { printf("操作参数错误,系统崩溃,正在退出---\n"); return ERROR; } } else if (student != NULL) { e = (stu)malloc(sizeof(stu)); e = NULL; jud3 = (int)malloc(sizeof(int)); printf("请输入您当前要执行的操作:(1)插入一个新的学生信息;(2)删除一个学生的信息;\n(3)读取一个学生的信息;(4)清空当前学生表;(0)退出系统\n"); scanf("%d", &jud3); if (jud3 == 1) { printf("请输入要插入的位置为第几个:\n"); scanf("%d", &numberofstu); printf("请输入要插入的学生信息\n"); printf("学号\n"); scanf("%d", &e->number); printf("姓名\n"); scanf("%s", &e->name); printf("班级\n"); scanf("%d", &e->class); printf("年级\n"); scanf("%d", &e->grade); printf("专业\n"); scanf("%s", &e->department); linklistinsert(&student, numberofstu, &e); printf("函数运行成功!插入成功!\n"); } if (jud3 == 2) { printf("请输入要删除的学生学号:\n"); scanf("%d", number); linklistdelete(&student, number, &e); printf("函数运行成功!删除成功!\n"); } if (jud3 == 3) { printf("请输入要读取的学生序号:\n"); scanf("%d", &number); getelem(student, number, &e); printf("编号:%d\t学号:%d\t姓名:%s\n\t年级:%d班级:%d\t专业:%s\n", e->code, e->number, e->name, e->grade, e->class, e->department); } if (jud3 == 4) { printf("您确定要删除学生表吗?(请输入“1”来确认)\n"); scanf("%d", &confirm); if (confirm == 1) { student = linkclear(&student); printf("学生表信息清空成功!\n"); } else { printf("看来您没有确认哦\n"); } } if (jud3 == 0) { printf("正在退出系统,请稍后---\n"); return ERROR; } } } while (1); } ```
单链表中main函数出现死循环
int main() { int choice;//选项 int n;//结点个数 int i;//位置 ElemType e; LNode *L; cout<<"选项:\n1.创建\n2.插入\n3.删除\n0.退出\n请选择:"<<endl; cin>>choice; while(1) { switch(choice) { case 1: InitList_L(L);//单链表的初始化 cout<<"请输入结点个数:"<<endl; cin>>n; cout<<"请输入元素值:"<<endl; CreateList_F(L,n);//头插入元素 break; case 2: cout<<"请输入位置:"; cin>>i; cout<<"请输入元素值:"; cin>>e; ListInsert_L(L,i,e);//插入元素 break; case 3: cout<<"请输入位置:"; cin>>i; ListDelete_L(L,i,e);//删除元素 break; case 0: return 0; default: cout<<"输入有误,请重新输入:"<<endl; } } return 0; } 输出结果完全正确,但是结果出现了死循环,搞不懂为什么。。。求大神指点
单链表的创建及其他操作
这是一段代码,但是自己不会运行(搞不清输入顺序,希望大神给个代码运行截图,最好解释一下,谢谢了) #include <iostream> #include<iomanip> using namespace std; struct student//定义结构体变量; { long int num; double score; student *next; }; student *creatlink()//创建链表节点 { student *p1,*p2,*p3,*head=NULL;//初始化头指针; p1=new student;//动态申请内存, cin>>p1->num>>p1->score;//输入结构体中的内容(为了好以0 0结束创建节点) if(p1->num!=0&&p1->score!=0) { head=p1; while(p1->num!=0&&p1->score!=0)//判断是不是0 0; { p2=new student;//再次申请内存。 p1->next=p2; p3=p1; cin>>p2->num>>p2->score;//输入数据 p1=p2; } p3->next=NULL;//尾指针置空。 } else head=NULL; return head; } student *dellink(student *head,long m) { student *p=head,*p1; while(p!=NULL) { if((p->num==m)&&(p==head))//如果要删除的节点在头上。 { head=p->next; break; } else if((p->num==m)&&(p->next==NULL))//删除的节点在结尾 { p=NULL; } else { if(p->num!=m)//要删的节点在中间时判断是否是要删的节点 { p1=p; p=p->next; } else { p1->next=p->next; break; } } } return head; } student *insertlink(student *head,student *stu) { student *p,*p1,*p3,*p2; p=head; p2=new student;//申请动态内存,为了将新的节点地址变化(如果不变第二次插入式会出错) //cout<<p2<<endl; p2->num=stu->num;//赋值,(也可以用结构体直接赋值) p2->score=stu->score; p2->next=stu->next; p1=p2; if(head==NULL)//判断链表是否为空 { head=p1; p1->next=NULL; } else { while(p->next->next!=NULL) { if((p->num<=p1->num)&&(p->next->num>=p1->num))//判断是否是要插入的位置(此处要求输入是按升序输入的,插入时按升序插入) { p3=p->next; p->next=p1; p1->next=p3; break; } p=p->next; } //cout<<p->next->next<<endl; if((p->num<=p1->num)&&(p->next->num>=p1->num))//由于判断结束的标志是p->next->next,所以还有两组数据还没比较。 { p3=p->next; p->next=p1; p1->next=p3; } else if(p->next->num<=p1->num) { p->next->next=p1; p1->next=NULL; } } return head; } void printlink(student *head) { student *p=head; while(p->next!=NULL) { cout<<p->num<<" "<<p->score<<endl; p=p->next; } cout<<p->num<<" "<<p->score<<endl; } void freelink(student *head) { student *p=head,*p1; while(p!=NULL) { p1=p->next;//存储下一个指针的内容 delete(p);//释放p的内存 p=p1; } delete(p); } int main() { student *creatlink(void); student *dellink(student *,long); student *insertlink(student *,student *); void printlink(student *); void freelink(student *); student *head,stu; long del_num; head=creatlink(); cin>>del_num; head=dellink(head,del_num); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cout<<setiosflags(ios::fixed); cout<<setprecision(2); printlink(head); freelink(head); return 0; }
为什么不允许删除循环单链表中最后一个结点?如何解决?
/*****************************************************/ /* 函数功能:建立一个空的循环单链表 */ /* 函数参数:无 */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnkinit.c,函数名init() */ /*****************************************************/ node *init() /*建立一个空的循环单链表*/ { return NULL; } /******************************************************/ /* 函数功能:获得循环单链表的最后一个结点的存储地址 */ /* 函数参数:指向node类型变量的指针变量head */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:rear() */ /*******************************************************/ node *rear(node *head) { node *p; if(!head)/*循环单链表为空*/ p=NULL; else { p=head;/*从第一个结点开始*/ while(p->next!=head)/*没有到达最后一个结点*/ p=p->next;/*继续向后*/ } return p; } /*****************************************************/ /* 函数功能:输出循环单链表中各个结点的值 */ /* 函数参数:指向node类型变量的指针变量head */ /* 函数返回值:空 */ /* 文件名:clnklist.c,函数名:display() */ /*****************************************************/ void display(node *head) { node *p; if(!head) printf("\n循环单链表是空的!\n"); else { printf("\n循环单链表各个结点的值分别为:\n"); printf("%5d",head->info);/*输出非空表中第一个结点的值*/ p=head->next;/*p指向第一个结点的下一个结点*/ while(p!=head)/*没有回到第一个结点*/ { printf("%5d",p->info); p=p->next; } } }​ /*****************************************************/ /* 函数功能:循环单链表中查找值为x的结点的存储地址 */ /* 函数参数:指向node类型变量的指针变量head */ /* datatype类型的变量x */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:find() */ /*****************************************************/ node *find(node *head,datatype x) { /*查找一个值为x的结点*/ node *q; if(!head) /*循环单链表是空的*/ { printf("\n循环单链表是空的!无法找指定结点!"); return NULL; } q=head;/* q指向循环单链表的第一个结点,准备查找*/ while(q->next!=head&&q->info!=x)/*没有查找到并且没有查找完整个表*/ q=q->next;/*继续查找*/ if(q->info==x) return q; else return NULL; } /*****************************************************/ /* 函数功能:循环单链表第i个结点后插入值为x的新结点*/ /* 函数参数:指向node类型变量的指针变量head */ /* datatype类型的变量x,int类型的变量i */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:insert() */ /*****************************************************/ node *insert(node *head,datatype x,int i) {/*i为0时表示将值为x的结点插入作为循环单链表的第一个结点*/ node *p,*q,*myrear; int j; p=(node*)malloc(sizeof(node));/*分配空间*/ p->info=x;/*设置新结点的值*/ if(i<0)/*如果i小于0,则输出出错信息*/ {printf("\n无法找到指定的插入位置!"); free(p);return head;} if(i==0&&!head) /*插入前循环单链表如果是空的,则新结点的指针域应指向它自己*/ { p->next=p;head=p;return head;} if(i==0&&head) /*在非空的循环单链表最前面插入*/ { myrear=rear(head);/*找到循环单链表的最后一个结点*/ p->next=head; /*插入(1)*/ head=p; /*插入(2)*/ myrear->next=p;/*插入(3)最后一个结点的指针域指向新插入的表中第一个结点*/ return head; } if(i>0&&!head) {printf("\n无法找到指定的插入位置!"); free(p);return head;} if(i>0&&head) {/*在非空的循环单链表中插入值为x的结点,并且插入的结点不是第一个结点*/ q=head;/*准备从表中第一个结点开始查找*/ j=1;/*计数开始*/ while(i!=j&&q->next!=head)/*没有找到并且没有找遍整个表*/ { q=q->next;j++;/*继续查找,计数器加1*/ } if(i!=j)/* 找不到指定插入位置,即i的值超过表中结点的个数,则不进行插入*/ { printf("\n表中不存在第%d个结点,无法进行插入!\n",i);free(p); return head; } else { /*找到了第i个结点,插入x*/ p->next=q->next;/*插入,修改指针(1)*/ q->next=p;/*插入,修改指针(2)*/ return head; } } } /*****************************************************/ /* 函数功能:在循环单链表中删除一个值为x的结点 */ /* 函数参数:指向node类型变量的指针变量head */ /* datatype类型的变量x */ /* 函数返回值:指向node类型变量的指针 */ /* 文件名:clnklist.c,函数名:dele() */ /*****************************************************/ node *dele(node *head,datatype x) { node *pre=NULL,*q;/*q用于查找值为x的结点,pre指向q的前驱结点*/ if(!head)/*表为空,则无法做删除操作*/ { printf("\n循环单链表为空,无法做删除操作!"); return head; } q=head;/*从第1个结点开始准备查找*/ while(q->next!=head&&q->info!=x)/*没有找遍整个表并且没有找到*/ { pre=q; q=q->next;/*pre为q的前驱,继续查找*/ }/*循环结束后,pre为q的前驱*/ if(q->info!=x)/*没找到*/ { printf("没有找到值为%d的结点!",x); } else /*找到了,下面要删除q*/ { if(q!=head){pre->next=q->next;free(q);} else if(head->next==head){free(q);head=NULL; printf("ok1");} else {pre=head->next; while(pre->next!=q) pre=pre->next; /*找q的前驱结点位置*/ head=head->next; pre->next=head; free(q); printf("ok"); } } return head; } /*************************************/ /* 函数功能:循环单链表删除操作测试程序 */ /* 函数参数:无 */ /* 函数返回值:空 */ /* 文件名:test16 函数名:main() */ /*************************************/ #include "stdio.h" #include "conio.h" #include "slnklist.h" #include "clnklist.c" void main() { node *myhead,*tail; myhead=init(); display(myhead); myhead=insert(myhead,33,0); display(myhead); myhead=insert(myhead,55,1); display(myhead); myhead=insert(myhead,22,0); printf("\n\n在循环单链表最前面插入22后的结果为:\n"); /*读者可以在相应的地方加上输出语句,给予适当的提示*/ display(myhead); myhead=insert(myhead,77,3); display(myhead); tail=rear(myhead); printf("\n\n\n使用尾部结点的指针域,打印循环单链表的结果为:\n"); display(tail->next); myhead=dele(myhead,22); display(tail->next);//display(myhead); myhead=dele(myhead,33); display(tail->next);//display(myhead); myhead=dele(myhead,55); display(tail->next); myhead=dele(myhead,77); display(tail->next); getch(); } ![图片说明](https://img-ask.csdn.net/upload/201604/15/1460681850_322856.png)
单链表前面的函数如何通过最后的case语句实现调用
#include <stdlib.h> #include <stdio.h> #include <conio.h> #include<iostream.h> #define OK 1 #define ERROR 0 typedef int Status; typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //单链表的初始化 Status InitList(LinkList &L) { L=new LNode; L->next=NULL; return OK; } //单链表的建立 void CreateList_R(LinkList &L,int n) { LinkList p; L=new LNode; L->next=NULL; LinkList q=L; int i; for(i=0;i<n;++i) { p=new LNode; cin>>p->data; p->next=NULL; q->next=p; q=p; } } //单链表的取值 Status GetElem(LinkList L,int i,ElemType &e) { LinkList p=L->next; int j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i)return ERROR; e=p->data; return OK; } //单链表的按值查找 LNode *LocateElem(LinkList L,ElemType e) { LinkList p=L->next; while (p && p->data!=e) p=p->next; return p; } //单链表的按位置删除 Status ListDelete(LinkList &L,int i) { LinkList p=L; int j=0; while((p->next) && (j<i-1)) {p=p->next;++j;} if(!(p->next)||(j>i-1)) return ERROR; LinkList q=p->next; p->next=q->next; delete q; return OK; } //单链表的遍历 Status PrintLink(LinkList L) { LinkList P = L->next; while (P != NULL) { printf("%d ",P->data); P = P->next; } printf("\n"); return OK; } //单链表的表长 int Length(LinkList L) { LinkList p=L->next;int i=0; while (p) { i++; p=p->next; } return i; } //单链表的销毁 void DestroyList(LinkList &L) { LinkList p; LinkList q; p=L; q=p->next; while(p!=NULL) { free(p); p=q; q=p->next; } } void main(int argc, char* argv[]) { LinkList MyList; ElemType x; int pos,y; int c; int n1; while(true) { printf("------单链表的基本操作------------\n"); printf("------1.单链表的初始化------------\n"); printf("------2.线性表的建立---------------\n"); printf("------3.线性表的遍历---------------\n"); printf("------4.线性表的按位置插入---------\n"); printf("------5.线性表的表长---------------\n"); printf("------6.线性表按位置删除------------\n"); printf("------7.按位置查询线性表的元素------\n"); printf("------8.退出------------------------\n"); printf("请输入要操作的步骤:\n"); scanf("%d",&c); switch(c){ case 1: if(InitList(MyList)==OK) { printf("线性表初始化成功!\n"); } else printf("线性表初始化失败!\n"); break; case 2: CreateList_R(MyList) break; case 3: Printout(MyList); break; case 4: printf("请输入你要插入的数据:"); scanf("%d",&x); printf("请输入你要插入的位置:"); scanf("%d",&pos); if(ListInsert(MyList,pos,x)==OK) { printf("插入成功:\n"); printf("插入后的数据为:\n"); Printout(MyList); } else { printf("插入失败:\n"); } break; case 5: n1=ListLength(MyList); printf("线性表的长度%d\n",n1); break; case 6: printf("请输入你要删除元素的位置:"); scanf("%d",&y); if(ListDelete(MyList,y)==OK) { printf("\n线性表删除成功\n"); printf("线性表删除后的数据:\n"); Printout(MyList); } else printf("删除失败:\n"); break; case 7: printf("你选择数据的位置是:"); scanf("%d",&n1); if(GetElem(MyList,n1,x)==ERROR) printf("i值不合法/n"); else printf("第%d个元素的值为%d\n",n1,x); break; case 8: exit(OK); default: printf("输入错误!"); } } }
C++实现单链表,如何创建一个滑动的指针?
我们老师要求我们做 插入当前结点 的函数。我不太理解这个当前结点的意思。 我的想法是:先让用户search,返回一个指针p,指向某个结点a。然后insertcurrent,就是在a结点后插入新结点。 问题:我怎么把这个指针p传入insertcurrent?? 我在list类里面定义了一个Node*p,执行起来程序会奔溃,如图。 #include <iostream> using namespace std; struct Node{ int data; Node *next; }; class List{ Node *head;//头结点 Node *p;//滑动指针 public: List(){ //构造函数 head=new Node; head->next=NULL; } ~List(){ //析构函数 while(head){ //循环删除 p=head; head=head->next; delete p; } head=NULL; } void CreatList(int n); void InsertCurrent(int item); void InsertHead(int item); void InsertTail(int item); void DeleteCurrent(); void DeleteHead(); void DeleteTail(); int FindCurrent(); int FindK(int k); int Search(int item); void Outputlist(); }; void List::CreatList(int n){ //创建长度为n的链表 Node *p,*s; p=head; cout<<"请依次输入"<<n<<"个元素的值"<<endl; for(int i=0;i<n;i++){ s=new Node; cin>>s->data; s->next=p->next; p->next=s; p=s; } }; void List::InsertCurrent(int item)//插入在当前结点后 { Node *s;//s指向要插入的结点 s=new Node;//动态分配一个新结点 s->data=item;//设item为此结点 s->next=p->next;//s的next指针指向p的后继结点 p->next=s;//p的next指针指向s return; } void List::InsertHead(int item)//插入在表头后 { p=head; Node *s; s=new Node; s->data=item; s->next=p->next; p->next=s; return; } void List::InsertTail(int item)//插入在表尾后 { p=head; int i=0; while (p->next!=NULL) { p=p->next; i++; } Node *s; s=new Node; s->data=item; s->next=NULL; p->next=s; return; } void List::DeleteCurrent()//删除当前结点的后继结点 { Node *q; if(p==NULL){return;} q=p->next; p->next=q->next; delete p; } void List::DeleteHead()//删除表头 { p=head; head=p->next; delete p; } void List::DeleteTail()//删除表尾 { p=head; int i=0; while (p->next!=NULL){ p=p->next; i++; } while (p->next!=NULL){ p=p->next; i++; } p->next=NULL; } int List::FindCurrent()//存取当前结点的值 { int item; item=p->data;// return item; } int List::FindK(int k)//存取第K个结点的值 { int item; if(k<1){return -1;} else{ p=head; int i=0; while(p!=NULL&&i<k){ p=p->next; i++; } if(p==NULL){return -1;} item=p->data; return item; } } int List::Search(int item)//查找结点 { p=head; int i=0; while(p!=NULL&&item==p->data){ p=p->next; i++; } if(p!=NULL){return i;} else{return -1;} } void List::Outputlist()//输出函数 { p = head; while (p != NULL) { cout << p->data<<"->"; p = p->next; } cout << endl; return; } int main() { int n,q, w, e,r,g = 0; List a; cout<<"输入链表长度"<<endl; cin>>n; a.CreatList(n); cout << "创建成功,链表为:"; a.Outputlist(); cout << "请输入插入表头的数:"; cin >> q; a.InsertHead(q); cout << "插入表头后链表为:"; a.Outputlist(); cout << "请输入插入表尾的数:"; cin >> w; a.InsertTail(w); cout << "插入表尾后链表为:"; a.Outputlist(); cout << "请输入插入当前的数:" ; cin >> e; a.InsertCurrent(e); cout << "插入表中后链表为:"; a.Outputlist(); a.DeleteTail(); cout << "删除尾节点后链表为:"; a.Outputlist(); a.DeleteHead(); cout << "删除头节点后链表为:"; a.Outputlist(); a.DeleteCurrent(); cout << "删除头节点后链表为:"; a.Outputlist(); a.FindCurrent(); cout << "请输入想查找的第几个数:"; cin >> r; cout << "查找的第" << r << "个的值为" << a.FindK(r); a.Search(g); ![图片说明](https://img-ask.csdn.net/upload/201710/20/1508488242_878147.png) return 0; }
C语言单链表的插入求解了
对于带有头结点的链表,为什么在插入方法需要传入头指针的地址(二重指针)?对于不带头结点的链表,插入或者删除第一个元素时,需要使用头指针的地址,可是对于带头结点链表,为何要呢?
单链表的创建及操作(代码已给出)
代码如下,只是自己不知道输入的顺序,有点蒙,希望大神给出运行截图,最好有点解释,谢谢![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/66.gif) #include <iostream> #include<iomanip> using namespace std; struct student//定义结构体变量; { long int num; double score; student *next; }; student *creatlink()//创建链表节点 { student *p1,*p2,*p3,*head=NULL;//初始化头指针; p1=new student;//动态申请内存, cin>>p1->num>>p1->score;//输入结构体中的内容(为了好以0 0结束创建节点) if(p1->num!=0&&p1->score!=0) { head=p1; while(p1->num!=0&&p1->score!=0)//判断是不是0 0; { p2=new student;//再次申请内存。 p1->next=p2; p3=p1; cin>>p2->num>>p2->score;//输入数据 p1=p2; } p3->next=NULL;//尾指针置空。 } else head=NULL; return head; } student *dellink(student *head,long m) { student *p=head,*p1; while(p!=NULL) { if((p->num==m)&&(p==head))//如果要删除的节点在头上。 { head=p->next; break; } else if((p->num==m)&&(p->next==NULL))//删除的节点在结尾 { p=NULL; } else { if(p->num!=m)//要删的节点在中间时判断是否是要删的节点 { p1=p; p=p->next; } else { p1->next=p->next; break; } } } return head; } student *insertlink(student *head,student *stu) { student *p,*p1,*p3,*p2; p=head; p2=new student;//申请动态内存,为了将新的节点地址变化(如果不变第二次插入式会出错) //cout<<p2<<endl; p2->num=stu->num;//赋值,(也可以用结构体直接赋值) p2->score=stu->score; p2->next=stu->next; p1=p2; if(head==NULL)//判断链表是否为空 { head=p1; p1->next=NULL; } else { while(p->next->next!=NULL) { if((p->num<=p1->num)&&(p->next->num>=p1->num))//判断是否是要插入的位置(此处要求输入是按升序输入的,插入时按升序插入) { p3=p->next; p->next=p1; p1->next=p3; break; } p=p->next; } //cout<<p->next->next<<endl; if((p->num<=p1->num)&&(p->next->num>=p1->num))//由于判断结束的标志是p->next->next,所以还有两组数据还没比较。 { p3=p->next; p->next=p1; p1->next=p3; } else if(p->next->num<=p1->num) { p->next->next=p1; p1->next=NULL; } } return head; } void printlink(student *head) { student *p=head; while(p->next!=NULL) { cout<<p->num<<" "<<p->score<<endl; p=p->next; } cout<<p->num<<" "<<p->score<<endl; } void freelink(student *head) { student *p=head,*p1; while(p!=NULL) { p1=p->next;//存储下一个指针的内容 delete(p);//释放p的内存 p=p1; } delete(p); } int main() { student *creatlink(void); student *dellink(student *,long); student *insertlink(student *,student *); void printlink(student *); void freelink(student *); student *head,stu; long del_num; head=creatlink(); cin>>del_num; head=dellink(head,del_num); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cout<<setiosflags(ios::fixed); cout<<setprecision(2); printlink(head); freelink(head); return 0; }
麻烦大家帮我看看在这个单链表的程序哪儿有问题嘛
#include <iostream> #include <fstream> #include <string> using namespace std; typedef struct { unsigned long int ID; //课程代码 string lesson; //课程名字 double credit; //学分 int term; //开课学期 }Lessons,*pLessons; typedef struct node //一个结点的数据类型 { Lessons data; node *next; }NODE,*pNODE; pNODE LinkList_Init() //创建一个空链表 { NODE *p; p=new NODE; if(p==NULL) { cout<<"内存不足!"; exit(0); } p->next=NULL; return p; } int LinkList_Length(pNODE head) { int Count=0; //计数器:存放表长 pNODE p=head->next; while(p!=NULL) { Count++; p=p->next; } return Count; } pNODE makeList(int n,ifstream &in) //尾插法生成链表(带头结点) { pNODE head=LinkList_Init(); //生成空表 pNODE tail=head; //尾插法 pNODE node; //一个结点(数据域+指针域) Lessons data; //一个结点的数据(一条记录) for(int i=0;i<n;i++) //记录结点循环 { in>>data.ID; in>>data.lesson; in>>data.credit; in>>data.term; //----------尾插法生成链表-------------- node=new NODE; node->data=data; //结点赋值 tail->next=node; //连入链表 tail=node; //尾结点移位 } tail->next=NULL; return head; } int LinkList_Print(pNODE head) //显示结点数据 { pNODE p=head->next; while(p!=NULL) { cout<<p->data.ID<<endl; cout<<p->data.lesson<<endl; cout<<p->data.credit<<endl; cout<<p->data.term<<endl; p=p->next; } return 0; } pNODE List_Locate(pNODE head,string lesson) { //按课程名称查找 pNODE p=head->next; while(p!=NULL&&p->data.lesson!=lesson) p=p->next; if(p==NULL) return NULL; //没找到 return p; //返回该结点指针 } pNODE List_Prior(pNODE head,string lesson) //查找前一个结点 { pNODE p=head; while(p->next!=NULL&&p->next->data.lesson!=lesson) p=p->next; //p为前一个结点 if(p->next==NULL) return NULL; return p; } pNODE link_Insert(pNODE head,pNODE s) { pNODE p=head; while(p->next!=NULL&&s->data.lesson>p->next->data.lesson) p=p->next; s->next=p->next; p->next=s; return head; } pNODE link_Delete(pNODE head,string lesson) //删除某结点 { pNODE p=head,s; while(p->next!=NULL&&p->next->data.lesson!=lesson) p=p->next; if(p->next==NULL) return head; s=p->next; p->next=s->next; delete s; return head; } void LinkList_Free(pNODE head) //删除整个链表 { //每次删除表头 pNODE p; while(head) { p=head; head=head->next; delete p; } } int main() { int RecNum; //文件中的记录数 ifstream infile("大三课程.txt"); //打开文件 char *temp=new char[1024]; infile>>temp; //读不用的信息 infile>>RecNum; infile.getline(temp,1024,'\n'); infile.getline(temp,1024,'\n'); delete[] temp; pNODE head=makeList(RecNum,infile); //创建链表 infile.close(); //关闭文件 int n=LinkList_Length(head); cout<<"结点个数:"<<n<<endl; cout<<"-------查找“数据库系统”课程--------"<<endl; pNODE node=List_Locate(head,"数据库系统"); cout<<node->data.ID<<" "<<node->data.lesson<<endl; cout<<"-------删除“计算机组成原理”---------"<<endl; link_Delete(head,"计算机组成原理"); n=LinkList_Length(head); cout<<"结点个数:"<<n<<endl; cout<<"-------在“JSP开发技术”后插入“数学建模”-------"<<endl; Lessons one={6015039,"数学建模",2,7}; pNODE newNode=new NODE; //新创建一个结点 newNode->data=one; newNode->next=NULL; link_Insert(head,newNode); n=LinkList_Length(head); cout<<"结点个数:"<<n<<endl; LinkList_Free(head); cout<<"表头结点地址:"<<head<<endl; system("pause"); return 0; }
电工4课程作业1:实现一个单链表
实现单链表并且要有如下操作:插入(任意位置)、删除(包括中间结点)、查找、计算链表长度、清空、链表连接(重载运算符),并且写一个程序验证。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问

相似问题

1
python单链表问题,有个问题怎么改?
2
单链表实现一元多项式相加的问题
2
【数据结构】求助:一个简单的单链表问题
0
单链表的插入,删除,基本问题!着急!!!
1
从键盘输入一组数据建立单链表,然后输出奇数位上的元素。
0
设计算法统计循环单链表中结点的关键字值为x的结点信息(包括结点位置和结点个数)
2
很简单的一个关于单链表的问题
0
在单链表中统计某区域内的元素,将获得元素插入新单链表,并打印新链表元素在原链表中的序号
1
C语言,我明明把单链表的某个节点删除了,但单链表写入文件时还是会写入一些奇怪的东西?
3
带头结点的循环/非循环单链表删除开始结点的时间复杂度
1
写了链表插入函数 主函数却没实现插入功能
1
单链表中删除节点后游离的节点怎么释放内存空间,不能用free,系统会自动回收吗?
1
单链表查找运算报SIGSEGV错误
1
单链表查找运算报SIGSEGV错误?
1
C语言:单链表输出显示问题
1
有一个单链表L,假设结点值为整,怎么设计一个尽可能高效的算法将所有值小于0的结点移到所有值大于0的结点前面?
1
c语言单链表每次进行查找操作和排序操作的时候程序就闪退
1
如何正确创建一个单链表(学生表)?
2
一、 创建一个字符单链表,实现对字符的插入、删除、查找、元素个数的统计等基本操作,要求为用户提供选择式菜单?