用C语言计算一个单链表的长度,单链表的定义如下:要求使用递归,不得出现循环。

用C语言计算一个单链表的长度,单链表的定义如下:要求使用递归,不得出现循环。

5个回答

如果链表有环,永远算不出来
只能假定,这个链表不是环形链表,也没有环
简单事情用递归做是低效率的,即便学习递归,也是不必要的

递推,
可以用递归实现
也可以用迭代实现
前者无循环,后者有

lm_whales
lm_whales 不是我的回答没用,而是这个递归本来就是不必要的,实现起来也不复杂,就是有点那啥
4 年多之前 回复
lm_whales
lm_whales 如果带头结点,当前节点为NULL也返回0
4 年多之前 回复
lm_whales
lm_whales NULL 长度为0 否则返回下一个节点长度 +1,如果带头结点, 下一个节点为NULL返回 0,否则返回下一个节点长度+1
4 年多之前 回复
hutods
hutods 你的回答没用
4 年多之前 回复

int listLength(List *l)
{
if(l->next!=NULL)
{
l=l->next;
return listLength(l)+1
}
return 1;
}

hutods
hutods 谢谢,你的代码有用
4 年多之前 回复

你这有点投机取巧了,有需要的话,可以看一下我的博客中,有单链表相关问题,并且由代码分析.

///环形链表
int cycleListLength(Node *p,Node *head){
if(p==NULL || head==NULL)return 0;
if(p ==head && p->next =head )return 0;
else if(p->next =head)return 1;
return 1+ cycleListLength(p,Head);
}
///带都节点链表
int ListWithHeadLength(Node *p){
if(p==NULL)return 0;
if(p->next==NULL)return 0;
return 1+ ListWithHeadLength(p->next);
}
///不带头节点链表
int ListWithOutHeadLength(Node *p){
if(p==NULL)return 0;
return 1+ ListWithOutHeadLength(p->next);
}

非环形链表,正常应该是无环的
如果有环,先判断一下再求好了

lm_whales
lm_whales 环形链表,带头节点,不带头结点的都有了,递归做这个一点也不好玩
4 年多之前 回复

