C语言链表插入操作,一个函数

Description

已知线性表中元素为整数,且按照升序排列。编写算法实现在线性表中查找值为x的元素,如果查找成功,返回1;否则,返回0,并且把x插入到正确的位置,使线性表仍按升序排列。

依次输出调用查找插入算法后的线性表中的元素。

提示:存储结构采用代表头结点的循环单链表,结点结构如下:

typedef struct Node

{

int data;   

struct Node *next;

}LNode,*LinkList;

要求:

(1)编写函数建立循环单链表CreateLinkList(int n),函数返回值类型为LinkList。

LinkList CreateLinkList(int n)

{

/*按照升序输入n个整数,建立带表头结点的循环单链表*/

}

(2) 编写查找函数QueryLinkList(LinkList *L,int x)实现查找并插入功能,函数返回值类型int。

int QueryLinkList(LinkList *L,int x)

{

/*查找值为x的元素,若查找成功返回1,否则返回0,并把x插入到相应的位置。*/

}

(3)编写函数Display(LinkList L),输出线性表中的元素。

(4)main函数调用QueryLinkList()函数,输出查找结果,然后调用Display函数依次输出线性表中的元素。

Input

输入元素个数n

依次输入n个升序排列的整数

输入带查找的元素值x

Output

输出查找结果1或者0

依次输出线性表中的元素值

Sample Input
sample 1:
6
2 5 8 10 12 16
10

sample2:

6
2 5 8 10 12 16
9

Sample Output
sample 1:
1
2 5 8 10 12 16

