C语言中的链表赋值问题

我写了一个存储电影名字以及评级的链表,不理解其中以下三点

1.prev->next=current,

2.prev=current,

3.current=current->next

我目前的理解是:1.把current这个结构体指针变量的地址赋值给prev中的结构体指针变量next;2.把current这个结构体指针变量的地址赋值给结构体指针变量prev;3.令结构体指针变量current的值等于结构体指针变量next的值

不知道对吗?

以下是我的源代码:

#include

#include //malloc();原型

#include //strcpy();原型

#define SIZE 20 //最大字数

typedef struct film

{

    char title[SIZE];

    int rating;

    struct film * next;

}Film;

int main()

{

    Film *head=NULL;

    Film *prev,*current;

    char title2[SIZE];





    //写入

    puts("Scan first title(0-20 charecter)");

    while(gets(title2)!=EOF&&title2[0]!='\0')

    {       

            current = (Film *)malloc(sizeof(Film));

            //存第一个指针head

            if(head==NULL)

            {

                head=current;

            }

            //current's address 赋给next

            else

                prev->next=current; 

            strcpy(current->title,title2);

            puts("Rating is...(0-10)");

            scanf("%d",&current->rating);

            getchar();

            //节点更换

            puts("Enter next movie title");

            prev=current;



    }





    //显示

    if(head)

    {

            current=head;

            while(current!=NULL)

            {

                    printf("the title is %s,the rating is %d\n",current->title,current->rating);

                    current=current->next;  //把下一个结构体指针的地址给current

            }

    }

    else

            puts("Not find any dota...");





    //清内存

    current=head;

    while(current)

    {

            free(current);

            current=current->next;

    }

    puts("OK!");





    return 0;

}

十分感谢

2个回答

1.prev->next=current,
这是表示把新的结点链接到当前的链表上。
2.prev=current,
如果头指针不为空,也就是链表不为空,那么把这个结点串到当前结点,也就是尾结点,如果头指针为空,那当前结点就是头结点。
3.current=current->next
相当于在遍历链表

weixin_36617477
大峰98 您好,我是刚刚链表问题的题主,我的程序有问题,在控制台成功输出title与rating后会突然中断,我觉得是清内存那段代码错了,改成了这样 //清内存current=head; while(current!=NULL ) { temp=current; current=current->next; free(temp); }puts("OK!");但是还是会中断,能告诉我为什么吗?
2 年多之前 回复
weixin_36617477
大峰98 答得很完美,理解了,非常感谢
2 年多之前 回复

第三步"3.current=current->next"应该是更新current指向下一个节点吧?不只是值,里面的next指针也变成下个节点的指针。不知道理解有没有问题