///环形链表,修改一下
int cycleListLength(Node *p,Node *head){
if(p==NULL || head==NULL)return 0;
if(p ==head && p->next =head )return 1;
if(p->next =head)return 2;
return 1+ cycleListLength(p,Head);
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
单链表的头插法和尾插法,用同一个方法求长度。。。。

``` #include <stdio.h> #include <stdlib.h> #include <malloc.h> //单链表结构 typedef int datatype; typedef struct node { datatype data; struct node *next; }linklist; linklist *head,*p;//指针类型说明 /*头插法建表 用头插法建成的链表中结点的次序和输入的顺序是相反的。 */ linklist *CREATLISTF(){ char ch;//逐个输入字符,以'#'为结束符,返回单链表头指针 linklist * head,*s; head=NULL;//链表开始为空 ch=getchar();//读入第一个结点的值 while(ch!='#') { s=malloc(sizeof(linklist));//生成新的结点 s->data=ch; s->next=head; head=s;//将新结点插入到表头上 ch=getchar();//读入下一个结点的值 } return head;//返回表头指针 } //计算不带头结点的单链表的长度,然后输出单链表 void Print(linklist *L) { int num=0; linklist *p; p=L; while(p) { printf("%c ",p->data); p=p->next; num++; } printf("\nthe length is :%d\n",num); } //尾插法——返回表的头指针 linklist *CREATLISTR(){ char ch; linklist * head,*s,*r; head=NULL;//置空链表 r=NULL;//尾指针初值为空。 ch=getchar(); while(ch!='#'){ s=malloc(sizeof(linklist));//生成新的结点 s->data=ch; if (head==NULL) head=s; else r->next=s; r=s; ch=getchar(); } if(r!=NULL) r->next=NULL; return head; } //查找——按照序号查找 //主函数 int main(){ linklist *f,*r ; //printf("head insert:\n"); //f=CREATLISTF();//头插法建立单链表 //Print(f);//打印链表和链表的长度 printf("tail insert:\n"); r=CREATLISTR();//尾插法 Print(r); } ``` ===================== =============调用头插法和尾插法,右边是输出结果============================ ![调用头插法和尾插法](https://img-ask.csdn.net/upload/201604/07/1460024767_275493.png) ==============只是调用尾插法,右边是输出结果============================== ![只是调用尾插法](https://img-ask.csdn.net/upload/201604/07/1460024804_430635.png) ============================================= 在主函数中先是调用头插法再调用尾插法。但是尾插法输出的长度多了一个。如果只是在调用尾插法,长度就正常输出了。这到底是什么原因??

数据结构------线性表

某带头结点的非空单链表L中所有元素为非0整数,结点类型定义如下: typedef struct node { int data; struct node *next; } LinkNode; 设计一个尽可能高效的算法,将所有data值小于零的结点移到所有data值大于零的结点的前面。 算法提示: 顺序查找链表结点,如有data值小于0的结点则插入到首元结点处。

验证线性表及其上的基本操作。

要求 1、 定义单链表类及双向循环链表类。 2、 实现如下功能: 1 根据输入的测试数据(整型)按序从无到有创建一个单链表 L1。 比如,输入{9,2,5},单链表 L1 中结点顺序为,9->2->5 。 2 根据老师输入的测试数据(整型)创建一个非降序单链表 L2。比如, 输入{9,2,5},单链表 L2 中结点顺序为,2->5->9。 3 打印单链表 L2 中表头至表尾所有结点的数据域值,并输出单链表长度 以及这些结点数据域之和。 4 打印单链表 L1 中表尾至表头所有结点的数据域值,并输出最大值及最 小值。 5 由单链表 L1 生成一个双向循环链表 L3. 查找 L3 中任一结点,并输出从 该结点出发沿右指针域访问的线性表遍历序列。

C语言fopen打开文件失败

一个单链表创建学生信息的作业,要求要用文件的输入输出。 打全部路径会出现如图的错误。 打“C:\\\student_info.txt”也不行。 把文件移到project8的文件夹下面打“student_info.txt”也不行。 已确定文件在文件夹内是存在的。F11调试确定就是fopen那块儿出的问题 求问怎么改......崩溃 ![图片说明](https://img-ask.csdn.net/upload/201912/04/1575461393_230930.png) #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int ElemType; typedef int Status; FILE *fp; /*①单链表数据结构定义*/ typedef struct { int num; //学号 //char name[20]; //姓名 //int sex; //性别 //int dorm; //宿舍 //int tel; //电话 }Student; //结点定义 typedef struct LNode { Student data; struct LNode *next; }LNode; //链表定义 typedef struct { LNode* head; //指向头结点的指针 int length; //链表长度 }LinkList; /*②单链表基本操作接口定义*/ //初始化链表:创建头结点,给L字段赋初值 //返回一个空的单链表 Status InitList(LinkList &L); //初始条件:线性表L已经初始化 //采用头插法创建一个单链表,元素类型为整形,输入-9999时结束 Status CreateFromHead(LinkList &L); //初始条件:线性表L已经初始化 //采用尾插法创建一个单链表,元素类型为整形,输入-9999时结束 Status CreateFromTail(LinkList &L); //初始条件:线性表L已经存在 //打印出所有元素 void PrintElem(LinkList L); //初始条件:线性表L已经存在 //查找第i个结点,若找到(1≤i≤n),则由e返回其值 Status GetElem_L(LinkList L, int i, ElemType &e); //初始条件:线性表L已经存在 //在单链线性表L的第i个元素之前插入元素e Status ListInsert_L(LinkList &L, int i, ElemType e); //初始条件:线性表L已经存在 //删除第i个元素,并由e返回其值 Status ListDelete_L(LinkList &L, int i, ElemType &e); int main() { LinkList L; InitList(L); CreateFromHead(L); PrintElem(L); system("pause"); } /*③部分单链表操作的实现函数*/ Status InitList(LinkList &L) //初始化链表 { L.head = (LNode*)malloc(sizeof(LNode)); if (!L.head)exit(OVERFLOW); L.length = 0; L.head->next = NULL; return OK; } //初始条件:线性表L已经初始化 //采用头插法创建一个单链表,元素类型为整形,输入-9999时结束 Status CreateFromHead(LinkList &L) { LNode *s; int flag = 1; int e; L.head = (LNode*)malloc(sizeof(LNode)); L.head->next = NULL; while (flag) { fp = fopen("C:\Users\解诗雨\source\student_info.txt", "r+"); if (fp==NULL) { printf("打不开\n"); return OK; } fscanf(fp,"%d", &e); if (e) { s = (LNode*)malloc(sizeof(LNode)); s->data.num = e; s->next = L.head->next; L.head->next = s; ++L.length; } else flag = 0; fclose(fp); } return OK; } //初始条件:线性表L已经存在 //打印出所有元素 void PrintElem(LinkList L) { LNode* p; p = L.head->next; printf("当前的结点数为:%d\n", L.length); while (p) { printf("%4d ", p->data.num); p = p->next; } printf("\n"); } 文本: ![图片说明](https://img-ask.csdn.net/upload/201912/04/1575462569_672809.png) 因为现在还在创建链表其他还没弄完...

段错误,我要疯了,C语言数据结构

![图片说明](https://img-ask.csdn.net/upload/201810/03/1538580226_700700.png) 所以问题出在哪里,我很菜,轻喷 附上完整代码 #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define TURE 1 #define FALSE 0 #define ElemType int typedef struct Node { ElemType data; struct Node *next; } Node,*LinkList; void CreateTail(LinkList L); int DelList(LinkList L,int i,ElemType e); void Get(LinkList L,int i); void InitList(LinkList *l); int InsList(LinkList L,int i,ElemType e); int ListLength(LinkList L); void Locate(LinkList L,ElemType e); void main() { LinkList k; int m; //要查找的序号 int n; //要插入的位置 int t; //要删除的位置 char a; //要查找的元素 InitList(&k); Node *p; p=k->next; printf("用尾插法建立单链表,请输入链表数据,以$结束!\n"); CreateTail(k); while(p!=NULL) { printf("%c\n",p->data ); p=p->next; } printf("请输入要查找的序号:"); scanf("%d",&m); printf("查找到的元素是:"); Get(k,m); printf("\n请输入要查找的元素:"); scanf("%c",&a); Locate(k,a); printf("\n请输入要插入的位置:"); scanf("%d",&n); printf("插入的元素是:"); scanf("%c",&a); InsList(k,n,a); printf("插入后的链表是:"); p=k->next; while(p!=NULL) { printf("%c",p->data ); p=p->next; } printf("\n请输入要删除的位置:"); scanf("%d",&t); printf("删除的元素是:%c\n",a); scanf("%c",&a); DelList(k,t,a); printf("删除后的链表是:"); p=k->next; while(p!=NULL) { printf("%c",p->data ); p=p->next; } printf("\n链表的长度是:%d\n",ListLength(k)); } void InitList(LinkList *k) { *k=(LinkList)malloc(sizeof(Node)); (*k)->next=NULL; } void CreateTail(LinkList L) { char c; Node *r,*s; int flag=1; r=L; while(flag) { c=getchar(); if(c!='$') { s=(Node*)malloc(sizeof(Node)); s->data =c; r->next=s; r=s; } else { flag=0; r->next=NULL; } } } void Get(LinkList L,int i) { int j; Node *p; p=L;j=0; while(p->next!=NULL&&j<i) { p=p->next; j++; } if(i==j) printf("%c",p->data ); else printf("FALSE"); } void Locate(LinkList L,ElemType e) { Node *p; p=L->next; while(p!=NULL) if(p->data!=e ) p=p->next; else break; if(p->data ==e) printf("TURE"); else printf("FALSE"); } int InsList(LinkList L,int i,ElemType e) { Node *pre,*s; int k; pre=L;k=0; while(pre!=NULL&&k<i-1) { pre=pre->next; k=k+1; } if(k!=i-1) { printf("插入位置不合法!"); return ERROR; } s=(Node*)malloc(sizeof(Node)); s->data =e; s->next=pre->next; pre->next=s; return OK; } int DelList(LinkList L,int i,ElemType e) { Node *p,*r; int k; p=L;k=0; while(p->next!=NULL&&k<i-1) { p=p->next; k=k+1; } if(k!=i-1) { printf("删除结点的位置不合法!"); return ERROR; } r=p->next; p->next=p->next->next; e=r->data ; free(r); return OK; } int ListLength(LinkList L) { Node *p; p=L->next; int j=0; while(p!=NULL) { p=p->next; j++; } return j; }

循环双链表中比较两个循环双链表是否相等的成员函数

bool operator==(CirDoublyList<T> &list),比较*this和list是否相等,不能比较长度,用递归算法

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

在你自己的文件下,建立一个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,然后输出链表结点的存储单元地址和相应的数值;

总是出现 undeclared identifier,但是我已经定义了

#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<time.h> #include<string.h> int Student=0;//总人数 int N; int Mark[100]; int Mark1[100]; struct student *Head; struct student { char Name[20]; char Snum[20]; char Sex[4]; }; typedef struct node { char name[20]; char snum[20]; char sex[4]; struct node *pnext; }node,*pnode;//类型声明 struct student *GetData();//文件导入 pnode create_list();//创建链表 void traverse_list(pnode phead);//遍历链表输入 int length_list(pnode phead);//链表长度 void sort_list(pnode phead);//学号正排序 void inverse_list(pnode phead);//学号反排序 void delete_list(pnode phead);//链表删除 int insert_list(pnode phead);//链表插入 void main() { srand(time(NULL));//随机函数初始化 pnode head=NULL;//建空链表 head=create_list();//链表头指针地址返回head printf("\n"); traverse_list(head);//原链表正排序 sort_list(head); printf("1.按照学号大小正排序后:\n"); traverse_list(head); int pos; pos=rand()%N+1;////随即删除 delecte_list(head,pos); printf("2.系统随机删除的同学第%d个同学\n\n删除后按学号反序输出",pos);/// inverse_list(head);//反排序 traverse_list(head); printf("3.系统已从剩余学生中抽取了一位\n\n"); printf("插入该生序号为%d\n\n",insert_list(head)); traverse_list(head);//遍历重新反排序链表输出 }

02-线性结构1 两个有序链表序列的合并----答案错误求解

本题要求实现一个函数,**将两个链表表示的递增整数序列合并为一个递增的整数序列。** 函数接口定义: ``` List Merge( List L1, List L2 ); ``` 其中List结构定义如下: ``` typedef struct Node *PtrToNode; struct Node {     ElementType Data; /* 存储结点数据 */     PtrToNode   Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ ``` **L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个递增的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。** 裁判测试程序样例: ``` #include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node {     ElementType Data;     PtrToNode   Next; }; typedef PtrToNode List; List Read(); /* 细节在此不表 */ void Print( List L ); /* 细节在此不表;空链表将输出NULL */ List Merge( List L1, List L2 ); int main() {     List L1, L2, L;     L1 = Read();     L2 = Read();     L = Merge(L1, L2);     Print(L);     Print(L1);     Print(L2);     return 0; } /* 你的代码将被嵌在这里 */ ``` 输入样例: 3 1 3 5 5 2 4 6 8 10 输出样例: 1 2 3 4 5 6 8 10  NULL NULL****   编译器:gcc 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:DS课程组 单位:浙江大学 我的答案: ``` List Merge( List L1, List L2 ){ PtrToNode p1,p2,q1,q2; p1 = L1; q1 = L2; p2 = L1->Next; q2 = L2->Next; while(p2&&q2){ if(p2->Data >= q2->Data){ q1->Next = q2->Next; q2->Next = p2; p1->Next = q2; p1 = p1->Next; q2 = q1->Next; } else{ p1 = p2; p2 = p2->Next; } } if(q2) p1->Next = q2; PtrToNode q3 = L2; L2->Next = NULL; free(q3); PtrToNode front = (PtrToNode)malloc(sizeof(struct Node)); front->Next = L1->Next; L1->Next = front; PtrToNode p3 = L1; L1 = L1->Next; p3->Next =NULL; free(p3); return L1; } ``` ******我的想法是直接在L1中进行排序: 设置p1,p2指向L1链表,其中p2指向L1的当前结点,初始化为第一个节点;p1指向当前结点的前一节点,方便L2结点插入,初始化为头节点。 设置q1,q2指向L2链表,其中q2指向L2的当前结点,初始化为第一个节点;q1指向当前结点的前一节点,方便q2重新定位,不过没太多用处。 然后比较 p2->Data 和 q2>Data,知道其中一方为空。 q2->Data小的话,则将q2指向的结点插入到L1中。 p2->Data小的话,则将p1,p2都指向下一位。 比较到p2,q2其中一方为空。 如果L2还有剩余(即p2先指向NULL),则将其接到的p1后。 最后由于原L1,L2需输出为空,所以建立一个结点 front,先头插到L1原头结点和第一个节点之间。 然后将L1原头结点free,L2则直接free。 思路是如此。但答案错误........ 也从网上看到其他人的答案,思路比我更好,也更容易理解。 但还是不明白自己哪部错了。 向大家求解,多谢!!!******

顺序表做通讯录的一些问题

主函数.cpp: #include<iostream> using namespace std; #define LIST_INIT_SIZE 100 //存储空间初始分配 #define LISTINCREMENT 10 //存储空间分配增量 typedef struct { char num[5]; char name[10]; char xing[5]; char phone[15]; char call[15]; char mail[25]; }ElemType; typedef struct { struct ElemType *elem; int length; int listsize; } SqList; int main() { int i,n,m; SqList L; InitAddressBook(L) cout <<"请输入员工人数:"<<endl; cin >>n;//下面用for循环输入n个人的信息 函数.h: void InitAddressBook(SqList &L) //初始化顺序表 { L.elem= (ElemType*) malloc(LIST_INIT_SIZE *sizeof(ElemType)); L.length=0; Listsize= LIST_INIT_SIZE; } 各位大神 在main函数用L.elem.name是对的吗 感觉有些问题 又不知道在哪里 刚学数据结构做第一个实验 谢谢帮忙哈~

求各位大神们给我个正确的答案,小弟感激不尽

1.键盘输入n,建立长度为n的单链表并输出;(用C++编程) 2.键盘输入x,在单链表中查找值为x的结点并删除后,输出链表。(用C++编程) (需要采用头插法) 单链表的结点数据类型C语言定义 struct node { DataType date; struct node *next; } typedef struct node NODE; 申请结点并赋值 NODE *ApplyNODE(DataType x) { NODE *p; p=(NODE*)malloc(sizeof(NODE)); p->date=x; p->next=NULL; return(p); } 初始化链表 NODE *InitList() { NODE *head; head=(NODE *)malloc(sizeof(NODE)); head->next=NULL; return(head); } 怎么合并起来啊~求教育

InitList_L()就是初始化函数为什么还提示我L未初始化?

``` #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define OVERFLOW -2 #define info 0 typedef int ElemType; typedef int Status; typedef struct Lnode {//线性表的链式结构 ElemType data; struct Lnode *next; }Node; typedef struct Lnode *LinkList; Status InitList_L(LinkList L) //初始化线性表 { L = (LinkList)malloc(sizeof(Lnode)); if (!L)return ERROR; L->next = NULL; L->data = info; return OK; } Status GetElem(LinkList L, int i, ElemType &e)//访问第i个元素并用e返回其值 { int j = 1; LinkList p; p = L->next; while (p&&j<i) { p = p->next; p++; } if (!p || j>i)return ERROR; e = p->data; return OK; } Status ListInsert_L(LinkList L, int i, ElemType &e)//在第i个位置前插入元素e { LinkList p; LinkList s; p = L; int j = -1; while (p&&j < i - 1) { p = p->next; ++j; } if (!p || j>i - 1)return ERROR; s = (LinkList)malloc(sizeof(Lnode)); s->data = e; s->next = p->next; p->next; return OK; } Status ListDelate_L(LinkList L, int i, ElemType *e)//删除第i个元素,并用e返回其值 { LinkList p; p = L; LinkList q; int j = 0; while (p->next&&j<i - 1) { p = p->next; ++j; } if (!(p->next) || j>i - 1)return ERROR; q = p->next; p->next = q->next; *e = q->data; free(q); q->next = NULL; return OK; } Status ListEmpty(LinkList L)//判断表是否为空 { if (L->next) return ERROR; else return OK; } Status Traversal(LinkList L) //遍历线性表 { int i; if (!(L->next))printf("空表\n"); while (L->next == NULL) { printf("%d", L->next); L = L->next; } return OK; } Status Operatemenu(LinkList L) //操作菜单 { int num; printf("\t\t\t------****操作菜单****------\n"); printf("\t\t\t------ 1 访问元素\n"); printf("\t\t\t------ 2 插入元素\n"); printf("\t\t\t------ 3 删除元素\n"); printf("\t\t\t------ 0 退出系统\n\n\n"); printf("\t\t\t------ 请选择你所需要的操作\n"); scanf("%d", &num); switch (num) { case 1: int i0, e0; printf("请输入你所访问元素的位置i0="); scanf("%d", &i0); GetElem(L, i0, e0); printf("%d", e0); break; case 2: int i1, e1; printf("请输入你所要插入元素的值e1="); scanf("%d", &e1); printf("请输入你所要插入元素的位置i1="); scanf("%d", &i1); ListInsert_L(L, i1, e1); printf("遍历线性表中..."); Traversal(L); break; case 3: int i2; ElemType *e2; printf("请输入你要删除元的位置="); scanf("%d",&i2); ListDelate_L(L,i2,e2); printf("删除成功\n"); Traversal(L); break; case 0: printf("正在退出\n"); exit(0); default: printf("输入有误!┑( ̄Д  ̄)┍\n"); } return OK; } int main() { int NodeLength,i,val; LinkList p; LinkList L; InitList_L(L); InitList_L(p); printf("请输入你要建立线性表的长度\n"); scanf("%d",&NodeLength); for (i = 0; i < NodeLength; i++) //生成结点 { p = (LinkList)malloc(sizeof(Lnode)); printf("请为该结点赋值\n"); scanf("%d", &val); p->data = val; p->next = L->next; L->next = p; } Traversal(L); char opp; do { printf("请输入你所需要的操作\n"); scanf("%c", &opp); Operatemenu(L); } while (opp =='Y' || opp == 'y'); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/201710/21/1508576412_485990.png)

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

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

数据结构顺序链表编写出错,如何更正?

#include<stdio.h> #include<stdlib.h> #define maxlen 50 /*定义数组大小*/ typedef char ElemType; /*将元素数据类型定义为char*/ struct List /*定义顺序表结构体*/ { ElemType *list; int len; }; void InitList(struct List *L) { L->list=(ElemType *)malloc(sizeof (ElemType)*maxlen); if(!L->list) printf("error\n"); L->len=0; } void ClearList(struct List *L) /*置空表*/ { L->len=0; } int LenList(struct List *L) /*求表长度*/ { return(L->len); } ElemType GetElem(struct List *L,int i) /*取表中第i个位置的元素*/ { if(i<1 || i>L->len) printf("error location\n"); else return(L->list[i-1]); } int FindList(struct List *L,ElemType x) /*查找*/ { int i=0; while(i<L->len && L->list[i]!=x) i++; if(i==L->len) return(-1); else return(i+1); } void InserList(struct List *L,ElemType x,int i) /*在i位置插入元素x*/ { int j; if(i<1||i>L->len+1) { printf("error location\n"); return; } if(L->len==maxlen) { printf("List overflow\n"); return; } L->len++; for(j=L->len-1;j>=i;j--) L->list[j]=L->list[j-1]; L->list[j]=x; } void DeleteList(struct List *L,int i) /*删除i位置元素*/ { int j; if(i<1 || i>L->len) printf("error location\n"); else { for(j=i-1;j<L->len;j++) L->list[j]=L->list[j+i]; L->len--; } } void TraverseList(struct List *L) /*显示单链表*/ { int j; if(L->len==0) printf("the list is null,can't be displayed\n"); else { printf("the list is:\t"); if(L->len==1) printf("%c",L->list[0]); else { for(j=0;j<L->len-1;j++) printf("%c--->",L->list[j]); printf("%c",L->list[j]); } printf("\n"); } } main() { struct List L; // ClearList(&L); InitList(&L); 此行为97行报错 InsertList(&L,'a',1); InsertList(&L,'b',2); InsertList(&L,'a',1); InsertList(&L,'c',2); InsertList(&L,'d',1); InsertList(&L,'e',2); TraverseList(&L); printf("data: %c location: %d\n",'a',FindList(&L,'a')); printf("location: %d data: %c\n",4,GetElem(&L,4)); printf("delete 2nd node:\n"); DeleteList(&L,2); TraverseList(&L); printf("delete 2nd node:\n"); DeleteList(&L,2); TraverseList(&L); printf("delete 1st node:\n"); DeleteList(&L,1); TraverseList(&L); printf("delete 1st node:\n"); DeleteList(&L,1); TraverseList(&L); return 0; } 错误:cpp(97) : error C2065: 'InsertList' : undeclared identifier

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

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

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

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

外包程序员的幸福生活

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

优雅的替换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中级开发

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

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

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

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

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

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

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

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

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

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

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

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

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

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大胆预测下未来5年的Web开发

在2019年的ReactiveConf 上,《Elm in Action》的作者Richard Feldman对未来5年Web开发的发展做了预测,很有意思,分享给大家。如果你有机会从头...

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

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

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

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

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

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

C 语言编程 — 堆栈与内存管理

目录 文章目录目录前文列表堆、栈内存管理动态分配内存重新调整内存的大小和释放内存 前文列表 《程序编译流程与 GCC 编译器》 《C 语言编程 — 基本语法》 《C 语言编程 — 基本数据类型》 《C 语言编程 — 变量与常量》 《C 语言编程 — 运算符》 《C 语言编程 — 逻辑控制语句》 《C 语言编程 — 函数》 《C 语言编程 — 高级数据类型 — 指针》 《C 语言编程 — 高级数据类...

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

内容导航: 1、TIOBE排行榜 2、总榜(2020年6月份) 3、本月前三名 3.1、C 3.2、Java 3.3、Python 4、学习路线图 5、参考地址 1、TIOBE排行榜 TIOBE排行榜是根据全世界互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。

立即提问
相关内容推荐