sample2:
0
2 5 8 9 10 12 16

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言链表插入节点出错,不知道插入函数错在哪一步
#include<stdio.h> #include<stdlib.h> #include<string.h> struct date { int year; int month; int day; }; struct student { int num; char name[10]; int score[2]; struct date birth; struct student *pnext; }; int icount; struct student *create() { struct student *phead=NULL; struct student *pnew,*pend; icount=0; printf("please input the information:\n"); pend=pnew=(struct student*)malloc(sizeof(struct student)); scanf("%d",&pnew->num); scanf("%s",pnew->name); scanf("%d,%d",&pnew->score[0],&pnew->score[1]); scanf("%d,%d,%d",&pnew->birth.year,&pnew->birth.month,&pnew->birth.day); while(pnew->num!=0) { icount++; if(icount==1) { pnew->pnext=phead; pend=pnew; phead=pnew; } else { pnew->pnext=NULL; pend->pnext=pnew; pend=pnew; } printf("please input the information:\n"); pend=pnew=(struct student*)malloc(sizeof(struct student)); scanf("%d",&pnew->num); scanf("%s",pnew->name); scanf("%d,%d",&pnew->score[0],&pnew->score[1]); scanf("%d,%d,%d",&pnew->birth.year,&pnew->birth.month,&pnew->birth.day); } free(pnew); return phead; } struct student *Insert(struct student *phead) { struct student *ptemp,*pnew; int i=1,n; ptemp=phead; printf("please enter the location you want to insert:\n"); scanf("%d",&n); while((n<0)||(n>icount)) { printf("input error,please reinput:\n"); scanf("%d",&n); } while(i<n) { ptemp=ptemp->pnext; i++; } printf("please input the information:\n"); pnew=(struct student*)malloc(sizeof(struct student)); scanf("%d",&pnew->num); scanf("%s",pnew->name); scanf("%d,%d",&pnew->score[0],&pnew->score[1]); scanf("%d,%d,%d",&pnew->birth.year,&pnew->birth.month,&pnew->birth.day); pnew->pnext=ptemp->pnext; ptemp->pnext=pnew; icount++; return phead; } void Print(struct student *phead) { struct student *ptemp; int j=1; ptemp=phead; printf("there are all %d students' information:\n",icount); while(ptemp!=NULL) { printf("this is the NO.%d students' information:\n",j); printf("number:%d\n",ptemp->num); printf("name:%s\n",ptemp->name); printf("Maths:%d,Chinese:%d\n",ptemp->score[0],ptemp->score[1]); printf("birthday--year:%d,month:%d,day:%d\n",ptemp->birth.year,ptemp->birth.month,ptemp->birth.day); ptemp=ptemp->pnext; j++; } } int main() { struct student *p; p=create(); p=Insert(p); Print(p); return 0; }
将一个新项目插入到链表中
用c语言设计一个函数,将一个新项目插入到链表中,该过程的参数是两个指针,一个指向带插入列表项目 另一个指向待插入的列表中的一个元素,这该怎么设计呢?
c语言链表头部插不进去信息
![图片说明](https://img-ask.csdn.net/upload/201702/21/1487658991_690580.png)![![图片说明](https://img-ask.csdn.net/upload/201702/21/1487659037_239052.png)图片说明](https://img-ask.csdn.net/upload/201702/21/1487659022_155222.png) 图片是链表的插入部分代码,头部认为是0位置 ,现在除了头部之外 其他地方都可以插入信息了 ,但是插入到头部 遍历出来的还是没有 这个是什么问题啊 check是遍历的函数
线性链表数据结构的插入与删除
在你自己的文件下,建立一个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,然后输出链表结点的存储单元地址和相应的数值;
链表中按顺序插入的操作用C语言实现的结果不对
listnodep insert_mid(listnodep head, listnodep newnode) //按排序顺序进行链表的建立 { if (head == NULL) head = newnode; listnodep temp = head; listnodep pre; while (temp->nextptr != NULL) { if (newnode->data > temp->data) { pre = temp; temp = temp->nextptr; } else break; } pre->nextptr = newnode; newnode->nextptr = temp; return head; } 这是我刚刚写的一个调用函数,实现的功能:按升序顺序进行链表排列;传入的参数:指向链表的头指针,要插入新的结点; 但是没有达到想要实现的功能,请大神赐教
C语言链表操作第一个数总是0,帮忙看下谢谢
C语言写单链表,插入数据的时候第一个数不管输入的是多少都是0。大家帮忙看下哪里错了呀?谢谢了。 //结点结构定义 struct node { int data; struct node *next; }; //单链表的基本结构体 typedef struct list { struct node *pHead; int length; }LinkList; /****************功能1:创建一个单向链表****************/ int createList(struct node **pHead){ struct node *pNew; if (pHead == NULL) //参数校验 { return PARAM_ERROR; } //创建表头结点 pNew = (struct node *)malloc(sizeof(struct node));//申请空间 if (pNew==NULL) { return MALLOC_ERROR; } memset(pNew, 0, sizeof(struct node)); pNew->data = 0; pNew->next = NULL;//空表,没有后续结点 *pHead = pNew; return 0; } /**********功能4:插入结点***********/ int Insert(struct node *pHead, int value, int pos) { int icount = 0; //计数器 struct node *p; struct node *pNew = NULL; //struct node *pPre = NULL; //参数校验 if (pHead==NULL) { return PARAM_ERROR; } p = pHead; //寻找第pos-1个结点,令p指向它 while( p!=NULL && icount < pos-1) { //printf("%d ", icount); p=p->next; icount++; } //申请新结点pNew pNew = (struct node *)malloc(sizeof(struct node)); if (pNew==NULL) { return MALLOC_ERROR; } pNew->data =value; pNew->next = p->next ; //在p结点之后插入新结点 p->next = pNew; return 0; } //主函数 int main(void) { int ret; struct node *pHead; //创建链表,并填入数据 ret= createList(&pHead); //printf("%d",ret); //创建成功 //插入数据 ret = Insert(pHead, 3, 0); ret = Insert(pHead, 8, 1); ret = Insert(pHead, 1, 2); ret = Insert(pHead, 7, 3); //printf("%d",ret);//插入成功 //输出 ret = output(pHead); //根据角标查找数据 ret = Get(pHead, 2 , 0); printf("get at 2 is %d\n", ret); //查询表长 ret = ListLength(pHead); printf("list length is %d\n", ret); //删除数据 ret = Delete(pHead, 1 ,0); printf("already del num %d\n",ret); ret = ListLength(pHead); printf("list length is %d\n", ret); ret = output(pHead); //销毁链表 ret = destroyList(pHead); if (ret == 0) { printf("销毁成功!\n"); } else { printf("销毁失败!\n"); ret = ListLength(pHead); printf("list length is %d\n", ret); } return 0; }
用C语言完成以下功能:数据的录入、显示,链表的创建,插入数据,删除数据。每个功能用一个函数来实现。
1)定义家庭住址结构体adress,包含成员有:省份、城市、街道;定义成绩结构体score,包含成员有:“C程序设计”、“Java程序设计”、“Basic成绩设计”的成绩;再定义学生结构体student,包含的成员有:学号、姓名、性别、成绩、家庭住址、下一个结点指针,其中成绩类型定义为score类型的结构体,家庭住址的类型定义为adress结构体。下一个结点指针的类型定义为学生结构体。 2)定义头结点的结构体head,其成员为指向学生结构体的指针。 3)插入数据时学号要按照升序排列。
数据结构C语言链表输入排序问题
题目: 持续输入 学号,姓名,地址 -1终止输入 _再按照学号从小到大顺序输出_ 个人感觉问题可能出在31行到38行 插入在链表最前面的时候会出现问题,其他情况没有问题 _测试 输入会错误的情况(插在开头):_ 3,sfdfs,sdfsfd 2,sdf,sdf,sfd -1 测试 输入会正确的情况: 3,sdf,sd,sfd 5,fsd,sdf 4,dsf,sdf -1 /////姓名和地址就乱打几个字符了。。。 下面是关于链的的数据的调试截图(输出_会错误的情况_,数据见上文 ) ![图片说明](https://img-ask.csdn.net/upload/201804/02/1522667445_697244.png) 直到输入 —1终止前 ,都是正确的(↑↑↑第一张调试图,排序也是对的) 但是终止后,就会无限输出开头的(↓↓↓最后输入的插到开头的那个数) 主链变成next永远指向自己的。 ![图片说明](https://img-ask.csdn.net/upload/201804/02/1522667643_272901.png) 虽然是用双链表写的,但是没什么关系。 个人感觉问题在出在指针返还值或者函数返还值上面,_步骤应该都是没有问题的_,调试了很多遍 ``` #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node { char name[20]; char add[20]; int nu; struct node *pre; struct node *next; }Newnode; Newnode sort( node *q, Newnode *inser ) /* sort+insert 找到位置插入 */ { Newnode *temp = q; while ( 1 ) { if ( temp->next == NULL && temp->nu < inser->nu ) /* 插在尾的情况,插入数大于所有temp + 第一个数时插在后面 */ { temp->next = inser; inser->pre = temp; return(*q); } if ( temp->pre == NULL && temp->nu > inser->nu ) /* 第一个数时插在前面 */ { /* printf("okOK"); */ /* temp->pre=inser; */ inser->next = temp; return(*inser); } } inser->next = temp; inser->pre = temp->pre; temp->pre->next = inser; temp->pre = inser; return(*q); } Newnode add( Newnode *q ) //q就是主链的地址 { int count = 0; while ( 1 ) { Newnode *newnode; newnode = (Newnode * ) malloc( sizeof(Newnode) ); scanf( "%d,", &newnode->nu ); if ( newnode->nu == -1 ) { return(*q); } newnode->next = NULL; newnode->pre = NULL; scanf( "%[^,]%[^\n]", newnode->name, newnode->add ); if ( q->pre == NULL && q->next == NULL && count == 0 ) { q = newnode; count++; /* 第一个数的输入,只输入一次 */ continue; }else *q = sort( q, newnode ); /* 从第二个数开始就插入,这里的指针传递对吗。。。 */ } return(*q); } void printall( Newnode *q ) { Newnode *temp = q; /* temp当前指针 */ printf( "%d %s %s\n", q->nu, q->name, q->add ); temp = temp->next; /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */ while ( temp != NULL ) { printf( "%d %s %s\n", temp->nu, temp->name, temp->add ); temp = temp->next; } /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */ } /* ////////////////////// */ int main( void ) { char inpu; int inpu2; Newnode p; p.pre = NULL; p.next = NULL; p = add( &p ); printall( &p ); } ``` 第一个特别输入 其他 找到位置,然后插入,排序一个插入一个。 调试调试吧。 再次说一下,步骤应该是没有问题的。(除了插在开头的情况会出现错误)调试了很多数据了。感觉问题应该出在指针返还上面。
c语言链表建立的问题。。。求人来解答
``` #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct student {int number; struct student *next; } NODE; typedef struct student node; typedef node *link; link creatlist() { link head,p,q; int a; char ch; head=(link)malloc(sizeof(struct student)); p=head; printf("请输入相关学号:(以?结尾)/n"); while(ch!='?') {q=(link)malloc(sizeof(struct student)); scanf("%d",&a); q->number=a; p->next=q; p=q; ch=getchar(); } p->next=NULL; return(head); } link add(link head,int a) {int i,m; char ch; link ptr; for(i=0;i<a;i++) head=head->next; printf("请输入要插入的学号(以?结尾):"); while(ch!='?') {scanf("%d",&m); ptr=(link)malloc(sizeof(struct student)); ptr->number=m; ptr->next=head->next; head->next=ptr; head=ptr; ch=getchar(); return 0; } } void print(link head) {head=head->next; while(head!=NULL) {printf("%5d",head->number); head=head->next; } printf("\n") ; } int main() {link a; int n; a=creatlist(); print(a); printf("请输入要插到第几项的项数:"); scanf("%d",n); add(a,n); printf("ok!"); print(a); return 0; } ``` 当调用add的函数时显示停止工作,这段代码是为了建立一个链表和插入链表的实现。。求大神解答。。 ps:觉得麻烦的话不用改正,告诉我为什么会出现这种情况就行了。 在此拜谢orz
关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点
下面代码主要实现链表的创建,插入,删除,并且能将两个年龄递增链表进行合并成递减链表 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错。。功力不足实在解决不了。。跪求大神解答。。(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去。。我肉眼实在找不出来。。 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> int a[10]={0}; int c[10]={0}; char b[100][10]; char d[100][10]; typedef struct stuInfo { char stuName[10];/*学生姓名*/ int age; /*年龄*/ } ElemType; typedef struct node { ElemType data; struct node *next; }LNode,*ListPtr;/*定义结构*/ ListPtr List_Init(int a[],char b[][10],int n){/*链表载入数据*/ LNode *s,*h; int i; h=NULL; h=(LNode*)malloc(sizeof(LNode)); h->data.age=0; memset(h->data.stuName,0,10*sizeof(char)); h->next=NULL; for(i=n-1;i>=0;i--) { s=(LNode*)malloc(sizeof(LNode));/*分配内存*/ memset(s->data.stuName,0,10*sizeof(char)); s->data.age=a[i];/*把年龄载入*/ strcpy(s->data.stuName,b[i]);/*把名字载入*/ s->next=h->next;/*新的结点指向头节点的下一个结点*/ h->next=s;/*头结点指向新的结点*/ } return h; } ListPtr List_Insert (ListPtr h, ElemType x){/*结点插入*/ LNode *s; s=(LNode*)malloc(sizeof(LNode)); s->data.age=x.age; strcpy(s->data.stuName,x.stuName);/*分配空间结点载入*/ s->next=h->next;/*新的结点指向前一个结点的后一个结点*/ h->next=s;/*前一个结点指向新结点*/ return h; } void List_Destroy(ListPtr h,ListPtr L){ LNode *s,*p; s=L->next;/*指向第一个结点*/ p=s; while(s){/*寻找所要删除的数据结点的前一个结点*/ if(s->data.age==h->data.age&&strcmp(s->data.stuName,h->data.stuName)==0) break; p=s; s=s->next; } s=p->next;/*s指定要删除的结点*/ p->next=s->next;/*前一个结点指向所要删除结点的后一个结点*/ free(s); } ListPtr List_Merge(ListPtr La, ListPtr Lb){/*链表变换,使递增链表变为递减链表,并去重*/ LNode *s, *pa, *pb; pa=La->next; pb=Lb->next;/*各指向两个链表的头结点*/ La->next=NULL; while(pa!=NULL&&pb!=NULL){ if(pa->data.age<=pb->data.age){ s=pa->next; pa->next=La->next; La->next=pa; pa=s;/*如果pa指向的年龄比pb的小则保留并逆置,pa指针指向下一个数据*/ if(strcmp(pa->data.stuName,pb->data.stuName)==0){ pb=pb->next;/*如果pa和pb所指的是同一个人,则pb也指向下一个数据,避免重复*/ } } else{ s=pb->next; pb->next=La->next; La->next=pb; pb=s; }/*如果pb指向的年龄比pa的小,则插入到La链表中*/ } while(pa!=NULL){ s=pa->next; pa->next=La->next; La->next=pa; pa=s;}/*处理La未处理的数据*/ while(pb!=NULL){ s=pb->next; pb->next=La->next; La->next=pb; pb=s;}/*处理Lb未处理的数据*/ Lb->next=NULL; free(Lb);/*释放Lb*/ } void OutPut(ListPtr La){/*输出链表*/ LNode *s; s=La->next; while(s){ printf("%s\t%d\n",s->data.stuName, s->data.age); } } int main(){ ElemType x; int n,i,j; ListPtr La=NULL, Lb=NULL; LNode *p,*r; for(i=0;i<10;i++){ memset(b[i],0,10*sizeof(char)); memset(d[i],0,10*sizeof(char)); }/*初始化字符串数组*/ strcpy(b[0],"Levis");a[0]=22; strcpy(b[1],"Adam");a[1]=23; strcpy(b[2],"Lord");a[2]=26; strcpy(b[3],"Fred");a[3]=28; strcpy(b[4],"May");a[4]=30; strcpy(b[5],"York");a[5]=35; La=List_Init(a, b, 6); /*La数据载入*/ strcpy(d[0],"Yuki");c[0]=19; strcpy(d[1],"Soraru");c[1]=27; strcpy(d[2],"Katin");c[2]=29; strcpy(d[3],"Sinsan");c[3]=31; strcpy(d[4],"York");c[4]=35; Lb=List_Init(c, d, 5); /*Lb数据载入*/ printf("choose operation: 1. insert 2. delete 3.nothing: "); scanf("%d",&j); if(j==1){ printf("enter the student's name you want to insert:");/*插入数据操作*/ gets(x.stuName); printf("enter the student's age:"); scanf("%d",&x.age); p=La->next; while(p){/*查找La中是否有此人*/ if(strcmp(p->data.stuName,x.stuName)==0) break; p=p->next; } if(p=NULL){/*如果没则寻找插入位置*/ p=La->next;r=p; while (p){ if(x.age<=p->data.age) break; r=p; p=p->next;/*找到比它大的值后,r记录此结点的前一个结点*/ } List_Insert (r, x);/*在r后插入此数据结点*/ } else{ p=Lb->next;/*La中已有此人,则查找Lb*/ while(p){ if(strcmp(p->data.stuName,x.stuName)==0) break; p=p->next; } if(p=NULL){ p=Lb->next;r=p; while (p){ if(x.age<=p->data.age) break; r=p; p=p->next; } List_Insert (r, x);}}/*同La*/ if(p!=NULL){ printf("inserted fail");}/*如果两链表中已有此人,则表示插入失败*/ } if(j==2){ printf("enter the student's name you want to delete:");/*进行删除操作*/ gets(x.stuName); printf("which lianbiao do you choose, if La, input 1;Lb,input 2:");/*选择要插入的链表*/ scanf("%d",&i); if(i==1){ p=La->next; while(p){ if(strcmp(p->data.stuName,x.stuName)==0)/*查找La中此人的位置*/ break; p=p->next;/*移动到下一个结点*/ } if(p!=NULL){ List_Destroy(p,La);} else {printf("查无此人");}/*移动到下一个结点*/ } if(i==2){ p=Lb->next; while(p){ if(strcmp(p->data.stuName,x.stuName)==0) break; p=p->next; } if(p!=NULL){List_Destroy(p,Lb);} else {printf("查无此人");}}/*同La*/ } printf("now ranking......\n");/*显示递增合并为递减的信息*/ List_Merge(La, Lb); OutPut(La);/*输出函数*/ return 0; } ``` 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错。。功力不足实在解决不了。。跪求大神解答。。(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去。。我肉眼实在找不出来。。
C语言链表实现学生信息统计(只写了三个功能 输入 删除 输出)
第一个问题 输出的第一组数据的第一个学期不输出 ```#include<stdio.h> //#include #include<string.h> #include<stdlib.h> //#include using namespace std; #define MAX 200 //宏定义,修改数值可以改变程序所包含的最大文件个数 #define LEN sizeof(struct student) int n; int count=0; struct student { char xueqi[20]; //学期 int no; //学号 int clas; //班级 char name[50]; //姓名 int chi; //语文成绩 int math; //数学成绩 int eng; //英语成绩 int com; //计算机成绩 int PE; //体育成绩 int sum; int aver; struct student *next; }; struct student *head=NULL; void menu(); void menu2(); struct student * Insert (struct student *st); void add(); void to_menu(); void to_menu2(); struct student * Delete(int no); //void save_data(); //void read_data(); void view_data(); void delete_data(); //void edit_data(); //void query_data_no(); //void tongji1(); //void tongji2(); //void tongji3(); //void tongji4(); //void query_data_tongji(); int main() //主函数 { int fun; // read_data(); menu(); while(1) { system("color fc"); //编辑菜单及字体颜色 printf("请输入功能号[0-6]:",&fun); scanf("%d",&fun); switch(fun) { case 0: // 退 出 break; case 1: //按班级输出学生成绩 view_data(); break; case 2: //输入学生记录 add(); break; case 3: //删除学生记录 delete_data(); // break; // case 4: //编辑学生记录 // edit_data(); // break; // case 5: //查询学生记录 // query_data_no(); // break; // case 6: //统计系统 // query_data_tongji(); // break; } if(fun==0) break; to_menu(); } } void add() //添加学生信息 { int b,k; while(1) { struct student *st; st= (struct student *)malloc(sizeof(struct student)); k=count; printf("\n请输入学生信息:"); printf("\n学期"); printf("\n-------------------------------------------------------------\n"); getchar(); gets(st->xueqi); printf("\n学号"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->no); printf("\n班级"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->clas); printf("\n姓名"); printf("\n-------------------------------------------------------------\n"); getchar(); gets(st->name); printf("\n语文"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->chi); printf("\n数学"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->math); printf("\n英语"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->eng); printf("\n计算机"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->com); printf("\n体育"); printf("\n-------------------------------------------------------------\n"); scanf("%d",&st->PE); st->sum=st->chi+st->math+st->eng+st->com+st->PE; st->aver=st->sum/5; count++; head=Insert(st); free(st); printf("\n\n继续添加学生信息[1-yes 0-no]:"); scanf("%d",&b); if(b==0) break; } // save_data(); } struct student * Insert (struct student *stud) { //原链表按num从小到大排列,参数stud是要插入结点 struct student *p0; // 待插入结点 struct student *p1; // p0插入p1之前、p2之后 struct student *p2; p1 = head; p0 = stud; if ( head == NULL ){//第一种情况,链表为空 head = p0;//p0成为链表中第一结点 p0->next = NULL; }else { while ((p0->no > p1->no) && (p1->next != NULL)) {//查找待插入位置 p2 = p1; p1 = p1->next; } if(p0->no <= p1->no) {//表示是从(p0->num > p1->num) 条件跳出循环 if (p1 == head) { //如果p1是表头结点,向第一结点之前插入 head = p0; p0->next = p1; } else{//向p1之前、p2之后插入 p2->next = p0; p0->next = p1; } } else { //表示从 (p1->next != NULL)条件跳出循环,p0插入表尾结点之后 p1->next = p0; p0->next = NULL; } } return (head); } void menu() //输出主菜单函数 { system("cls"); //清空屏幕函数 printf("\n"); printf("\t\t\t*******************************\n"); printf("\t\t\t* \n"); printf("\t\t\t 学生成绩管理系统 \n"); printf("\t\t\t \n"); printf("\t\t\t [0] 退出 \n"); printf("\t\t\t [1] 按学号输出学生成绩 \n"); printf("\t\t\t [2] 输入学生记录 \n"); printf("\t\t\t [3] 删除学生记录 \n"); printf("\t\t\t [4] 编辑学生记录 \n"); printf("\t\t\t [5] 查询学生记录 \n"); printf("\t\t\t [6] 统计学生记录 \n"); printf("\t\t\t \n"); printf("\t\t\t*******************************\n"); } void menu2() //输出统计系统菜单 { system("cls"); //清空屏幕函数 printf("\n"); printf("\t\t\t********************************\n"); printf("\t\t\t* \n"); printf("\t\t\t 统计系统 \n"); printf("\t\t\t \n"); printf("\t\t\t [0] 退出 \n"); printf("\t\t\t [1] 输出班级学生成绩 \n"); printf("\t\t\t [2] 班级各科成绩平均数 \n"); printf("\t\t\t [3] 班级各科成绩总分 \n"); printf("\t\t\t [4] 不及格名单 \n"); printf("\t\t\t \n"); printf("\t\t\t*******************************\n"); } void to_menu() //to_menu函数 { char c1,c2; printf("\n\n\n按回车键返回主菜单..."); scanf("%c%c",&c1,&c2); menu(); //调用menu函数 } void to_menu2() //to_menu函数 { char c1,c2; printf("\n\n\n按回车键返回上一菜单..."); scanf("%c%c",&c1,&c2); menu2(); //调用menu函数 } void view_data() { if(head==NULL) return; struct student *p=head; printf("学期\t学号\t\t班级\t\t姓名\t\t语文\t数学\t英语\t计算机\t体育\t总分\t平均分"); printf("\n-----------------------------------------------------------------------------------------------------------------\n"); do{printf("%s\t\t%d\t%-15d%s\t\t%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",p->xueqi,p->no,p->clas,p->name,p->chi,p->math,p->eng,p->com,p->PE,p->sum,p->aver); p=p -> next; }while(p!=NULL); } struct student * Delete(int no) {//删除值为num的结点 int sb=0; struct student *p1; // 指向要删除的结点 struct student *p2; //指向p1的前一个结点 if (head == NULL) { //空表 return (head); } p1 = head; while(no!= p1->no && p1->next != NULL) { //查找要删除的结点 p2 = p1; p1 = p1->next; } if (no == p1->no) { printf("\n\n删除(学号-%d)成功!",no); sb=1;// 找到了 if (p1 == head) //要删除的是头结点 head = p1->next; else// 要删除的不是头结点 p2->next = p1->next; // free(p1); //释放被删除结点所占的内存空间 } if(sb==0) printf("\n\n删除(学号-%d)成功!",no); return (head); //返回新的表头 } void delete_data() //删除学生记录 { int j; int no; j=count; view_data(); printf("\n请输入要删除学生的学号:"); scanf("%d",&no); head=Delete(no); // save_data(); } ``` ![图片说明](https://img-ask.csdn.net/upload/201906/04/1559647034_557.png)
C语言静态链表问题,vc下为什么会编译不通过呢?
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define NULL 0 #define Maxsize 100 typedef int elemtype,status; typedef struct { int cur; elemtype data; }component,SLinkList[Maxsize];/*SLinkList是一个结构体数组*/ void Initspace_SL(SLinkList &space)/*将一维数组space中各分量链成一个备用链表 */ { int i; for(i=0;i<Maxsize-1;i++) space[i].cur=i+1; space[Maxsize-1].cur=0; } int LocateElem(SLinkList &space,int e)/*在静态的单链线性表中查找第一个值为e的元素*/ { int i; i=space[0].cur; while(i&&space[i].data!=e) i=space[i].cur; return i; } int Malloc_SL(SLinkList &space)/*若备用空间链表非空,则返回分配的结点下标*/ { int i; i=space[0].cur; if(space[0].cur) space[0].cur=space[i].cur; return(i); } status Insert_SLinkList(SLinkList &space,int i,elemtype e)/*在静态单链表中第i个位置之前插入一个元素e*/ { int j=1,m; while(j<i-1) j=space[j].cur; m=Malloc_SL(space); space[m].data=e; space[m].cur=space[j].cur; space[j].cur=m; return 1; } void free(SLinkList &space,int k)/*将下标为k的空闲结点回收到备用链表*/ { space[k].cur=space[0].cur; space[0].cur=k; } status Delet_SL(SLinkList &space,int i,elemtype e)/*删除静态单链表中第i个元素并用e返回其值*/ { int j=1,k=Maxsize-1; for(j=1;j<i;j++) k=space[k].cur; j=space[k].cur; space[k].cur=space[j].cur; e=space[j].data; free(space,j); return e; } void main()/*还有求链表长度,以及求链表前驱后继的函数以后有空再写*/ { SLinkList La; int length,i,e; printf("请输入链表的长度:\n"); scanf("%d",&length); Initspace_SL(La); printf("请输入链表的元素:\n"); for(i=0;i<length;i++) scanf("%d",&La[i].data); printf("请输入要删除元素的位置:\n"); scanf("%d",&i); e=Delet_SL(La,i,e); printf("要删除的元素的值是:%d\n",e); printf("请输入要插入元素的位置:\n"); scanf("%d",&i); printf("要插入的元素的值是:\n"); scanf("%d",&e); Insert_SLinkList(La,i,e); for(i=0;i<length;i++) printf("%d ",La[i].data); } 这个是完全按照严尉敏的数据结构课程中关于静态链表写的程序,请教大神为什么编译会出错,提示语法有问题?看了很多遍了,好像是没有呀。
一个c语言单向链表,编译通过,运行结果却不知所谓,请求帮助
这段代码在rhel6中用gcc编译通过,运行结果未定义,其中作的链表按number大小排序打印出来是没有排过序的结果,而且输入记录多了,其中某些项的number打印出来会由输入的值变成0或者一个莫名其妙的整数. vs2008中编译通过,打入多项记录只能显示2条,而且前一条是乱码. 最简单的一个数据结构,却忙了半天还查不出原因,帮个忙吧-_-||| **原代码:** /*简单单向链表,输入学生名称和号码,按号码排序, * 如果号码相同则记录合并为一条,附输出函数*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define N 50 #define LEN (sizeof(student *)) static int n=0;//计数器 typedef struct student{ char name[N]; int number; struct student *next;}student;//链表节点结构 int main() { student *add(student *head);//添加记录函数声明 void list(student *head);//列表函数声明 student *head=NULL; while(1){ printf("'N/n' to add,'L/l' to list,other to exit:"); char ch=toupper(getchar()); getchar(); if(ch=='N')head=add(head); else if(ch=='L')list(head); else break;} return 0; }//主函数 student *add(student *head){ student *p,*p1=head,*p2=head; p=(student *)malloc(LEN);//分配一片空间 printf("Input name:"); gets(p->name); printf("Input number:"); scanf("%d",&p->number); scanf("%*[^\n]"); scanf("%*c"); if(p->number<=0){//如果输入号码<=0,直接返回 printf("Wrong number!!\n"); return head;} else{ if(head==NULL){//如果表空直接接到头指针 head=p; head->next=NULL; n++;} else{//表不空 //确定p1指向 while(p->number>p1->number&&p1->next!=NULL){ p2=p1;//p2保存p1指向下一节点之前的值 p1=p1->next;} if(p->number<p1->number){//插入表中的情况 p2->next=p; p->next=p1; n++} //如果号相等,合并记录 else if(p->number==p1->number)strcpy(p1->name,p->name); else if(p1->next==NULL){//输入新记录的号码比链表里所有都大的情况 p1->next=p; p->next=NULL; n++;} } } return head;} void list(student *head){//遍历打印函数 student *p=head; printf("There's %d records!!\n",n); printf("Name:\t\tNumber:\n"); while(p){ printf("%s\t\t%d\n",p->name,p->number); p=p->next;} }
求大神看看我真的不知道哪里错了
``` #include <string.h> //输入 typedef struct DataType { char name[10]; char num[12]; }Datatype; Datatype InputInfo() { Datatype x; printf("请输入姓名和电话号码:\n"); scanf("%s%s",&x.name,&x.num); return x; } //输出 void PrintInfo(Datatype x) { printf("姓名:%s,电话号码:%s\n",x.name,x.num); } //比较姓名函数 int CompareName(Datatype a, Datatype b) { if (strcmp(a.name, b.name) == 0) return 1; else return 0; } ``` ``` typedef struct Node { Datatype data; struct Node* next; }Node, *LinkList; //创建带头节点的链表 void InitList(LinkList *head) { LinkList p = (LinkList)malloc(sizeof(Node)); p->next = NULL; (*head) = p; } //查询链表长度 int LengthList(LinkList head) { LinkList p = head; int length = 0; while (p->next != NULL) { length++; p = p->next; } return length; } //按内容查找元素位置,成功返回位置,失败返回0 int LocateElem(LinkList head, Datatype e, int(*fun)(Datatype, Datatype)) { int pos = 0; LinkList p = head->next; while (p != NULL) { if ((*fun)(p->data, e) == 1) return (pos + 1); p = p->next; pos++; } return 0; } //按位置返回元素,成返回1,失败返回0 int GetElem(LinkList head, int pos, Datatype *e) { int length = LengthList(head); LinkList p = head; if (pos < 1 || pos > length) return 0; for (int i = 0; i < pos; i++) { p = p->next; } (*e) = p->data; return 1; } //按位置删除元素,成功返回1,失败返回0 int DeleteElem(LinkList head, int pos, Datatype *e) { int length = LengthList(head); if (pos < 1 || pos > length) return 0; LinkList p = head; LinkList q = NULL; for (int i = 0; i < pos - 1; i++) { p = p->next; } q = p->next; p->next = p->next->next; (*e) = q->data; free(q); return 1; } //按位置插入元素,成功返回1,失败返回0 int InsertElem(LinkList head, int pos, Datatype e) { int length = LengthList(head); if (pos < 1 || pos > length + 1) return 0; LinkList p = head; LinkList pNew = (LinkList)malloc(sizeof(Datatype)); pNew->data = e; for (int i = 0; i < pos - 1; i++) { p = p->next; } pNew->next = p->next; p->next = pNew; return 1; } //遍历链表 void TraverseList(LinkList head) { int length = LengthList(head); LinkList p = head->next; for (int i = 0; i < length; i++) { PrintInfo(p->data); p = p->next; } } //销毁链表 void DestroyList(LinkList head) { LinkList p = head; LinkList q = p; while (p != NULL) { p = p->next; free(q); q = p; } } ``` ``` #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "DataType.h" #include "LinkList.h" int main() { int ch,pos,length;//用于输入操作数,返回位置,链表长度 Datatype x;//用来输入元素 LinkList L; InitList(&L); while (1) { system("cls"); printf("请输入要进行的操作\n"); printf("1.添加链表元素\n"); printf("2.插入链表元素\n"); printf("3.删除链表元素\n"); printf("4.修改链表元素\n"); printf("5.打印链表元素\n"); printf("6.销毁退出\n"); scanf("%d",&ch); switch (ch) { case 1: x = InputInfo(); length = LengthList(L); if (InsertElem(L, length + 1, x)) printf("添加成功\n"); else printf("添加失败\n"); system("pause"); break; case 2: x = InputInfo(); printf("请输入你要插入的位置\n"); scanf("%d",&pos); if (InsertElem(L, pos, x)) printf("插入成功\n"); else printf("插入失败\n"); system("pause"); break; case 3: printf("请输入你要删除的名字\n"); scanf("%s",&x.name); pos = LocateElem(L, x, CompareName); if (DeleteElem(L, pos, &x)) { printf("删除成功\n"); PrintInfo(x); } else printf("删除失败\n"); system("pause"); break; case 4: printf("请输入被修改的名字:\n"); scanf("%s",&x.name); pos = LocateElem(L, x, CompareName); if (DeleteElem(L, pos, &x)) { printf("信息修改为\n"); x = InputInfo(); InsertElem(L, pos, x); printf("修改成功\n"); } else printf("修改失败\n"); system("pause"); break; case 5: TraverseList(L); system("pause"); break; case 6: DestroyList(L); return; } } system("pause"); return 0; } ``` ![图片说明](https://img-ask.csdn.net/upload/202002/19/1582109924_642226.png) 求大神看看为什么我的删除函数会报错啊
c语言单链表每次进行查找操作和排序操作的时候程序就闪退
刚学单链表,但是程序每到进行查找操作和排序操作,程序就闪退 编译的时候也没有报错,深夜求助,下面是测试程序的一些片段,单链表初始化和其他操作如插入、删除、输出等都没什么问题,就是一到下面两种操作就闪退了,两个操作函数都是void型的 ``` Linklist L; ElemType *e; case 9:printf("请输入元素的位置\n");scanf("%d",&flag);GetElem(L,flag,e);break;//找到flag位置的数据并print出来 case 14:LinkSort(&L);break;//对单链表中的数据排序 ``` 下面是查找操作的函数 ``` void GetElem(Linklist L,int i,Elemtype *e) { if (L==NULL) { printf("单链表不存在\n"); } else { if (L->next==NULL) { printf("单链表为空\n"); }//前提判断 else{ int length; length=ListLength(L); if (i>length||i<0) { printf("输入错误\n"); }//判断输入合法性 else { int j=0; for (j = 0; j < i; j++) { (*e)=(L->next)->data; L=L->next; }//循环i次,将L->next指向第i个节点,并传值给*e printf("第%d个位置的数据为%d\n",i,*e); } } } } ``` 下面是排序操作的函数,排序操作的我的思想是,创建一个新单链表,然后将传入的单链表的每个节点的数据先与新单链表中的数据进行比较,从小到大确定位置,然后再用插入操作,将每个数据插入新的单链表中 ``` void LinkSort(Linklist *L) { if ((*L)==NULL) { printf("单链表不存在\n"); } else { int l=ListLength(*L); if (l<2) { printf("单链表中至少要有两个元素才能进行排序\n"); } else { int i; Linklist p=(*L)->next; Linklist q,s; q=(Linklist)malloc(sizeof(LNode)); q->next=NULL; s=(Linklist)malloc(sizeof(LNode)); s->data=p->data; s->next=NULL; q->next=s;//先将传入单链表的第一个节点的数据添加到新单链表中去 Linklist r=q->next; p=p->next; while(p->next!=NULL) { i=1;//i是用来确定后续插入位置的 while((p->data)>(r->data)&&r->next!=NULL) { i++; r=r->next; } if ((p->data)>(r->data)) { i++; ListInsert(&q,i,p->data); } else ListInsert(&q,i,p->data); p=p->next; r=q->next; } i=1; while((p->data)>(r->data)&&r->next!=NULL) { i++; r=r->next; } if ((p->data)>(r->data)) { i++; ListInsert(&q,i,p->data); } else ListInsert(&q,i,p->data); *L=q; printf("排序完成\n"); } } } ``` 再附上插入操作函数 ``` void ListInsert(Linklist *L,int i,Elemtype e) { if (*L==NULL) { printf("单链表不存在\n"); } else { int length=ListLength(*L); if (i<1||i>length+1) { printf("输入错误\n"); }//判断输入的合法性 else { Linklist p=*L; int j=0; for (j = 0; j <i-1 ; j++) { p=p->next; }//通过循环使p指向所要插入节点位置的前一个节点 Linklist *r; (*r)=(Linklist)malloc(sizeof(LNode)); (*r)->data=e; (*r)->next=p->next; p->next=*r;//将新建立的节点插入 printf("插入成功\n"); } } } ``` 这是操作情景,直接退回桌面了 呜呜呜 ![图片说明](https://img-ask.csdn.net/upload/201910/21/1571593640_443751.png)
c语言 基础链表 意外中断。谢谢
(在输出位置意外中断,程序功能是输入姓名和学号,然后在首位再插入一个学生,然后输出整个链表,中断位置在输出函数的第一次姓名输出) #include<stdio.h> #include<stdlib.h> struct Student { char cName; int iNumber; struct Student *pNext; }; int iCount; struct Student *Create() { struct Student *pHead=NULL; struct Student *pEnd,*pNew; printf("Plase enter Name first,then Number:\n"); pEnd=pNew=malloc(sizeof(struct Student)); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); while(pNew->iNumber!=0) { iCount++; if(iCount==1) { pNew->pNext=NULL; pEnd=pNew; pHead=pNew; } else { pNew->pNext=NULL; pEnd->pNext=pNew; pEnd=pNew; } pNew=malloc(sizeof(struct Student)); scanf("%s",&pNew->cName); scanf("%d",&pNew->iNumber); } free(pNew); return pHead; }; void Print(struct Student *pHead) { struct Student *pTemp; int iIndex=1; printf("the list has %d members\n\n",iCount); pTemp=pHead; while(pTemp!=NULL) { printf("No.%d student:\n",iIndex); printf("accomplished"); printf("Name:%s",pHead->cName); printf("Number:%d\n",pTemp->iNumber); pTemp=pTemp->pNext; iIndex++; } }; struct Student *Insert(struct Student *pHead) { struct Student *pInsert; printf("Insert member at first\n"); pInsert=malloc(sizeof(struct Student)); scanf("%s",&pInsert->cName); scanf("%d",&pInsert->iNumber); pInsert->pNext=pHead->pNext; pHead->pNext=pInsert; iCount++; return pHead; }; main() { struct Student *pHead; printf("readng...\n"); pHead=Create(); printf("Insert readying\n"); pHead=Insert(pHead); printf("\nInsert accomplished\n"); Print(pHead); return 0; }
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语言中random和time函数的问题
color=#FFFF00][color=#FFCC00]C语言中的一个数据查找的实验 程序可以编译通过,但是连接的时候就会出bug,小白表示不知道怎么改了,请大神赐教 附连接时代码:[/color] --------------------Configuration: schtb - Win32 Debug-------------------- Linking... schtb.obj : error LNK2001: unresolved external symbol "int __cdecl random(int)" (?random@@YAHH@Z) schtb.obj : error LNK2001: unresolved external symbol "int __cdecl random(int)" (?random@@YAHH@Z) schtb.obj : error LNK2001: unresolved external symbol "int __cdecl random(int)" (?random@@YAHH@Z) nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex Debug/schtb.exe : fatal error LNK1120: 3 unresolved externals 执行 link.exe 时出错. schtb.cpp中的代码 #include <stdio.h> #include <stdlib.h> #include <afxinet.h> #include "schtb.h" //创建查找表操作 void CreatSchTb(SeqList R) { int i ; int random(int sum); //randomize() ; srand(n) ; //以相同的种子值,初始化随机数发生器 for(i=1; i<=n; i++) R[i].key = random(n*10) ;//产生随机数 } //排序查找表,采用简单选择排序 void SortSchTb(SeqList R) { int i, j, k ; for(i=1; i<n; i++) { k = i ; for(j=i+1; j<=n; j++) if (R[k].key>R[j].key) k = j ; if (k!=i) { R[0] = R[i] ; R[i] = R[k] ; R[k] = R[0] ; } } } //顺序查找操作 int SeqSearch(SeqList R, KeyType K) { int i ; R[0].key = K ; for(i=n; R[i].key!=K; i--) ; return i ; } //折半查找操作 int BinSearch(SeqList R, KeyType K) { int low = 1, high = n, mid ; while(low <= high) { mid= (low + high) / 2 ; if (R[mid].key < K) low = mid + 1 ; else if (R[mid].key == K) return mid ; else high = mid - 1 ; } return 0 ; } //输出查找表数据 void PrtSchTb(SeqList R) { int i ; for (i=1; i<=n; i++) printf("%4d", R[i].key) ; printf("\n") ; } //二叉排序树的插入操作 void InsertBST(BSTree *BT, KeyType key) { BSTNode *f, *p = *BT ;//f指向要插入的双亲结点 while(p) { if (p->key == key) return ; //有相同关键字,不插入 f = p ; p = (key<p->key) ? p->lchild : p->rchild ; } p = (BSTNode *)malloc(sizeof(BSTNode)) ; p->key = key ; p->lchild = p->rchild = NULL ; if (*BT == NULL) *BT = p ; //如果二叉排序树为空,则为根结点 else if (key<f->key) f->lchild = p ; else f->rchild = p ; } //创建二叉排序树操作 void CreatBST(BSTree *TP) { int random(int sum); int i ; *TP = NULL ; srand(n) ; for (i=1; i<=n; i++) InsertBST(TP, random(n*10)) ; } //二叉排序树的查找操作 BSTNode *SearchBST(BSTree BT, KeyType key ) { if (BT==NULL||BT->key==key) return BT ; if (BT->key>key) return SearchBST(BT->lchild, key) ; else return SearchBST(BT->rchild, key) ; } //输出二叉排序树结点的值操作,以中序遍历输出 void PrtBST(BSTree BT) { if (BT) { PrtBST(BT->lchild) ; printf("%4d", BT->key) ; PrtBST(BT->rchild) ; } } //取得当前系统时间操作 double GetTime(void) { double T; CTime t = CTime::GetCurrentTime(); int h=t.GetHour(); //获取当前为几时 int mm=t.GetMinute(); //获取当前分钟 int s=t.GetSecond(); //获取当前秒 int w=t.GetDayOfWeek(); //获取星期几,注意1为星期天,7为星期六 double hund=s/100; //struct time; //struct t; //gettime(&t); T = ((h*60+mm)*60+s)*100+hund ; return 0 ; } //主程序 void main(void) { SeqList SR, BR ; BSTree BT ; KeyType k[m] ; int i ; double t1, t2 ; int random(int sum); //randomize() ; 该用法在VC环境下不能使用,需要使用下面的用法 srand(time(0)); //产生待查找的数据 for(i=0; i<m; i++) k[i] = random(n*10) ; //顺序查找算法 printf("顺序查找算法的时间为:\n") ; CreatSchTb(SR) ; t1 = GetTime() ; for(i=0; i<m; i++) SeqSearch(SR, k[i]) ; t2 = GetTime() ; printf("%d毫秒\n", (int)(t2-t1)) ; //折半查找算法 printf("顺序查找算法的时间为:\n") ; CreatSchTb(BR) ; SortSchTb(BR) ; t1 = GetTime() ; for(i=0; i<m; i++) BinSearch(BR, k[i]) ; t2 = GetTime() ; printf("%d毫秒\n", (int)(t2-t1)) ; //二叉排序树查找算法 printf("二叉排序树查找算法的时间为:\n") ; CreatBST(&BT) ; t1 = GetTime() ; for(i=0; i<m; i++) SearchBST(BT, k[i]) ; t2 = GetTime() ; printf("%d毫秒\n", (int)(t2-t1)) ; //PrtBST(BT) ; } schtb.h中的代码 //以下是schtb.h的头文件内容。 //以下用于顺序查找和折半查找 #define n 1000 //定义查找表长度 #define m 500 //定义待查找数据个数 typedef int KeyType ; //定义关键字类型 typedef struct node { //定义查找结点结构 KeyType key ; //如果查找表的结点包含其它信息,在此加入 //InfoType otherinfo ; } NodeType ; typedef NodeType SeqList[n+1] ;//定义查找表,含有监视哨 //以下用于二叉排序树的查找 typedef struct treenode { //定义二叉排序树结点 KeyType key ; //InfoType otherinfo ; //结点的其它信息 //二叉链表结点的左右孩子指针 struct treenode *lchild, *rchild ; } BSTNode ; typedef BSTNode *BSTree ; //定义二叉排序树
双向链表,尾插函数用了之后得到结果不正常?
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 如果不用尾插函数一切正常,如果用了,显示结果就不正常,求大神解答
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 另外推荐一篇原创:终极推荐!可能是最适合你的Java学习路线 方法 网站 书籍推荐! Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
神经⽹络可以计算任何函数的可视化证明
《Neural Networks and Deep Learning》读书笔记第四篇本章其实和前面章节的关联性不大,所以大可将本章作为小短文来阅读,当然基本的深度学习基础还是要有的。主要介绍了神经⽹络拥有的⼀种普遍性,比如说不管目标函数是怎样的,神经网络总是能够对任何可能的输入,其值(或者说近似值)是网络的输出,哪怕是多输入和多输出也是如此,我们大可直接得出一个结论:不论我们想要计算什么样的函数,...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
活到老,学到老,程序员也该如此
全文共2763字,预计学习时长8分钟 图片来源:Pixabay 此前,“网传阿里巴巴要求尽快实现P8全员35周岁以内”的消息闹得沸沸扬扬。虽然很快被阿里辟谣,但苍蝇不叮无缝的蛋,无蜜不招彩蝶蜂。消息从何而来?真相究竟怎样?我们无从而知。我们只知道一个事实:不知从何时开始,程序猿也被划在了“吃青春饭”行业之列。 饱受“996ICU”摧残后,好不容易“头秃了变强了”,即将步入为“高...
Vue快速实现通用表单验证
本文开篇第一句话,想引用鲁迅先生《祝福》里的一句话,那便是:“我真傻,真的,我单单知道后端整天都是CRUD,我没想到前端整天都是Form表单”。这句话要从哪里说起呢?大概要从最近半个月的“全栈工程师”说起。项目上需要做一个城市配载的功能,顾名思义,就是通过框选和拖拽的方式在地图上完成配载。博主选择了前后端分离的方式,在这个过程中发现:首先,只要有依赖jQuery的组件,譬如Kendoui,即使使用...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
关于裁员几点看法及建议
最近网易裁员事件引起广泛关注,昨天网易针对此事,也发了声明,到底谁对谁错,孰是孰非?我们作为吃瓜观众实在是知之甚少,所以不敢妄下定论。身处软件开发这个行业,近一两年来,对...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问