设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列

设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列( )存储方式
最节省运算时间。
(A) 单向链表 (B) 单向循环链表
(C) 双向链表 (D) 双向循环链表

5个回答

(C) 双向链表


我有这题答案,选D,双向循环链表


难道不是B(单向循环链表)?
双向链表在链表的任何位置插入和删除,但如果最常用的操作是在表尾插入和删除,单向循环链表就可以吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
HashMap插入时存在避免尾部遍历之说?

HashMap插入元素的过程: 1 首先计算key的hash值,然后根据table的长度进行取模,找到自己的index位置。 2 如果table[index]位置上没有其他元素,则直接插入,否则就发生了hash冲突。 hashmap解决hash冲突是采用链地址法,也就是说,当发生hash冲突后,会 遍历链表中每个元素,调用equals方法进行比较,如果相等则将旧的value替换为新的 value,如果遍历结束后,都没有相等的,则在链表头部插入。 问题来了,为什么要在链表头部插入呢?网上说是避免尾部遍历。。但是真的存在避免尾部遍历么?因为在插入元素时,会调用equals方法和每个元素进行比较,少不了遍历的过程,完全可以在遍历结束后在尾部进行插入,并不会多出额外的时间复杂度。 求大神解答啊。。谢谢啦

HashMap链表的插入方式

我想问一下为什么JDK1.7及之前版本链表的插入采用头插法,而1.8改为尾插法?

python 双链表 头部插入元素问题

def add(self, item): node = Node(item) if self.is_empty(): self._head = node else: node.next = self._head self._head.prev = node self._head = node 出现下面错误 Traceback (most recent call last): File "D:/pycharm/PychramProject/mysqlTest/DLinkList.py", line 101, in <module> ll.add(1) File "D:/pycharm/PychramProject/mysqlTest/DLinkList.py", line 39, in add self._head.prev = node AttributeError: 'NoneType' object has no attribute 'prev'

C语言单链表的插入求解了

对于带有头结点的链表,为什么在插入方法需要传入头指针的地址(二重指针)?对于不带头结点的链表,插入或者删除第一个元素时,需要使用头指针的地址,可是对于带头结点链表,为何要呢?

双向链表,尾部插入显示错误,为什么?