weixin_36617477
大峰98 您好,我是刚刚链表问题的题主,我的程序有问题,在控制台成功输出title与rating后会突然中断,我觉得是清内存那段代码错了,改成了这样 //清内存current=head; while(current!=NULL ) { temp=current; current=current->next; free(temp); }puts("OK!");但是还是会中断,能告诉我为什么吗?
2 年多之前 回复
weixin_36617477
大峰98 也就是说需要考虑的不仅是地址值的传递,而且其结构体变量内部的结构体指针也在不断更新是吧?
2 年多之前 回复
u010264163
慕兰 对的
2 年多之前 回复
struggle_for_dream
温良岁月 current=current->next,这句只是在遍历,如果没有其他操作对链表没有丝毫影响,当然你可以在遍历的过程中加入其他操作。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言 关于链表赋值的提问 求各路大神
最近在写一个加密的代码,老师要求必须使用链表,该算法中需要大量的输入预设好的数据如26个字母及数字,在创建链表时,通过自己设定的Print函数验证时发现指针没有走动,赋值只是停留在最后一个内容,求大神帮忙看看该怎么改才能把指针走动好让我继续存储数据下去。 Node1 *CreatNode1() { Node1 *head,*tail,*p; head=tail=NULL; { p=(Node1*)malloc (sizeof(Node1)); p->alphabet='A'; p->n1=24; p->n2=24; p->num=1; p=(Node1*)malloc (sizeof(Node1)); p->alphabet='B'; p->n1=25; p->n2=22; p->next=p; p->alphabet='C'; p->n1=26; p->n2=7; p->next=NULL; if(NULL == head) {head =p; } else {tail->next=p; } tail=p; } return head; } 完整代码如下 #include<stdio.h> #include<string.h> #include<malloc.h> struct Node1 { char alphabet; int n1; int n2; int num; struct Node1 *next; }; typedef struct Node1 Node1; struct Node2 { char alphabet; int n1; int num; struct Node2 *next; }; Node1 *CreatNode1() { Node1 *head,*tail,*p; head=tail=NULL; { p=(Node1*)malloc (sizeof(Node1)); p->alphabet='A'; p->n1=24; p->n2=24; p->num=1; // head->next=p; // head=head->next; p=(Node1*)malloc (sizeof(Node1)); p->alphabet='B'; p->n1=25; p->n2=22; // head->next=p; // head=head->next; p->alphabet='C'; p->n1=26; p->n2=7; p->next=NULL; if(NULL == head) {head =p; } else {tail->next=p; } tail=p; } return head; } void Print(Node1 *head) { Node1 *p; p=head; if (NULL ==head) { printf("链表为空"); } else { printf("链表如下\n"); while(p != NULL) { printf("%c %d %d",p->alphabet,p->n1,p->n2); p=p->next; } printf("\n"); } } void ReleaseNode1(Node1 *head) { Node1 *p1,*p2; p1=head; while(p1!=NULL) { p2=p1; p1=p1->next; free(p2); } } /* void encrypt(char ch) { while(head1!==NULL) { if(ch == head1->alphabet) */ int main() { Node1 *head1; head1=CreatNode1(); //Node2 *head2; //head2=CreatNode2(); Print(head1); ReleaseNode1(head1); return 0; }
c语言静态链表无法成功赋值
整个算法是为了使用静态链表建树 ** scanf("%c %d %d", &t[i].data, &cl, &cr);**这一行出了问题。无法正常赋值,不知道怎么回事。调试如下:![图片说明](https://img-ask.csdn.net/upload/201906/15/1560579348_931713.png) 以cl为例,赋值而之后,左边调试框里面还是一个垃圾值。 大神能不能帮我看下怎么回事? 谢谢! 代码ru'xia ```#include<stdio.h> #include<stdio.h> #define maxsize 5 #define Null -1 struct treenode{ char data; int left; int right; }; typedef struct treenode tree; int buildtree(tree t[]); int main(){ tree t1[maxsize], t2[maxsize];//用结构体定义了两个结构数组,用来存储树 int r1, r2, i;//r1 r2 代表的是t1,t2结构数组中根节点的下标 r1 = buildtree(t1); r2 = buildtree(t2); for(i=0; i<maxsize; i++){ printf("%c %d %d\n", t1[i].data, t1[i].left, t1[i].right); } return 0; } int buildtree(tree t[]){ int n,i;//n代表树的节点数量 int check[maxsize] = {0};//用来检查谁是根节点 printf("你要输入数量\n"); scanf("%d", &n); if(n){ for(i=0; i<n; i++){ int cl, cr;//用来记录左孩子与右孩子的值 printf("请输入字母 左孩子 右孩子\n"); ** scanf("%c %d %d", &t[i].data, &cl, &cr);** printf("%c %d %d", t[i].data, cl, cr); if(cl!=-1){//如果左孩子存在,该节点的左孩子被赋值,并且记录到check数组,来证明这不是一个孤儿。 t[i].left = cl; check[t[i].left] = 1; }else t[i].left = -1; if(cr!=-1){ t[i].right = cr; check[t[i].right] = 1; }else t[i].right = -1; } } else return -1; for(i=0; i<maxsize; i++) if(!check[i]) break; return i; } ```
【C语言-链表】请问怎么判断链表已经被销毁?
【问题描述】学习链表,销毁链表总感觉没有成功,请问怎么确定链表确实被销毁了?为什么其余节点的内容没有变化? 【代码】 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> struct link_list { int num; char name[20]; struct link_list *next; }; typedef struct link_list ls; int icount = 0; /*链表长度*/ /*链表创建函数*/ ls* create() { ls *phead = NULL; ls *pend, *pnew; char flag; /******************************************************************* 链表循环赋值 *******************************************************************/ while(1) { pnew = (ls*)malloc(sizeof(struct link_list));/*分配空间*/ if(pnew == NULL) /*检测内存分配情况*/ { printf("内存分配失败\n"); return NULL; } if(0 == icount)/*如果是第一个节点*/ { icount++; pnew->next = NULL;/*尾指针指向空*/ phead = pnew;/*头指针指向头节点*/ pend = pnew;/*保存当前指针*/ printf("phead=%d\n", phead); printf("输入姓名:\n"); scanf("%s", pnew->name); printf("输入学号:\n"); scanf("%d", &pnew->num); printf("是否结束输入?y结束,n继续\n"); getchar(); flag = getchar(); if(flag == 'y') { return phead; } } else { icount++; pend->next = pnew; pend = pnew; pnew->next = NULL; printf("输入姓名:\n"); scanf("%s", pnew->name); printf("输入学号:\n"); scanf("%d", &pnew->num); printf("是否结束输入?y结束,n继续"); getchar(); flag = getchar(); if(flag == 'y') { return phead; } } } } /*遍历输出*/ void print(ls* phead) { ls* ptemp; ptemp = phead; while(NULL != ptemp) { printf("\n\n学号:%d\n姓名:%s\n", ptemp->num, ptemp->name); ptemp = ptemp->next; } } /*销毁*/ void damage(ls* phead) { ls *ptemp1; do { printf("删除前节点内容%d 地址phead=%d\n", phead->num, phead); ptemp1 = phead->next; /*保存当前销毁节点指向的地址*/ printf("被销毁节点指向的地址ptemp1=%d\n", ptemp1); free(phead); /*释放当前指针指向的节点空间*/ printf("释放后节点内容%d\n", phead->num); printf("释放后phead=%d\n", phead); phead = ptemp1; /*获取下一个节点地址*/ printf("重新赋值phead=%d\n\n", phead); }while(ptemp1 != NULL); } int main(void) { ls* phead = NULL; int lcat, lcat_del; phead = create(); printf("主函数头指针地址%d\n", phead); print(phead); damage(phead); return 0; } ``` 【运行结果】 ![图片说明](https://img-ask.csdn.net/upload/201912/21/1576889257_479546.png) ![图片说明](https://img-ask.csdn.net/upload/201912/21/1576889268_527655.png)
初学者提问:链表相关问题
``` #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data;**_//数据域_**_ struct Node *pNext;**_//指针域_** }Node,*pNode;**_//Node等价与 struct Node,pNode等价与 struct Node* _** pNode create_list(void)**_;//该函数功能是创建一个非循环单链表,并将该链表的头结点的地址发生给phead_** void traverse_list(pNode phead);**_//该函数功能是将一个链表进行便历 _** int main(void) { pNode phead =NULL;**_//等价于 struct Node* phead=NULL; _** phead=create_list(); traverse_list(phead); return 0; } pNode create_list(void) { int length;**_//链表的长度 _** int val;**_//用来存放用户临时存入结点的值 _** int i; pNode phead=(pNode)malloc(sizeof(Node));**_//分配了一不存放有效数据的头结点 _** if(NULL==phead) { printf("分配内存失败,程序终止!\n"); exit(-1); } pNode pTail=phead;**_//分配了一个尾结点_** pTail->pNext=NULL; printf("请输入您需要生成链表结点的个数:length="); scanf("%d",&length); for(i=0;i<length;++i) { printf("请输入第%d个结点数据:",i+1); scanf("&d",&val); pNode pNew=(pNode)malloc(sizeof(Node)); if(NULL==pNew) { printf("分配内存失败,程序终止!\n"); exit(-1); } printf("\n"); pNew->data=val;**_//给新结点的数据域赋值 _** pTail->pNext=pNew;**_//将尾结点指向新结点 _** pNew->pNext=NULL;**_//将新结点的指针域清空 _** pTail=pNew;**_//将新结点变为尾结点 _** } return phead; } void traverse_list(pNode phead) { pNode p=phead->pNext; while(NULL!=p) { printf("%d\n",p->data); p=p->pNext; } printf("\n"); return; } ``` 为什么会出现这样的情况? ![图片说明](https://img-ask.csdn.net/upload/201907/30/1564460849_83009.png)
请问建立链表并赋值,再遍历输出,输出的结果带有一串乱码是为什么呢?
建立链表并赋值后遍历输出,输出的结果带有一串乱码是为什么呢? (刚学链表懵懵懂懂求解答,谢谢~) _代码如下——_ #include<stdio.h> #include<stdlib.h> struct node{ int data;//数据域 struct node* next;//指针域 }; int main() { int n,i;//确定链表长度 struct node *head=(struct node*)malloc(sizeof(struct node));//创建头结点 struct node *p=(struct node*)malloc(sizeof(struct node));//申请第一个结点 head->next=p;//连接头结点和首结点 p->next=NULL; printf("please input the length:\n"); scanf("%d",&n); printf("input the number:\n"); for(i=0;i<n;i++) { struct node* s=(struct node*)malloc(sizeof(struct node));//创建并给结点s分配内存 scanf("%d",&s->data);//尾插法 p->next=s; s->next=NULL; p=s; } p=head; while(p!=NULL)//遍历输出 { printf("%-10d",p->next->data); p=p->next; } return 0; } 结果: ![图片说明](https://img-ask.csdn.net/upload/201904/22/1555947188_8168.png)
c语言运行出错 是链表哪里出错了吗
![图片说明](https://img-ask.csdn.net/upload/201806/13/1528859680_335574.png) ![图片说明](https://img-ask.csdn.net/upload/201806/13/1528859695_89773.png) ![图片说明](https://img-ask.csdn.net/upload/201806/13/1528859715_415797.png) #include <stdio.h> #include <malloc.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct NODE { char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; struct NODE *next; }node; //下面这部分是啥??? typedef struct { char name[MAXSIZE]; int p_num; double p_price; }str; #if 0 void create(node *head); /*创建货物 main 194line*/ void del(node *head); /*删除指定货物*/ void find(node *head) /*查找货物*/ void all_delete(node *head); /*清空全部货物*/ void change(node *head); /*修改货物信息*/ int display() /*菜单*/ #endif void create(node *head) /*创建货物 main 194line*/ { node *p; /*判断货物是否存在的指针变量*/ int i = 1; char name[MAXSIZE]; int p_num; double p_price; char kind[MAXSIZE]; printf("*****************请输入货物名称:************\n"); scanf("%s",name); //getchar(); p = head->next; while(p != NULL) { if(strcmp(p->name,name) == 0) { printf("*********货物已存在************\n"); p = NULL; i = 0; /* 货物已存在,不执行输入货物命令*/ } else { p = p->next; } } while( 1 == i) { node *q; printf("**************请输入货物单位价格:**************\n"); scanf("%lf",&p_price); printf("**************请输入货物数量:**************\n"); scanf("%d",&p_num); printf("*****************请输入货物所属类型:************\n"); scanf("%s",kind); q = (node*)malloc(sizeof(node)); if(NULL == q) { printf("error2\n"); } strcpy(q->name,name); //strcpy(q->p_num,p_num); q->p_num=p_num; q->p_price=p_price; strcpy(q->kind,kind); q->next = head->next; head->next = q; /*头插法*/ i = 0; } } //我的代码跟这个的区别:没有在函数内重新定义变量 然后使用strcpy这些赋值 void order(node *head,int len1) //给货物排序 { node *p; /*用来排序的变量*/ node *q; /*同上*/ p = head->next; while(len1 > 0) /*实现货物按字母排列*/ { while(p != NULL && p->next!= NULL) { char tempname[MAXSIZE]; /*相当于中间变量用来存储货物信息*/ int tempp_num; double tempp_price; char tempkind[MAXSIZE]; if(strcmp(p->name,p->next->name) > 0) { strcpy(tempname, p->next->name); tempp_price=p->next->p_price; tempp_num=p->next->p_num; strcpy(tempkind,p->next->kind); strcpy(p->next->name,p->name); p->next->p_price=p->p_price; p->next->p_num=p->p_num; strcpy(p->next->kind,tempkind); strcpy(p->name,tempname); p->p_price=tempp_price; p->p_num=tempp_num; strcpy(p->kind,tempkind); } else { p=p->next; } } len1--; } } void print(node *head) /*打印联系人的函数*/ { int i = 1; node *p; p = head->next; printf("现在货物为:\n"); printf("编号 名称 价格 数量 所属类型\n"); while(p != NULL) { printf("%d %s %.2lf %d %s\n", i,p->name,p->p_price,p->p_num,p->kind); p = p->next; i++; } } void del(node *head) /*删除指定货物函数*/ { node *p; node *q; q = head; p = q->next; char name[MAXSIZE]; printf("************请输入要删除的货物名称:*********\n"); scanf("%s",name); while((p != NULL) && (strcmp(p->name,name) != 0)) { q = p; p = p->next; } if(NULL == p) { printf("************未查找到***************\n"); } else { q->next = p->next; free(p); printf("***********删除成功****************\n"); } } void find(node *head) //查找货物 { node *p; char name[MAXSIZE]; printf("*******请输入要查找货物名称:**********\n"); scanf("%s",name); p = head->next; while(p != NULL && strcmp(p->name,name) != 0) { p = p->next;//为什么del函数里面还定义了一个指针q } if(NULL == p) { printf("********没有这个货物*********\n"); } else { printf(" 名称:%s\n 价格:%.2lf 数量:%d 所属类型:%s", p->name,p->p_price,p->p_num,p->kind); } } void all_delete(node *head) //清空全部货物 { while(head->next != NULL) { node *q; q = head->next; head->next = q->next; free(q); } if(NULL == head->next) { printf("*********清除所有货物成功*********\n"); } } void change(node *head) //修改货物信息 { node *p; char name[MAXSIZE]; double p_price; int p_num; char kind[MAXSIZE]; p = head->next; printf("请输入要修改的货物名称\n"); scanf("%s",name); while( p != NULL) { if(strcmp(p->name,name) == 0) { printf("请输入要修改的货物价格\n"); scanf("%lf",p_price); p->p_price=p_price; printf("修改成功\n"); break; } else { p = p->next; } } if(p == NULL) { printf("未查找到此联系人!\n"); } } int sum(node *head) //求链表中有多少货物 { int count_node = 0; node *p; p = head->next; if(p != NULL) { count_node++; p = p->next; } return count_node; } /*void write_to_file(node *head,int len) //链表中的货物信息写到文件 { int i; str string[100]; FILE *fp = fopen("a2","wb"); if(NULL == fp) { printf("open error\n"); exit(1); } //printf("1111\n"); while( head->next != NULL) { for(i = 0;i < len;i++) { strcpy(string[i].name,head->next->name); strcpy(string[i].p_num,head->next->p_num); fwrite(&string[i],sizeof(str),1,fp); //依次将结构体数组写到文件 head = head->next; } } fclose(fp); } void read_to_linklist(node *head) //将文件中的数据读到链表中 { int i; int m; int j = 0; node *p; node *q; p = head; FILE *fp; fp = fopen("a2","rb"); fseek(fp,0,SEEK_END); i = ftell(fp); fseek(fp,0,SEEK_SET); m = (i/(sizeof(str))); // m :文件中有多少个联系人 str string[100]; //结构体数组,存放所有联系人 fread(string,sizeof(str),m,fp); while(m > 0) { q = (node*)malloc(sizeof(node)); strcpy(q->name,string[j].name); strcpy(q->p_num,string[j].p_num); m--; j++; p->next = q; p = q; } fclose(fp); }*/ int display() //菜单 { printf( "\n**************请选择要进行的操作***********\n"); printf("-----------------------------------------------\n"); printf("*|************* 1 .添加货物******************|*\n"); printf("*|************* 2 .删除货物******************|*\n"); printf("*|**************3 .查找货物******************|*\n"); printf("*|**************4 .显示货物******************|*\n"); printf("*|**************5 .修改货物******************|*\n"); printf("*|**************6 .清空货物******************|*\n"); printf("*|**************7 .退 出******************|*\n"); printf("-----------------------------------------------"); } int main() { int a; int n = 1; node *head; node *q; head = (node*)malloc(sizeof(node)); if(NULL == head) { printf("error\n"); } q = head; head->next = NULL; //read_to_linklist(q); while(n == 1) { printf("\n",display()); printf("\n**********************请输入要进行的操作**********\n\n"); scanf("%d",&a); switch(a) { case 1: while(getchar() != '\n'); create(q); order(q,sum(q)); a = 0; break; case 2: while(getchar() != '\n'); del(q); getchar(); print(q); break; case 3: find(q); break; case 4: while(getchar() != '\n'); print(q); break; case 5: while(getchar() != '\n'); change(q); break; case 6: all_delete(q); break; case 7: //write_to_file(q,sum(q)); n = 0; break; default: { printf("*****输入错误,请重新选择指令:******\n"); } while(getchar() != '\n'); break; } } free(head); }
请问这样写为什么不对呢?
typedef struct _list{ Node* head; Node* tail; } List; 关于链表的函数 void add(List* plist,int number) { 这边开始 Node*p=(Node*)malloc(sizeof(Node)); p->value=number; p->next=NULL; if(plist->head) { plist->head=p; plist->tail=p; } else { plist->tail->next=p; plist->tail=p; } } 而这样写就是对的 // Node *last=plist->head; // if(last) // { // while(last->next)//找到最后一个 // last=last->next; // // last->next=p; //然后连到最后一个上 // } // else{ // plist->head=p; // } // 还有一个问题一直不是很明白,就是空指针能不能直接赋值 char *s=NULL; s="sss"; 如上没有问题 int *p=200; 如上编译有warning
为什么函数中的L*new报错,后面的p->next=new也不行?
![图片说明](https://img-ask.csdn.net/upload/201911/27/1574842402_80124.png) ![图片说明](https://img-ask.csdn.net/upload/201911/27/1574842280_696087.png) 为什么VS2019上报错? #include"1.h" typedef struct slist { int id; struct slist* next; }L; //创建一个节点 L* create_node(int data) { //给每个节点分配结构体一样的空间大小 L* p = (L*)malloc(sizeof(L)); if (NULL == p) { printf("malloc error!\n"); return NULL; } //由于结构体在未初始化的时候一样是脏数据,所以要清 memset(p, 0, sizeof(L)); //初始化第一个节点 p->id = data; //将节点的后继指针设置为NULL p->next = NULL; } //链表的尾插 void tail_insert(L* pH, L*new) { //获取当前的位置 L* p = pH; //如果当前位置的下一个节点不为空 while (NULL != p->next) { //移动到下一个节点 p = p->next; } //如果跳出以上循环,所以已经到了NULL的这个位置 //此时直接把新插入的节点赋值给NULL这个位置 p->next =new; }
链表问题,这一句为什么是二级指针
#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); 实现的初始化操作没什么区别把 为什么要用二级指针呢, 统一成一级指针不好吗?
C语言 间接级别不同(指针和指针函数方面)
出现指针和指针函数级别不同的问题。(初学者,代码比较小白轻喷) 在每一个函数给指针赋值的时候都出现这个问题。 下面是警告内容warning: passing argument 1 of 'creation' from incompatible pointer type 顺便提问一下给指针分配空间的问题,头指针的初始化必须要分配空间么? 因为当我把NULL赋值给头指针后再试图让头指针的next指向链表的时候就会弹出程序停止的问题。如果程序中有发现其他问题也希望一并指出,谢谢各位 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct type { int num; char name[20]; int age; char sex[20]; char cla[20]; }elem; typedef struct Node { elem stm; struct Node *next; }node; node *creation(node *n) { n = (node*)malloc(sizeof(node)); n->next = NULL; return n; } node *add(node *n, node *p) { node *s, *ss; s = n; ss = p; while (s->next == ss) { if (s->next != NULL) s = s->next; if (s->next == NULL && ss->next == NULL) s->next = ss; } return s; } int main() { node *p, *head, *n, *pp, *headd, *tot, *tothd, *scan; char str[20]; n = head = headd = tothd = (node*)malloc(sizeof(node)); tot = (node*)malloc(40 * sizeof(node)); tothd->next = tot; p = creation(&p);//赋值的时候有问题 pp = creation(&pp);//赋值的时候有问题 head->next = p; headd->next = pp; printf("The first data num name age sex class(num=-1 to end).\n"); while (scanf("%d", &p->stm.num)&&p->stm.num != -1) { n->next = p; p->next = NULL; p = (node*)malloc(sizeof(node)); scanf("%s", str); strcpy(p->stm.name, str); scanf("%d", &p->stm.age); scanf("%s", str); strcpy(p->stm.sex, str); scanf("%s", str); strcpy(p->stm.cla, str); n = p; } free(n); n = (node*)malloc(sizeof(node)); printf("The second data num name age sex class(num=-1 to end).\n"); while (scanf("%d", &pp->stm.num) && pp->stm.num != -1) { n->next = pp; pp->next = NULL; pp = (node*)malloc(sizeof(node)); scanf("%s", str); strcpy(pp->stm.name, str); scanf("%d", &pp->stm.age); scanf("%s", str); strcpy(pp->stm.sex, str); scanf("%s", str); strcpy(pp->stm.cla, str); n = pp; } p = head->next; pp = headd->next; tot = add(&p, &pp);//赋值的时候有问题 scan = tothd->next; while (scan->next != NULL) { printf("%d ", scan->stm.age); } } ```
该程序运行时刀输入序号的时候输入不进去为什么?有大神知道吗
#include<stdio.h> #include<stdlib.h> typedef struct splist { double data; splist *next; } splist; /*单链表创建的思路 1.声明一个指针p和计数器变量i 2.初始化一个空链表L; 3.让L的头结点指针指向NULL, 4.循环; 生成一个新节点赋值给p 将p插入头结点和前一新节点之间 */ void CJ(splist *L,int n) { splist *p; splist *x=L; int i; x=(splist*)malloc(sizeof(splist)); x->next=NULL; double c; scanf("%lf",&c); printf("请开始建表"); for(i=0;i<n;i++) { p=(splist*)malloc(sizeof(splist)); p->data=c; p->next=x->next; x->next=p; } } double FH(splist*L,int i) { double *e; int j; splist*p; splist *x=L; p=x->next; j=1; while(p&&j<i) { p=p->next; j++; } if(!p||j>i) return 0; *e=p->data; return *e; } int main() { splist *L; double c; int m; int x; printf("请输入表的长度"); scanf("%d",&m); CJ(L,m); printf("请输入要返回的序号");//运行时无法输入序号 scanf("%d",&x); c=FH(L,x); printf("%lf",c); return 0; }
为什么我的插入、删除、计数出错,小白需要大神帮改下
#include<stdio.h> #include<stdlib.h> #define L sizeof(struct Linklist) struct Linklist { int date; struct Linklist *next;//定义了一个指向struct linklist类型数据的指针变量next,用来存放结点的地址。 }; struct Linklist *creat(); void print (struct Linklist ); void insert(struct Linklist ,int i,int x); void delet(struct Linklist ,int i); int GetElem(struct Linklist ,int i); int jishu(struct Linklist *head); struct Linklist *creat()//定义creat函数,指针类型,所以函数带回一个指针量 { printf("请输入链表数据:"); struct Linklist *head,*p,*p1; head=(struct Linklist*)malloc(L); head->next=NULL; head=p=p1=(struct Linklist*)malloc(L); scanf("%d",&p->date); int n=1; while(p->date!=0) { p=(struct Linklist*)malloc(L); scanf("%d",&p->date); p1->next=p; p1=p; n++; } p->next=NULL; return(head); } //建立链表 void print (struct Linklist *head)// struct Linklist *head是定义一个结构体指针变量head { struct Linklist *p; printf("链表数据为:"); p=head; while(p->date!=0) { printf("%d ",p->date); p=p->next; } printf("\n"); return; }//输出链表 void insert( struct Linklist *head,int i,int x) { int j=1; struct Linklist *p,*r; p=head; while(p&&j<i) { p=p->next; j++; } if(!p||j>i) printf("插入出错!"); r=(struct Linklist *)malloc(L); r->date=x; r->next=p->next; p->next=r; }//在第i个位置之前插入数据x void delet(struct Linklist *head,int i) { int j=1; struct Linklist *p,*r; p=head->next; while(p&&j<i-1) { p=p->next; j++; } if(!p||j>i-1) printf("删除出错!"); r=p->next; p->next=r->next; free(r); }//删除第i个位置上的数据 int GetElem(struct Linklist *head,int i) { int j=1,e; struct Linklist *p; p=head->next; while(p&&j<i-1) { p=p->next; j++; } if(!p||j>i) printf("查找出错!"); e=p->next->date; return(e); }//查找第i个位置上的数据是多少,并赋值给e int jishu(struct Linklist *head) { int n=0; struct Linklist *p; p=head; while(p->next!=NULL) { n++; p=p->next; n++; } return(n); }//计数,链表的个数 int main() { int m,n,k,h,e,o; struct Linklist *head; printf("请选择您要做的操作:\n1.建立链表\n2.输出链表\n3.给链表中插入数据\n4.删除链表中的数据\n5.查找链表中的数据\n6.链表中的数据计数\n\n"); head=creat(); print (head); printf("请输入插入的位置和插入的数据");//调用插入函数 scanf("%d,%d",&m,&n); insert(head, m, n); print(head); printf("\n"); printf("请输入要删除的数据的位置");//调用删除函数 scanf("%d",&k); delet( head, k); print(head); printf("\n"); printf("请输入要查找数据的位置");//调用查找函数 scanf("%d",&h); e=GetElem( head,h); printf("要查找的数据的位置在第%d个\n",&e); o=jishu( head); printf("链表中的数据有%d个\n",&o); return 0; }
在.c文件中,为什么struct node * = void *会赋值成功?
<font color = #FF8C00>在使用链表时,创建一个.c文件,来执行 struct node \*p = malloc(sizeof(struct node)); 这个语句的时候,就不会报错。 而创建.cpp文件时,执行这条语句,就会报错说不能将void\*赋给struct node\*。 按理说malloc返回值是void\*,的确不能直接给p赋值的,而应该强制转换为struct node\*。如struct node \*p = (struct node*)malloc(sizeof(struct node)); C和C++在类型这方面的区别有些不是很理解,哪位大神能解释一下? </font>
求各位大神们给我个正确的答案,小弟感激不尽
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); } 怎么合并起来啊~求教育
数据结构函数的问题求解
如果这是一个一个结构体。 typedef struct list { struct list *prior ; struct list *next; int num; } list,*dlist; 问题1:比如我写一个创建函数,我通常是void create_list(dlist L,int n); 但是我看有的地方括号里面的第一个形参不是星号,而是&,麻烦跟我讲一下。是不是传递的不是指针,是一个对象名的引用?是不是对顺序链表这么做好一点? 问题2:上次还有人跟我说第一个形参要用二次指针,否则必须return L;才能改动L;但是我没有这么做也是对的,麻烦帮我解释一下 问题3:关于头节点,那个num是不是不用赋值,或者赋值为0或者其他?为什么啊? 问题4:同样是创建函数,我看有的地方写的是void create_list(L,n) dlist L;int n;{ }我查了下说以前的标准支持这么写,我们老师给我们的代码中也有这么写的。昨天一个研究生让我重看一遍C语言。太打击人了。虽然我不这么定义。
c语言数据结构词索引表出了点问题,谁能帮忙看看呀
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <conio.h> #include <ctype.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define MaxBookNum 1000 //假设只对1000本书建立索引表(1000) #define MaxKeyNum 2500 //索引表的最大容量(2500) #define MaxLineLen 500 //书目串的最大长度(500) #define MaxWordNum 10 //词表的最大容量 #define MaxWordLength 30 //单词的最大长度 typedef int Status; typedef int ElemType; //定义链表的数据元素类型为整型 typedef int Boolean; typedef struct { char item[MaxWordNum][MaxWordLength]; //字符串的数组 int last; //词表的长度 }WordListType; //词表的类型(顺序表) typedef struct { char *ch; //如果是非空串,则按串长分配存储区,否则ch为NULL int length; //串长度 }HString; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*Link,*Position; typedef struct { Link head,tail; int len; }LinkList; typedef struct { HString key; //关键词 LinkList bnolist; //存放书号索引的链表 }IdxTermType; //索引项类型 typedef struct { IdxTermType item[MaxKeyNum+1]; int last; }IdxListType; //索引表类型 //----------------主要变量-------------- char buf[MaxLineLen]; //书目串缓冲区 WordListType wdlist; //关键字词表 IdxListType idxlist; //索引表 char oftenwords[6][10] = {"an","a","of","and","to","the"}; /*******************************声明部分****************************************/ //--------------基本操作--------- void InitIdxList (IdxListType *idxlist); //初始化操作,置索引表idxlist为空表,且在idxlist.item[0]设一空串 void GetLine (FILE *f); //从文件F读入一个书目信息到书目串缓冲区buf void ExtractKeyWord (int *Num); //Status ExtractKeyWord(char* Buffer,WordListType *w,int *Num); //从buf中提取书名关键词到词表wdlist,书号存入bno Status InsIdxList (IdxListType *idxlist,ElemType bno); //将书号为bno的书名关键词按词典顺序插入索引表idxlist void PutText (FILE *g,IdxListType idxlist); //将生成的索引表idxlist输出到文件g //--------------为实现在索引表上进行插入,要先实现下列操作----------- void GetWord (int i,HString *wd); //用wd返回词表wdist中第i个关键词 int Locate (IdxListType *idxlist,HString wd,Boolean *b); //在索引表idxlist中查询是否存在与wd相等的关键词。若存在,则返回其在索引表 //中的位置,且b取值TRUE;否则返回插入位置,且b取值FALSE void InsertNewKey(int j,HString wd); //在索引表idxli的第i项上插入新关键词wd,并初始化书号索引的链表为空表 Status InsertBook (int i,int bno); //在索引表idxlist的第i项中插入书号为bno的索引 //------------串的堆分配存储表示----------- Status StrAssign(HString *T,char *chars); //生成一个其值等于串常量chars的串T int StrCompare(HString S,HString T); //若S>T,则返回值>0,若S=T,则返回值 = 0,若S<T,则返回值<0 Status StrCopy(HString *T, HString S); //由串S复制得串T //----------------带头结点的线性链表------------- Status InitList(LinkList *L); //构造一个空的线性链表L Status MakeNode(Link *p,ElemType e); //分配由p指向值e的结点,并返回OK;若分配失败,则返回ERROR Status Append (LinkList *L,Link s); //将指针s所指的一串结点链接在线性链表L的最后一个结点 //之后,改变链表L的尾指针指向新的尾结点 /*******************************函数部分****************************************/ Status StrAssign(HString *T,char *chars) { int i = strlen(chars); if((*T).ch) free((*T).ch); if(!i){ //若chars为空 (*T).ch = NULL; (*T).length = 0; } else{ //chars不空 if(!((*T).ch = (char *)malloc(i * sizeof(char)))) //为T分配chars所需的存储空间 exit(OVERFLOW); int count; for(count = 0;count <= i;count++) //把chars存入T中 (*T).ch[count] = chars[count]; (*T).length = i; } //else return OK; } void InitString(HString *T) { (*T).length = 0; (*T).ch = NULL; } int StrCompare(HString S,HString T) { int count; for(count = 0;count<S.length && count<T.length;count++){ if(S.ch[count] != T.ch[count]) return S.ch[count]-T.ch[count] ; } return S.length-T.length; } Status StrCopy(HString *T, HString S) { int j; if((*T).ch) free((*T).ch); //删除T串中原有值 (*T).ch = (char*)malloc(S.length * sizeof(char)); if(!(*T).ch) exit(OVERFLOW); for(j = 0; j <= S.length; j++) (*T).ch[j] = S.ch[j]; (*T).length = S.length; return OK; } Status InitList(LinkList *L) { Link p; p = (Link)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); p->next = NULL; (*L).head = (*L).tail = p; (*L).len = 0; return OK; } Status MakeNode(Link *p,ElemType e) { *p = (Link)malloc(sizeof(LNode)); if(!(*p)) exit(OVERFLOW); (*p)->data = e; (*p)->next = NULL; return OK; } Status Append (LinkList *L,Link s) { int i = 1; (*L).tail->next = s; while(s->next){ s = s->next; i++; } (*L).tail = s; (*L).len += i; return OK; } void GetWord(int i,HString *wd) { char *p; p = *(wdlist.item +i); StrAssign(wd,p); //生成关键字字符串 } int Locate(IdxListType *idxlist,HString wd,Boolean *b) { int i,m; for(i = (*idxlist).last-1; ( m=StrCompare((*idxlist).item[i].key,wd) ) >0; --i); if(m == 0){ //找到 *b = TRUE; return i; } else{ *b = FALSE; return i+1; } } void InsertNewKey(int j,HString wd) { int count; InitList(&idxlist.item[idxlist.last+1].bnolist); for(count = idxlist.last-1; count>=j; --count){ //后移索引项 idxlist.item[count+1] = idxlist.item[count]; } InitString(&idxlist.item[j].key); StrCopy(&idxlist.item[j].key,wd); //插入新的索引项 //串赋值 InitList(&idxlist.item[j].bnolist); //初始化书号索引表为空表 ++idxlist.last; } Status InsertBook (int i,int bookno) { Link p; if(!MakeNode(&p,bookno)) return ERROR; Append(&idxlist.item[i].bnolist,p); return OK; } Status InsertIdxList(IdxListType *idxlist,int bno) { int i,j; HString wd; Boolean b; InitString(&wd); for(i= 0;i<wdlist.last;++i){ GetWord(i,&wd); //获取wdlist中保存的单词 j = Locate(idxlist,wd,&b); //查找是否已存在于idxlist中 if(!b) //不存在 InsertNewKey(j,wd); //则插入新的关键词 InsertBook(j,bno); //插入书号 } return OK; } void InitIdxList (IdxListType *idxlist) { int i; (*idxlist).last = 0; for(i = 0;i<MaxKeyNum;i++){ InitList(&(*idxlist).item[i].bnolist); //初始化索引表项目中的书号的链表 } } void ExtractKeyWord (int *BookNum) { int i = 0,j = 0,k = 0,m; wdlist.last = 0; //很重要 Boolean Ignore; char TempChar[30]; for(m = 0;m<=30;m++) TempChar[m] = '\0'; //清空TempChat[] while(*(buf+i) !=' '){ //提取书目串缓冲区其中的书号 TempChar[i] = *(buf+i); //将书号以字符串类型保存在该数组中 i++; } TempChar[i] ='\0'; *BookNum = atoi(TempChar); //将书号转为int for(m = 0;m<=i;m++) TempChar[m] ='\0'; //清空TempChat[] i++; //推进一位,当前*(buf+i)开始为书名 while(*(buf+i) !='\n' && *(buf+i) != '\0'){ //每个字符串末尾都有结束符\n if(*(buf+i) != ' '){ //若非空字符 if(*(buf+i) >'A'&& *(buf+i) <= 'Z'){ *(buf+i) -= 'A' - 'a'; //若为大写,则转为小写 } TempChar[j] = *(buf+i); //把当前字符加入TempChar中//------------ j++; i++; } //if else{ //若为空字符,则检索当前TempChar中保存的字符串是否为常用词 Ignore = FALSE; //若Ignore为TRUE,则为常用词;为FALSE则不是常用词 for(m = 0;m<6;m++){ //查找是否为常用词 if(strcmp(TempChar,oftenwords[m]) == 0){ Ignore = TRUE; //是常用词 break; }//if }//for if(Ignore){ for(m = 0;m<=j;m++) TempChar[m] = '\0'; //清空TempChat[] i++; j = 0; }//if else{ //不是常用词 for(m = 0;m<=j;m++) //将该词插入wdlist中 wdlist.item[wdlist.last][m] = TempChar[m]; for(m = 0;m<=j;m++) TempChar[m] = '\0'; //清空TempChat[] k++; wdlist.last++; i++; j=0; }//else }//else }//while } void GetLine(FILE *f) { fgets(buf,MaxLineLen,f); } void PutText (FILE *g,IdxListType idxlist) { int i,j,k; Link p; for(i = 0;i<=idxlist.last;i++){ for(j = 0;j<idxlist.item[i].key.length; j++) putc(*(idxlist.item[i].key.ch + j),g); putc('\t',g); if(idxlist.item[i].key.length < 8) putc('\t',g); p = idxlist.item[i].bnolist.head; for(k = 0;k<idxlist.item[i].bnolist.len ; k++){ p = p->next; fprintf(g,"%03d",p->data); putc(' ',g); }//for putc('\n',g); }//for } void PrintFile(FILE *FileName) { char ch; rewind(FileName); ch = getc(FileName); while(ch != EOF){ putchar(ch); ch = getc(FileName); } printf("\n"); rewind(FileName); } /*******************************主函数部分**************************************/ int main() { FILE *f,*g; int ct; int BookNo; if((f = fopen("BookName.txt","r")) == NULL){ printf("ERROR in open BookName.txt\n"); exit(1); } if((g = fopen("KeyWordIndex_self.txt","w"))==NULL){ printf("ERROR in open KeyWordIndex_self.txt\n"); exit(1); } printf("书单文件:\n"); PrintFile(f); InitIdxList(&idxlist); WordListType w; while(!feof(f)){ GetLine(f); //读取书单文件中的一行到缓冲区 ExtractKeyWord(&BookNo); InsertIdxList(&idxlist,BookNo); } PutText(g,idxlist); fclose(f); fclose(g); printf("\n结果如下:\n"); if((g = fopen("KeyWordIndex_self.txt","r"))==NULL){ printf("ERROR in open KeyWorkIndex_self.txt\n"); exit(1); } PrintFile(g); fclose(g); return 0; }
请教大佬为什么我在C++里定义的string类字符串依次赋值后长度变成零?
C++语言 用链表实现长整数加法 ``` #include <iostream> #include <string> #include <cstdlib> using namespace std; struct section{ int data; section *next; }; section *getchain(string m){ int flag,sigbit; //flag:1代表正,-1代表负 int length; if(m[0]=='-') {flag=-1; sigbit=1;length =m.length()-1;} else if(m[0]=='+') {flag=1;sigbit=1; length =m.length()-1;} else {flag=1; cout << "确认没有符号位" << endl; sigbit=0; length=m.length();} cout << "字符长为: " << length << endl; section *head, *p, *rear; head=rear=new section; head->data=flag; cout << "符号为:" << head->data << endl; while(length>=5){ p=new section; p->data=m[length-1+sigbit]-'0'+10*(m[length-2+sigbit]-'0')+100*(m[length-3+sigbit]-'0')+1000*(m[length-4+sigbit]-'0'); length=length-5; rear->next=p; rear=p; cout <<"确认节点内容:" << rear->data << endl; } switch(length){ case 0: cout << "ERROR1" << endl;break; case 1: p=new section; p->data=m[length-1+sigbit]-'0';rear->next=p;rear=p;cout << "!!!确认节点内容:" << rear->data << endl; break; case 2: p=new section; p->data=m[length-1+sigbit]-'0'+10*(m[length-2+sigbit]-'0'); rear->next=p;rear=p; break; case 3: p=new section; p->data=m[length-1+sigbit]-'0'+10*(m[length-2+sigbit]-'0')+100*(m[length-3+sigbit]-'0');rear->next=p;rear=p; break; case 4: p=new section; p->data=m[length-1+sigbit]-'0'+10*(m[length-2+sigbit]-'0')+100*(m[length-3+sigbit]-'0')+1000*(m[length-4+sigbit]-'0');rear->next=p;rear=p; break; default: cout << "ERROR2"; } p= new section; p->data=0; rear->next= p; rear=p; rear->next= NULL; return head; } //比较两长整数绝对值的大小,如果左数大就输出1,右数大就输出-1,相等输出0 int compare(string m, string n){ int lengthm, lengthn, sigbitm, sigbitn; if(m[0]=='+'||m[0]=='-') {lengthm= m.length()-1; sigbitm=1;} else {lengthm= m.length(); sigbitm=0;} if(n[0]=='+'||n[0]=='-') {lengthn= n.length()-1; sigbitn=1;} else {lengthn= n.length(); sigbitn=0;} if(lengthm!=lengthn) { if(lengthm>lengthn) return 1; else if(lengthm<lengthn) return -1; else {cout << "ERROR3"; return 0;} } else for(int i=0;i<lengthm;++i){ if(m[i+sigbitm]>n[i+sigbitn]) return 1; else if(m[i+sigbitm]<n[i+sigbitn]) return -1; } return 0; } section *pluschain(section *i, section *j, string m, string n){ section *head, *p, *rear, *pi, *pj; pi= i; pj= j; head= rear= new section; int carrybit=0; //确定头结点符号 if(pi->data==1&&pj->data==1) head->data=1; else if(pi->data==-1&&pj->data==-1) head->data=-1; else if(pi->data==1&&pj->data==-1) head->data=compare(m,n); else if(pi->data==-1&&pj->data==1) head->data=compare(n,m); else cout << "ERROR4"; pi= pi->next; pj= pj->next; p= new section; while(pi->next!=NULL||pj->next!=NULL){ if(pi->next!=NULL&&pj->next!=NULL){ if((i->data)*(j->data)==1){ p->data= pi->data+pj->data+carrybit; if(p->data>9999) {p->data= p->data-10000; carrybit=1;} else carrybit=0; } else if(((i->data)*(j->data)==-1)&&compare(m,n)==1){ p->data= pi->data-pj->data+carrybit; if(p->data<0) {p->data= p->data+10000; carrybit=-1;} else carrybit=0; } else if(((i->data)*(j->data)==-1)&&compare(m,n)==-1){ p->data= pj->data-pi->data+carrybit; if(p->data<0) {p->data= p->data+10000; carrybit=-1;} else carrybit=0; } } else if(pi->next!=NULL&&pj->next==NULL){ if((i->data)*(j->data)==1){ p->data= pi->data+carrybit; if(p->data>9999) {p->data= p->data-10000; carrybit=1;} else carrybit=0; } else if(((i->data)*(j->data)==-1)&&compare(m,n)==1){ p->data= pi->data+carrybit; if(p->data<0) {p->data= p->data+10000; carrybit=-1;} else carrybit=0; } else if(((i->data)*(j->data)==-1)&&compare(m,n)==-1){ cout << "ERROR5"; } } else if(pi->next==NULL&&pj->next!=NULL){ if((i->data)*(j->data)==1){ p->data= pj->data+carrybit; if(p->data>9999) {p->data= p->data-10000; carrybit=1;} else carrybit=0; } else if(((i->data)*(j->data)==-1)&&compare(m,n)==1){ cout << "ERROR6"; } else if(((i->data)*(j->data)==-1)&&compare(m,n)==-1){ p->data= pj->data+carrybit; if(p->data<0) {p->data= p->data+10000; carrybit=-1;} else carrybit=0; } } else cout << "ERROR7"; rear->next= p; rear= p; cout << "每一个节点中的数据为:" << rear->data << endl; p= new section; if(pi->next!=NULL) pi= pi->next; if(pj->next!=NULL) pj= pj->next; } p->data=carrybit; rear->next= p; rear= p; rear->next=NULL; return head; } string getversalongint(section *n){ section *p, *head; head=n; p=head->next; string z; if(head->data==1) {z[0]='+'; cout << "z[0]为:"<< z[0] << endl;} else if(head->data==-1) z[0]='-'; else{z="0"; return z;} int k=0; do{ if(p->data>999){ z[4*k+1]='0'+p->data%10; p->data=p->data/10; cout << "z[4*k+1]=" << z[4*k+1] << endl; z[4*k+2]='0'+p->data%10; p->data=p->data/10; cout << "z[4*k+2]=" << z[4*k+2] << endl; z[4*k+3]='0'+p->data%10; p->data=p->data/10; cout << "z[4*k+3]=" << z[4*k+3] << endl; z[4*k+4]='0'+p->data; cout << "z[4*k+4]=" << z[4*k+4] << endl; } else if(p->data>99){ z[4*k+1]='0'+p->data%10; p->data=p->data/10; z[4*k+2]='0'+p->data%10; p->data=p->data/10; z[4*k+3]='0'+p->data; z[4*k+4]='0'; } else if(p->data>9){ z[4*k+1]='0'+p->data%10; p->data=p->data/10; z[4*k+2]='0'+p->data; z[4*k+3]='0'; z[4*k+4]='0'; } else if(p->data>=0){ z[4*k+1]='0'+p->data; cout << "z[4*k+1]=" << z[4*k+1] << endl; z[4*k+2]='0'; cout << "z[4*k+2]=" << z[4*k+2] << endl; z[4*k+3]='0'; cout << "z[4*k+3]=" << z[4*k+3] << endl; z[4*k+4]='0'; cout << "z[4*k+4]=" << z[4*k+4] << endl; } else cout << "ERROR8"; p= p->next; ++k; }while(p->next!=NULL); z[4*k+5]='\r'; cout << "ifzempty=" << z.empty() << endl; return z; } int main() { //读入两个数据并记录符号 cout << "请输入两个长整数,不能以0为最高位,从低位起每四位用英文逗号隔开" << endl; string x,y; cin >> x >> y; //创建链表,将数据保存,返回链表的首尾指针 section *a, *b; a=getchain(x); //!数组名是一个地址常量而不是变量,所以不能被赋值 b=getchain(y); //实现两数相加 section *c; c=pluschain(a, b, x, y); //输出结果 string z; z=getversalongint(c); cout << "两数相加结果为:" << endl; //输出时注意去掉首位的0 cout << "z=" << z << endl; cout << z[0]; int zlength=z.length(); bool flag=false; for(int i=zlength-1;i>0;--i){ if(z[i]=='0') {if(flag) cout<< z[i];} else {flag=true; cout<< z[i];} } //至此,所有动态申请的空间均没有delete //输出结果也没有加逗号 return 0; } ``` 依次赋值后在输出每位都没有问题,但是最后一句的输出结果总是:ifzempty=1,之后main函数输出z的时候也是什么也输出不了。 请问这是为什么啊? 怎么修改呢?
很简单的一个关于单链表的问题
新手,遇到指针方面的问题, 按我观察的,在InitList函数中申请了头结点的内存,并将头结点的指针域赋值为NULL,但是不知为何退出InitList函数之后头结点的next就不是NULL了,导致在AddNode_R函数中将pr指针移动链表尾的操作导致错误。 在这里先谢谢各位了. ``` //#include "stdafx.h" #include <stdio.h> #include <stdlib.h> const int OK = 1; const int ERROR = 0; typedef struct LNode { int data; struct LNode *next; }LinkList; int InitList(LinkList *head); int AddNode_R(LinkList *head); int main() { LinkList *L; InitList(L); printf("--------------------------------------\n"); while(1) { printf("是否申请新的节点(y/n):"); if(getchar()=='y') { AddNode_R(L); } if(getchar()=='n') { } } system("pause"); return 0; } int InitList(LinkList *head) { head = (LinkList *)malloc(sizeof(LinkList)); //生成新的节点作为头结点,用头指针Head作为头结点 if (head == NULL) { printf("没有足够的内存!\n"); exit(1); } head->next = NULL; //防止指针乱指 return OK; } int AddNode_R(LinkList *head) //后插添加节点,每次插入一个节点 { LinkList *pr = head; //移动节点 LinkList *p = NULL; //新指针 p = (LinkList *)malloc(sizeof(LinkList)); //新节点,为了防止错误(下一步),要与定义部分分开, if (p == NULL) //防止错误 { printf("没有足够的内存\n"); exit(0); } p->next = NULL; //防止错误 //此处出错,为什么在上一个函数退出回到main,head-next会增加1个位置尾0x01,明明在InitList最后将head-next赋值为NULL while (pr->next != NULL) //移动指针到尾部 { pr = pr->next; } pr->next = p; //新节点连接在尾节点之后 //数据输入区域(可修改) int data; printf("请输入节点数据(int):"); scanf("%d", &data); p->next = NULL; //防止出错 return OK; } ```
单链表的插入,删除,基本问题!着急!!!
刚刚开始学习单链表,遇到一点问题,之前学过一点点的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; }
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
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优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问