![图片说明](https://img-ask.csdn.net/upload/201904/05/1554463159_835559.png)

为什么不允许删除循环单链表中最后一个结点?如何解决?

/*****************************************************/ /* 函数功能:建立一个空的循环单链表 */ /* 函数参数:无 */ /* 函数返回值:指向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)

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

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

C++双向动态链表记录删除-删除最后一个学生的信息时崩溃?

此代码为用双向动态链表记录并删除学生信息 为什么在delete函数里加入(curr->next)->pre=curr->pre后,先进行输入三个学生信息的操作,然后删除第三个学生信息的时候程序会**崩溃** **目前注释了(curr->next)->pre=curr->pre; ```** #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; #define LEN sizeof(struct Student) typedef struct Student { long num;//学号 char name[20];//姓名 char sex[10];//性别 int age;//年龄 char phone[11];//电话 struct Student *next; struct Student *pre;//双向动态链表 }Student; //把head curr last定义为全局变量,下面函数就省下传参 Student *curr,*head=NULL,*last; void creat(void) { while(1) { curr=(struct Student *)new Student(); cout<<"请输入学生学号"<<endl; cin>>curr->num; cout<<"请输入学生姓名"<<endl; cin>>curr->name; cout<<"请输入学生性别"<<endl; cin>>curr->sex; cout<<"请输入学生年龄"<<endl; cin>>curr->age; cout<<"请输入学生电话"<<endl; cin>>curr->phone; if(head==NULL){ head=(struct Student*)new Student();//空出头部 head->next=curr;// curr->pre=head; last=curr; }else{ last->next=curr; curr->next=NULL; curr->pre=last; last=curr; } cout<<"请选择操作,1表示继续录入,2表示结束"<<endl; int b; cin>>b; if(b==1)continue; else if(b==2) { last= (struct Student*)new Student();//空出尾部,目的是使用free时候不崩溃? last->pre=curr; break; } } } void print(int num)//链表的print函数 { curr=head; int a=0; while(curr) { if(curr->num==num) { cout<<"学号"<<curr->num<<endl; cout<<"姓名"<<curr->name<<endl; cout<<"性别"<<curr->sex<<endl; cout<<"年龄"<<curr->age<<endl; cout<<"电话"<<curr->phone<<endl; a=1; break; } curr=curr->next; } if(a==0) { cout<<"查无此人"<<endl; } } void Delete(int num) { curr=head; int c=1; while(curr) { if(curr->num==num) { (curr->pre)->next = curr->next; //(curr->next)->pre=curr->pre;/*如果不注释此代码,输入三个学生信息,删除第三个学生信息的时候系统就会崩溃?*/ free(curr); cout<<"已经删除学生信息"<<endl; c=0; } curr=curr->next; } if (c)cout<<"对不起!系统没有找到此人"<<endl; } int main() { // head=creat();//返回第一个结点的地址 while(1) { cout<<"请选择你的操作"<<endl; cout<<"1:学生信息录入"<<endl; cout<<"2:学生信息查询"<<endl; cout<<"3:请输入删除学生的学号"<<endl; cout<<"4:退出"<<endl; int choice=0; cin>>choice;//输入选择 if(choice==1) { cout<<"请输入学生的信息"<<endl; creat();//返回第一个结点的地址 } if(choice==2) { cout<<"请输入你查询的学生的学号"<<endl; int a ; cin>>a ; print(a); } if(choice==3) { cout<<"请输入你想要删除学生的学号"<<endl; int a; cin>>a; Delete(a) ; } if(choice==4) break; } return 0; }; ```

C++链表求助帮忙写一下

用C++编写完整的异质链表。整数、浮点数、字符串等不同类型的对象都可以放在同一个链表上。

我写的链表,每次到末尾插入的时候就会报错 调试的时候出现segmentation fault 请大佬看看时怎么回事

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct stu{ int score; char name[10]; struct stu *next; }STU; STU *creat1(STU *head,int n); STU *creat2(STU *head,STU *tail,int n); void myprintf(STU*); STU *insert(STU *head); STU *delet(STU *head); int main(){ int n,num; STU *head=NULL;//头指针 STU *tail=NULL;//尾指针 记得初始化为NULL。 char name[10]; printf("*********1.创建链表。***********************\n"); printf("*********2.输出所有的节点内容。*************\n"); printf("*********3.插入一个新的节点。***************\n"); printf("*********4.删除一个节点。*******************\n"); printf("*********5.修改一个节点。*******************\n"); printf("*********6.结束操作。***********************\n"); printf("请输入指令:"); scanf("%d",&n); do{ switch(n){ case 1: printf("请输入节点数:"); scanf("%d",&num); head=creat2(head,tail,num); break; case 2: myprintf(head); break; case 3: head=insert(head); break; case 4: head=delet(head); break; // case 5:change(head); break; case 6: printf("欢迎您再次使用!"); break; default:printf("请输入正确的数值!"); scanf("%d",&n); continue; } if(n!=6){ printf("请输入指令:"); scanf("%d",&n); } }while(n!=6); return 0; } /*struct stu *creat1(STU *head,int n){//头部差法。最后一个输入的第一个出现,后面的直接插在头上。 STU *p; int i;// for(i=0;i<n;i++){ p=(STU*)malloc(sizeof(STU));//先给指针分配空间,这是创建的第一件事。 printf("请输入学生的分数:"); scanf("%d",&p->score); printf("请输入学生的名字:"); scanf("%s",&p->name); p->next=head; head=p;//这两步可以用图理解 不然死记也行。 } return head; }*/ STU*creat2(STU *head,STU *tail,int n){//尾部差法。最后一个输出在最后一个出现,后面的在后面加。 STU *p; int i; for(i=0;i<n;i++){ p=(STU*)malloc(sizeof(STU)); printf("请输入学生的分数:"); scanf("%d",&p->score); printf("请输入学生的名字:"); scanf("%s",&p->name); p->next=NULL; if(head==NULL) head=p; else tail->next=p; tail=p; } return head; } void myprintf(struct stu *head){ STU*p; p=head; do{ printf("%3d %s\n",p->score,p->name); p=p->next; }while(p!=NULL); } STU*insert(STU *head){//按一定的顺序插入,之前就要保证是按顺序的。 这个是从小到大排序。 STU *p=NULL,*p2=NULL,*p1=NULL; int i; p=(STU*)malloc(sizeof(STU)); printf("请输入新加入的学生的分数:"); scanf("%d",&p->score); printf("请输入新加入的学生的名字:"); scanf("%s",&p->name); p2=head; /*while (p2->score<p->score && p2){//当插到最后一个点时会报错 我也不知道怎么改了。。。 p1=p2; p2=p2->next; } if(!p2){//新插入的学生的分数最高 ,在最后面。 p1->next=p; p->next=NULL; } else if(p2==head){//新插入的学生分最少,在最前面。 p->next=p2; head=p; } else{//新插入的同学的中间的一个。 p1->next=p; p->next=p2; }*/ return head; } STU *delet(STU *head){ STU *p1=NULL,*p2=NULL; char t[10]; printf("请输入要删除的学生的名字:"); scanf("%s",t); p1=head; p2=head; while (strcmp(p2->name,t) && p2){ p1=p2; p2=p2->next; } if(!p2) printf("没有找到该同学!"); else if(p2==head){ head=p2->next; free(p2); } else if(!p2->next){ p1->next=NULL; free(p2); } else { p1->next=p2->next; free(p2); } return head; } ``` ``` ``` ```

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++链表:把数据插入链表,再打印,中间有其他语句时,则打印出了一个很奇怪的数,这是为什么?

把数据插入链表,再打印,中间有其他语句时,则打印出了一个很奇怪的数,这是为什么? ``` Evenlist.cpp Evenlist::Evenlist() { head=new evNode; head->next=NULL; } Evenlist::~Evenlist() { evNode *p =head; while (p) { evNode *q = p; p = p->next; delete q; } } bool Evenlist::isEmpty() { if(head->next==NULL) return true; else return false; } void Evenlist::addNode(evNode ev)//有序插入 { evNode*p,*q; evNode*pev=&ev; q=head; p=head->next; if(head->next==NULL){ head->next=pev; cout<<"插在空链表的尾部:"<<endl; cout<<head->next->occurtime<<" "<<head->next->ntype; } else{ while(p!=NULL){ if(pev->occurtime<p->occurtime){ q->next=pev; pev->next=p; cout<<"插在中间"<<endl; break; } else{ q=p; p=p->next; } } q->next=pev; cout<<"插在尾部:"<<endl; } bool Evenlist::deleteNode(evNode*firstEv) { if(isEmpty()){ return false; } else { // firstEv=head->next; head->next=firstEv->next; delete firstEv; cout<<"成功删除"; return true; } } void Evenlist::displayNode() { int i=0; evNode *p ; p=head->next; if(isEmpty()) cout<<"该链表为空"<<endl; while(p!=NULL) { i++; cout<<"第"<<i<<"个事件"; cout << "(" <<p->occurtime<< ", "<<p->ntype<<") "; p = p->next; } cout << endl; } ``` int main() { evNode evltem; Evenlist evList; evltem.occurtime=0;evltem.ntype=-1;evltem.next=NULL;//初始化evltem evList.addNode(evltem); cout<<"打印链表"<<endl;//当有这个语句时输出很奇怪的数,没有时则能正确输出 evList.displayNode(); return 0; } ``` ``` ``` Evenlist.h typedef struct evnode{ int occurtime; int ntype;//事件类型 struct evnode*next; }evNode; class Evenlist { private: evNode *head; public: Evenlist(); virtual ~Evenlist(); bool isEmpty(); void addNode(evNode ev); bool deleteNode(evNode*firstEv); void displayNode(); }; ``` 这是打印错误的截图 1. ![图片说明](https://img-ask.csdn.net/upload/202003/18/1584501219_455766.png) 正确是会打印出(0,-1)

单_循环链表_最后连接部分不理解

int InitCLinkList(CLinkList *list) { int data = 0; CLinkNode* target = NULL; CLinkNode* head_node = NULL; printf("请输入结点数据,0代表结束初始化:\n"); while (1) { scanf("%d", &data); if (data == 0) break; //退出循环标志,用户输入0 表示结束输入数据 if (*list == NULL) { CLinkNode* head= (CLinkNode*)malloc(sizeof(CLinkNode)); *list = head;//链表指向头结点 CLinkNode* node = (CLinkNode*)malloc(sizeof(CLinkNode)); node->data = data; node->next = head; head->next = node; }else{ //如果循环链表不为空 链尾部插入数据 //通过循环 找到尾结点,怎样判断是否是尾结点?当结点的指针域指向头结点时为尾结点,这样才能形成环嘛 //循环结束后target 指向尾结点 //for 循环下好好理解下!target初始化为第一个结点指针 for (target = (*list)->next; target->next != *list; target = target->next); head_node = target->next; CLinkNode* node = (CLinkNode*)malloc(sizeof(CLinkNode)); node->data = data; node->next = head_node; //这个已经指向头了。 target->next = node;//将新结点插入尾部 //在用头指向它。那中间的不都没有了吗。 不理解。 } } return OK; } ``` ```

C++链表类前插法与尾插法问题

#include <iostream> using namespace std; class StudentRecord { public: string stuName; int stuNo; StudentRecord(string s,int n) { stuName=s; stuNo=n; } void print() { cout<<"Name:"<<stuName<<",Number:"<<stuNo<<endl; } }; class StudentNode { public: StudentRecord data; StudentNode *next; StudentNode(const StudentRecord&stu,StudentNode *pNext=NULL):data(stu),next(pNext) {}; }; class LinkedList { public: StudentNode * head; StudentNode * tail; LinkedList():head(0),tail(0) {}; void headinsert(const StudentNode&stu) { StudentNode*t=new StudentNode(stu); t->next=head; head=t; } void headdelete() { StudentNode*t=head; head=head->next; delete t; } void backinsert(const StudentNode&stu) { StudentNode*t=new StudentNode(stu); if(tail!=0) tail->next=t; else head=t; tail=t; } void traverse() { StudentNode*t=head; while(t!=0) { t->data.print(); t=t->next; } } private: }; int main() { StudentRecord b("td",4),c("sb",4),d("da",4); LinkedList a; a.headinsert(d); a.backinsert(c); a.traverse(); return 0; } 这是我写的代码,请看主函数,如何使用了前插法后再用尾插法,我写的代码尾插法总是把前插法覆盖了 !!!!求大神解答,感激不尽!!

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

#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); 实现的初始化操作没什么区别把 为什么要用二级指针呢, 统一成一级指针不好吗?

双向链表,尾插函数用了之后得到结果不正常?

typedef struct Dlist //链表结构体 { Dlist* p_head; int data; Dlist* p_last; }Dlist; void Initialization(int data, Dlist ** list) //初始化链表 { Dlist * p = new Dlist; p->data = data; p->p_last = NULL; p->p_head = NULL; *list = p; } void InsertNode_head(int data, Dlist ** list) //头部插入 { while ((*list)->p_last != NULL) { (*list)->p_last = (*list)->p_last->p_last; } Dlist * p = new Dlist; p->data = data; p->p_last = NULL; p->p_head =*list; (*list)->p_last = p; *list = p; } void InsertNode_end(int data,Dlist**list) //尾部插入 { while ((*list)->p_head != NULL) { (*list)->p_head = (*list)->p_head->p_head; } if ((*list)->p_head = NULL) { printf("我是空"); } Dlist * p = new Dlist; p->data = data; p->p_last = *list; p->p_head = NULL; (*list)->p_head = p; }void print(Dlist * list) //打印数据 { while (list->p_last!=NULL) { list->p_last = list->p_last->p_last; } while (list->p_head!= NULL) { printf("%d\n", list->data); list = list->p_head; } printf("最后一个数是:"); printf("%d", list->data); } //函数原型 void InsertNode(int data, Dlist * list); 其中data是需要插入的数据,list是链表的结构体指针 //链表的结构体中有如下内容 typedef struct Dlist { Node* p_head; Node* p_last; }Dlist; int main() { Dlist* list = new Dlist; Initialization(1, &list); InsertNode_head(2, &list); InsertNode_head(4, &list); InsertNode_end(4, &list); print(list); getchar(); } ``` 结果显示: 4 最后一个数:4 如果不用尾插函数一切正常,如果用了,显示结果就不正常,求大神解答

在devcpp运行不能重复输出并集求求大佬们看看。

第一次在csdn求助!不知道规矩,希望各位大佬能够指点!谢谢大家! 下面是题目和代码,输入完两个集合以后输出两次并集就会出错,还有一个问题是怎么清空链表?? 被这两个问题折磨了一星期le ![图片说明](https://img-ask.csdn.net/upload/201905/22/1558533808_466333.png) ``` #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int data; struct node* next; }node; int lenth(node* head); node* build();//创建链表 int IN_SET(node* p, node* head);//判断新元素是否在链表中存在 node* INSERT_SET(node* head);//插入链表 void output0(node* head); int compare(node* p, node* tail); node* Plus(node* head1, node* head2); int IN_SET(node* head1, node* head2); node* Cross(node* head1, node* head2); node* Oppo(node* head1, node* head2); int main() { node* LA = NULL; node* LB = NULL; node* head_c = NULL; node* head_d = NULL; node* head_e = NULL; int item; while (1) { system("color 9"); printf("\n0-退出 1-编写集合 2-插入元素 3-输出集合"); printf("\n4-输出交集 5-输出并集 6-输出对称差 \n"); printf("请选择要进行的操作:"); scanf("%d", &item); switch (item) { case(0): { exit(0); } case(1): { if (LA != NULL) { printf("已经存在链表!!"); break; } printf("\n创建集合A:"); LA = build(); printf("\n创建完毕"); printf("\n创建集合B:"); LB = build(); printf("\n创建完毕"); break; } case(2): { int t; printf("\n输入1将元素插入集合A,输入2将元素插入集合B:"); scanf("%d", &t); switch (t) { case(1): { LA = INSERT_SET(LA); node* temp1 = LA; while (temp1 != NULL) { printf("%d ", temp1->data); temp1 = temp1->next; } break; } case(2): { LB = INSERT_SET(LB); break; } } break; } case(3): { printf("\n输出A集合:\n"); output0(LA); printf("\n输出B集合:\n"); output0(LB); break; } case(4): { printf("\nA与B的交集为:\n"); head_d = Cross(LA, LB); output0(head_d); break; } case(5): { printf("A与B的并集为:\n"); head_c = Plus(LA, LB); output0(head_c); break; } case(6): { printf("A与B的对称差为:\n"); head_e = Oppo(LA, LB); output0(head_e); break; } } } } node* build() { int size, n = 0; node* head = NULL, * newnode = NULL; //node* MoveP = head; //node* EXMoveP = head; printf("\n请输入该集合大小:"); scanf("%d", &size); while (n < size) { n++; newnode = (node*)malloc(sizeof(node)); newnode->next = NULL; //printf("\n请输入你想增加的元素:"); //scanf("%d", &(newnode->data)); if (head == NULL)//头指针为空,则替换头指针中的值 { printf("\n请输入你想增加的元素:"); scanf("%d", &(newnode->data)); head = newnode; continue; } head = INSERT_SET(head);//用插入排序进行输入 } // MoveP = head;//(测试)输出链表,查看链表存储方式 // // while (MoveP!=NULL) // { // printf("%d ", MoveP->data); // MoveP = MoveP->next; // } return head; } void output0(node * head)//输出函数,已排序的数组从尾部倒着输出 { node* tempnode = head; int len = lenth(head); if (tempnode == NULL) { printf("空集"); return; } for (int i = 0; i < len; i++) { node* tail = head; for (int j = len; (j - i - 1) > 0; j--) { tail = tail->next; } printf("%d ", tail->data); } } int compare(node * p, node * tail)//比较两个传入节点的值的大小 ,前者大于后 者,则返回0,否则返回1。 { if (tail == NULL) return 0; if ((p->data) > (tail->data)) return 0; return 1; } node* INSERT_SET(node * head)//插入链表 { node* Head = head, * tail = head; if (head == NULL)//头指针为空,则说明创建链表不成功,或者未创建链表 { // printf("②"); printf("尚未创建集合,请重新输入"); return head; } while ((tail->next) != NULL)//将尾指针挪到正确位置 { tail = tail->next; } while (1)//无限循环,以下每一种条件都会有出口 { node* p = (node*)malloc(sizeof(p)); p->next = NULL; printf("\n请输入插入的元素:"); scanf("%d", &(p->data)); if (!IN_SET(head, p))//判断新元素是否已经存在 { printf("\n该元素已在集合中,请重新输入另一个值"); free(p); continue; } else { if ((p->data) > (tail->data))//如果新元素大于尾部,直接接上 { tail->next = p; tail = p; return head; } else { node* MoveP = (head->next);//操作指针,用于插入操作的时候连接后半部分链表 node* EXMoveP = head;//操作指针的前一指针,保证能够比较到每一个值 if ((p->data) < (head->data))//如果新元素比头部要小,则插在头部之前 { (p->next) = head; head = p; return head; } while ((EXMoveP->next) != NULL) { if ((p->data) < (MoveP->data))//如果比操作指针要小,则插在操作指针前 { (EXMoveP->next) = p;//先替换掉操作指针前一个指针的next入口,这两行不能打乱次序 (p->next) = MoveP; return head; } MoveP = (MoveP->next); EXMoveP = (EXMoveP->next);//向后拨动指针 } } } } } node* INSERT_SET0(node* head,node* newnode)//插入链表 { node* Head = head, * tail = head; if (head == NULL)//头指针为空,则说明创建链表不成功,或者未创建链表 { return head; } while ((tail->next) != NULL)//将尾指针挪到正确位置 { tail = tail->next; } while (1)//无限循环,以下每一种条件都会有出口 { node* p = (node*)malloc(sizeof(p)); p->data = newnode->data; p->next = NULL; if (!IN_SET(head, p))//判断新元素是否已经存在 { printf("\n该元素已在集合中,请重新输入另一个值"); free(p); return head; } else { if ((newnode->data) < (head->data))//尾部插入 { newnode->next = head; head = newnode; return head; } if ((p->data) > (tail->data))//如果新元素大于尾部,直接接上 { tail->next = p; tail = p; return head; } else { node* MoveP = (head->next);//操作指针,用于插入操作的时候连接后半部分链表 node* EXMoveP = head;//操作指针的前一指针,保证能够比较到每一个值 while ((EXMoveP->next) != NULL) { if ((p->data) < (MoveP->data))//如果比操作指针要小,则插在操作指针前 { (EXMoveP->next) = p;//先替换掉操作指针前一个指针的next入口,这两行不能打乱次序 (p->next) = MoveP; return head; } MoveP = (MoveP->next); EXMoveP = (EXMoveP->next);//向后拨动指针 } } } } } node* Plus(node * head1, node * head2)//取并集 { node* Head1 = head1, * Head2 = head2, * head3 = NULL, * p1 = NULL, * New_tail = NULL; while (Head1 != NULL) { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (Head1->data); if (head3 == NULL)//令头部和尾部先重合,以创建新链表 { head3 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } Head1 = Head1->next; } Head1 = head1; while (Head2 != NULL) { if (IN_SET(Head1, Head2))//如果Head1(整个链表)和Head2(一个节点)的值不一样,执行,将不一样的值插入新构建的链表中 { head3=INSERT_SET0(head3, Head2); } Head2 = Head2->next; } return head3; } int IN_SET(node * head1, node * head2)//在head1为头部的链表中查找是否有与head2节点的值相等的节点,有返回假(0),没有返回真(1) { node* Head1 = head1, * Head2 = head2; while (Head1 != NULL) { if ((Head1->data) == (Head2->data)) return 0; Head1 = Head1->next; } return 1; } node* Cross(node * head1, node * head2)//取交集 { node* Head1 = head1, * Head2 = head2, * head3 = NULL, * p1 = NULL, * New_tail = NULL; while (Head2 != NULL) { if (0 == IN_SET(Head1, Head2))//若 Head1链表中有与Head2相同的节点,取出,拼接成为新节点 { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (Head2->data); if (head3 == NULL) { head3 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } } Head2 = Head2->next; } return head3; } node* Oppo(node * head1, node * head2)//求对称差 { node* head3 = NULL, * head4 = NULL, * head5 = NULL, * p1 = NULL, * New_tail = NULL; head4 = Plus(head1, head2); head3 = Cross(head1, head2); while (head4 != NULL) { if (IN_SET(head3, head4))//如果head3与head4链表中的元素不相同,执行 { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (head4->data);//把不相同的元素取出,组成新的链表 if (head5 == NULL) { head5 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } } head4 = head4->next; } return head5; } int lenth(node * head)//计算链表长度的函数 { node* temp = head; int i = 0; while (temp != NULL) { i++; temp = (temp->next); } return i; } ```

小白提问C++制作一个简单list容器的问题,挺急的!

这是一个题目,但是后期出题者又说一个tail有问题 由于实在太菜了所以不会写…… 请问可以帮忙补全代码片段吗?大概的意思已经注释了 使得程序运行后有如下输出: I love c++ very much! I love c++ I love c++ 代码现在是这样 #include <iostream> #include <cstring> using namespace std; //MyList template <class T> struct ListNode { ListNode(const T& _data = T()): pre(0), next(0), data(_data){} ListNode<T>* pre; ListNode<T>* next; T data; }; template <typename T> class MyList { private: typedef ListNode<T> Node; ListNode<T>* head; ListNode<T>* tail; class list_iterator{ private: Node* ptr;//指向mylist容器中的某个元素的指针 public: list_iterator(Node* p=nullptr):ptr(p){} //重载*, ++, --, ->等基本操作 T &operator*() const{ //返回引用 方便通过*it来修改对象 return ptr->data; } Node *operator->() const{ //重载->运算符 return ptr; } list_iterator &operator++(){ //TODO:迭代器++,使迭代器内置指针向后移动一位 } list_iterator operator++(int){ //TODO:后置++ } bool operator==(const list_iterator &t) const{ // TODO:重载== } bool operator!=(const list_iterator &t) const{ // TODO:重载!= } }; public: typedef list_iterator iterator; MyList():head(new Node) { head->next = head; head->pre = head; }; ~MyList(){ //Clear(); delete head; head = NULL; }; bool empty() { //判断list是否为空 return head->next == head; } void push_back(const T& data) { //尾部插入数据 Node* newnode = new Node(data); if (empty()) { head->next = newnode; head->pre = newnode; newnode->next = head; newnode->pre = head; } else { Node* tail = head-> pre; tail->next = newnode; newnode->next = head; newnode->pre = tail; head->pre = newnode; } } void pop_back() { //删除尾部数据 if (!empty()) { Node* del = head->pre; Node* tail = del->pre; delete del; tail->next = head; head->pre = tail; } } void print() { //打印list if (!empty()) { Node* cur = head->next; while (cur!=head) { cout << cur->data << ' '; cur = cur->next; } cout << endl; } } int size() { //返回list大小 Node* cur = head->next; int count = 0; while (cur!=head) { ++count; cur = cur->next; } return count; } //迭代器操作方法 iterator begin() const{ //TODO:返回链表头部指针 } iterator end() const{ //TODO:返回链表尾部指针 } //其他成员函数 可以自己尝试实现insert/erase }; int main() { MyList<string> mylist_str; mylist_str.push_back("I"); mylist_str.push_back("love"); mylist_str.push_back("c++"); mylist_str.push_back("very"); mylist_str.push_back("much!"); mylist_str.print(); mylist_str.pop_back(); mylist_str.pop_back(); mylist_str.print(); for (MyList<string>::iterator it = mylist_str.begin(); it != mylist_str.end(); it++) { cout << *it << endl; } return 0; } 十分感谢!

请问我的list为什么popback会不好使,请麻烦各位帮帮忙,谢谢

#include<iostream> using namespace std; template <class T> struct list_node { list_node<T>* next; // 指向下一个节点的指针 list_node<T>* prev; // 指向前一个节点的指针 T data; //list 数据 }; template <class T> class list; template <class T> class list_iterator { public: friend class list<T>; private: typedef list_node<T>* link_type; list_node<T>* node;//数据成员 ,为一个节点的指针。 //比较iterator是否相等 public: list_iterator() { } list_iterator(list_node<T>* p) { node = p ; } int operator==(const list_iterator<T>& x) const { return node == x.node; } int operator!=(const list_iterator<T>& x) const { return node != x.node; } //*操作符,使得访问iterator就像访问一个指针 T& operator*() const { return (*node).data; } //自增操作符. ++ list_iterator<T>& operator++() { node = (link_type)((*node).next); //使iterator包含的是下一个节点 return *this; } //自减操作符 -- list_iterator<T>& operator--() { node = (link_type)((*node).prev); return *this; } }; template <class T> class list { public: typedef list_iterator<T> iterator; typedef list_node<T>* link_type; private: link_type node; link_type node_head; link_type node_end; link_type node_tend; size_t length; //list的长度。 public: //默认构造函数,创建一个空的list list() { length = 0; node_end = node_head = NULL; node = node_end; } ~list() { this->clear(); } public: iterator begin() { list_iterator<T> p_ite; p_ite = node_head; return p_ite; } //返回list的末节点。注意,末节点是最后一个元素的下一个节点。末节点不包含元素的值 iterator end() { list_iterator<T> p_ite; p_ite = node_end->next; return p_ite; } //判断是否为空 bool empty() const { return length == 0; } // 返回list的长度 size_t size() const { return length; } //返回list的头部 值引用 T& front() { return *begin(); } //返回list的末尾 值的引用 T& back() { return *(--end()); } //在指定iterator之前插入新结点 void insert(list_iterator<T> position,int n, const T& x)//insert(插入的位置,插入的个数,插入的数值) { for(int i=0;i<n;i++) { list_node<T>* temp = new list_node<T>; temp->data = x; temp->next = position.node; position.node->prev->next = temp; temp->prev = position.node->prev; position.node->prev = temp; position.node = temp; } } // 在头部插入一个元素 void push_front(const T& x) { insert(begin(),1,x); } //在尾部插入一个元素 void push_back(const T& x) { list_node<T>* temp = new list_node<T>; temp->data = x; temp->next = NULL; temp->prev = NULL; //如果链表为空 if(node_head == NULL) { node_head = node_end = temp; } //若果有多个节点 else { node_end->next = temp; temp->prev = node_end; } node_end = temp; length++; } // 删除一个结点 iterator erase(list_iterator<T> position) { link_type next_node = (link_type)position.node->next; link_type prev_node = (link_type)position.node->prev; prev_node->next = next_node; next_node->prev = prev_node; delete(position.node); --length; //长度减1 return iterator(next_node); } // 清空一个list的所有元素 void clear() { list_node<T>* temp = node_head; list_node<T>* deltemp = NULL; while(temp != NULL) { if(temp->next == NULL) { delete temp; temp = NULL; break ; } deltemp = temp; temp = temp->next; delete deltemp; deltemp = NULL; } length = 0; node_end = node_head = NULL; node = node_end; } //删除头部元素 void pop_front() { erase(begin()); } //删除尾部元素 void pop_back() { iterator temp = end(); erase(temp); } list(int a) { length = 0; node_end = node_head = NULL; node = node_end; for(int i=0;i<a;i++) { push_back(0); } } list(int a,int b) { length = 0; node_end = node_head = NULL; node = node_end; for(int i=0;i<a;i++) { push_back(b); } } };

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

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

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

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

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

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

和黑客斗争的 6 天!

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

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

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

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

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

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

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

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

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

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

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

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

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

外包程序员的幸福生活

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

优雅的替换if-else语句

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

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 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多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

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

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

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

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

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

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

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

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

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

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

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

轻松等回家通知

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

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

终于,月薪过5万了!

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

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

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

立即提问
相关内容推荐