c++链表按输入顺序去创建

输入一批正整数,以0为结束标志,按输入顺序创建链表,并输出该链表,新的结点插入在后

c++

2个回答

随便一本讲数据结构的书上都会有吧,去查阅一下就好!http://blog.csdn.net/u010983763/article/details/72461585

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++链表按输入顺序去创建
输入一批正整数,以0为结束标志,按输入顺序创建链表,并输出该链表,新的结点插入在后
线性表结构的实现,内心迷乱,希望能得到帮助
#include<stdio.h> #include <stdlib.h> #define ERROR 0 #define OK 1 typedef int Status; typedef int Elemtype; typedef struct node { Elemtype elem[LIST_SIZE]; int length; }Sqlist; typedef int Elemtype; typedef int Status; typedef struct LNode{ Elemtype data; struct LNode *next; }LNode,*Linklist; Status LengthList(Linklist *L); Status create(Sqlist *L,int n); Status Findlen1(Sqlist *L); Elemtype GetElem(Sqlist *L, int n); int LocateElem(Sqlist *L, int n); Status ListInsert_Sq(Sqlist *L,int i,int x); Status LisDele_Sq(Sqlist *L,int i); int Printlist(Sqlist* L); Status Init_linklist(Linklist *L); void Creat_Linklist(Linklist *L,int n); Status LengthList(Linklist *L); Status Get_Linklist(Linklist *L,int i,Elemtype *e); Status Locate_Linklist(Linklist *L,Elemtype e); Status Insert_Linklist(Linklist *L,int i,Elemtype e); Status Delete_Linklist(Linklist *L,int i,Elemtype *e) ; void Display(Linklist *L) ; void menu1(); void menu2(); int main() { int x; while(1) { system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t\t1:顺序表\n"); printf("\t\t\t\t\t2:链表\n"); printf("\t\t\t\t\t3:退出\n"); printf("\n\t\t\t\t\t请输入您的选择(1-3)=:"); scanf("%d",&x); switch(x) { case 1:menu1(); break; case 2:menu2(); break; case 3:return 0;break; default:printf("error");return 1; break; } printf("\n"); system("pause"); } return 0; } Status create(Sqlist *L, int n) { int i; if(n>LIST_SIZE) return ERROR; for(i=0;i<n;i++) { printf("请输入第%d个数据的值:", i+1); scanf("%d", &L->elem[i]); } L->length=n; return OK; } Status Findlen1(Sqlist *L) {return (L->length);} Elemtype GetElem(Sqlist *L, int n) { { if (n<1 || n>L->length) { return ERROR; } return L->elem[n - 1]; } } int LocateElem(Sqlist *L, int n) //4 {int i; for(i=0;i<=L->length;i++) if(L->elem[i]==n) return i+1; else return 0; } Status ListInsert_Sq(Sqlist *L,int i,int x) //5 {int j; if (i<1||i>L->length +1) return ERROR; if(L->length>100) return ERROR; for(j=L->length-1;j>=i-1;j--) L->elem[j+1]=L->elem[j]; L->elem[i-1]=x; ++(L->length); return OK; } Status LisDele_Sq(Sqlist *L,int i) //6 {int j; if ((i<1)||(i>L->length)) return ERROR; for(j=i;j<=L->length-1;j++) L->elem[j-1]=L->elem[j]; --L->length; return OK; } int Printlist(Sqlist* L) //7 { int j; for (j = 0; j <= L->length - 1; j++) { printf("第%d个数据为%d\n", j + 1, L->elem[j]); } return OK; } Status Init_linklist(Linklist *L) { *L=(Linklist)malloc(sizeof(LNode)); if(!(*L)) { return ERROR; } (*L)->next=NULL; return OK; } void Creat_Linklist(Linklist *L,int n) { Linklist p,q; int i; p = *L; for(i=0;i<n;i++) { printf("请输入链表第%d个元素:",i); q=(Linklist)malloc(sizeof(LNode)); scanf("%d",&q->data); p->next=q; p=q; } p->next=NULL; } Status LengthList(Linklist *L) { int i=0; Linklist p,q; p = *L; if(p->next==NULL) return ERROR; while(p->next!=NULL) { i++; p=p->next; } return i; } Status Get_Linklist(Linklist *L,int i,Elemtype *e) { int j=1; Linklist p,q; p = *L; if(i<1||!p->next||i>LengthList(L)) { return ERROR; } while(j<=i&&p) { p=p->next; j++; } if(j-1==i) { *e=p->data; return OK; } else return ERROR; } Status Locate_Linklist(Linklist *L,Elemtype e) { int i=1; Linklist p,q; p = (*L)->next; while(p->data!=e&&p) { p=p->next; i++; } if(p->data!=e) return -1; else return i; } Status Insert_Linklist(Linklist *L,int i,Elemtype e) { int j=1; Linklist p,q; p = *L; if(i<1||!p->next||i>LengthList(L)) { return ERROR; } while(p&&j<i) { p=p->next; j++; } q=(Linklist)malloc(sizeof(LNode)); q->data=e; q->next=p->next; p->next=q; return OK; } Status Delete_Linklist(Linklist *L,int i,Elemtype *e) { int j=1; Linklist p,q; p = *L; if(i<1||!p->next||i>LengthList(L)) { return ERROR; } while(j<i&&p->next) { p=p->next; j++; } q=p->next; *e=q->data; p->next=q->next; free(q); return OK; } void Display(Linklist *L) { LNode *p; p=(*L)->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } menu1() { int y,n; Sqlist L; Status T; while(1) { system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t\t1:创建顺序线性表\n"); printf("\t\t\t\t\t2:求顺序线性表的长度\n"); printf("\t\t\t\t\t3:按序号取顺序表元素\n"); printf("\t\t\t\t\t4:按值查找顺序表\n"); printf("\t\t\t\t\t5:插入元素\n"); printf("\t\t\t\t\t6:删除元素\n"); printf("\t\t\t\t\t7:输出顺序线性表\n"); printf("\t\t\t\t\t8:返回\n"); printf("\t\t\t\t\t\t请输入您的选择(1-8)=:"); scanf("%d",&y); if(y==8) break; switch(y) { case 1: system("cls"); printf("请输入你要创建的线性表的长度:"); scanf("%d",&n); T=create(&L,n); if(T==ERROR) printf("创建失败,线性表长度超限!!"); else printf("创建线性表成功!!"); system("pause"); break; case 2:system("cls"); Status a; a=Findlen1(&L); printf("您所建线性表长度为%d\n",n); system("pause"); break; case 3:system("cls"); int b; printf("请输入你想找的数据的序号: "); scanf("%d", &n); b = GetElem(&L, n); printf("该序号的数据为%d\n", b); system("pause"); break; case 4:system("cls"); printf("请输入你想找的值:"); scanf("%d", &n); b=LocateElem(&L,n); if (b == 0) printf("线性表中没有该值\n"); else printf("该值在线性表中的第%d位\n", b); system("pause"); break; case 5:system("cls"); int C;int x; printf("请输入你想在哪一个元素前面插入:"); scanf("%d",&n); printf("请输入你想插入的数据:"); scanf("%d",&x); C= ListInsert_Sq(&L,n,x); if(C==1) printf("插入成功"); else printf("插入失败"); system("pause"); break; case 6:printf("请输入您想删除的数字:"); scanf("%d",&n); C=LisDele_Sq(&L,n); if(C==1) printf("删除成功"); else printf("删除失败"); system("pause");break; case 7:system("cls"); Printlist(&L); system("pause"); break; default:printf("error"); break; } printf("\n"); system("pause"); } return 1; } menu2(){ int z; while(1) { system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t\t1:创建链式线性表\n"); printf("\t\t\t\t\t2:求链式线性表的长度\n"); printf("\t\t\t\t\t3:按序号取链表元素\n"); printf("\t\t\t\t\t4:按序号取链表元素\n"); printf("\t\t\t\t\t5:插入元素\n"); printf("\t\t\t\t\t6:删除元素\n"); printf("\t\t\t\t\t7:输出链式线性表\n"); printf("\t\t\t\t\t8:返回\n"); printf("\t\t\t\t\t\t请输入您的选择(1-8)=:"); scanf("%d",&z); if(z==8) break; switch(z) { case 1: printf("这里是创建链式线性表"); int n,num,e,value; Linklist L; value=Init_linklist(&L); if(value) printf("单链表初始化成功!\n"); else return ERROR; printf("请输入单链表的长度:") ; scanf("%d",&n); Creat_Linklist(&L,n); printf("单链表中各元素的值为:"); Display(&L);break; case 2:printf("这里是求链式线性表的长度"); break; case 3: int n,num,e,value; printf("这里是按值取链表元素"); printf("\n\n请输入要查找的值e= "); scanf("%d",&num); value=Locate_Linklist(&L,num); if(value>0) printf("该元素在线性表的位序位:%d",value); else printf("\n无该值,查找失败!"); break; case 4: int n,num,e,value; printf("这里是按序号取链表元素"); printf("\n\n请输入要查找的位置:"); scanf("%d",&n); value=Get_Linklist(&L,n,&e); if(value) printf("单链表中第%d位的值为%d",n,e); else printf("\nerror!") ; break; case 5: int n,num,e,value; printf("这里是插入元素"); printf("\n请输入插入的位置:"); scanf("%d",&n); printf("请输入插入的元素:"); scanf("%d",&num); Insert_Linklist(&L,n,num); printf("进行插入操作后\n单链表中各元素的值为:"); Display(&L);break; case 6: int n,num,e,value; printf("这里是删除元素"); printf("\n\n请输入删除的位置:"); scanf("%d",&n); Delete_Linklist(&L,n,&e); printf("被删除元素的值为:%d",e); printf("\n进行删除操作后\n单链表中各元素的值为:"); Display(&L); break; case 7:printf("这里是输出链式线性表"); printf("单链表中各元素的值为:"); Display(&L);break; default:printf("error"); break;} printf("\n"); system("pause"); return 1; } }
利用c语言制作二级菜单,一直报错,很无奈
#include <stdlib.h> #include <stdio.h> void nemu1(); void nemu2(); int main() { int x; while(1); {system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t\t1:顺序表\n"); printf("\t\t\t\t\t2:链表\n"); printf("\t\t\t\t\t3:退出\n"); printf("\n\t\t\t\t\t请输入您的选择(1-3)=:"); scanf("%d",&x); } switch(x) {case 1:nemu1(); break; case 2:nemu2(); break; default:printf("error"); break;} return 1; } void menu1(); {int y; while(1) {system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t\t1:创建顺序线性表\n"); printf("\t\t\t\t\t2:求顺序线性表的长度\n"); printf("\t\t\t\t\t3:按序号取顺序表元素\n"); printf("\t\t\t\t\t4:按值查找顺序表\n"); printf("\t\t\t\t\t5:插入元素\n"); printf("\t\t\t\t\t6:删除元素\n"); printf("\t\t\t\t\t7:输出顺序线性表\n"); printf("\t\t\t\t\t8:返回\n"); printf("\t\t\t\t\t\t请输入您的选择(1-8)=:"); scanf("%d",&y);} if(y==8) break; switch(y) { case 1:printf("这里是创建顺序线性表"); break; case 2:printf("这里是求顺序线性表的长度");break; case 3:printf("这里是按序号取顺序表元素"); break; case 4:printf("这里是按值查找顺序表"); break; case 5:printf("这里是插入元素"); break; case 6:printf("这里是删除元素"); break; case 7:printf("这里是输出顺序线性表"): break; default:printf("error"); break;} return 1; } void menu2(); {int z; while(1) {system("cls"); printf("\n\n\n\n\n\n\n\n"); printf("\t\t\t\t\t1:创建链式线性表\n"); printf("\t\t\t\t\t2:求链式线性表的长度\n"); printf("\t\t\t\t\t3:按序号取链表元素\n"); printf("\t\t\t\t\t4:按序号取链表元素\n"); printf("\t\t\t\t\t5:插入元素\n"); printf("\t\t\t\t\t6:删除元素\n"); printf("\t\t\t\t\t7:输出链式线性表\n"); printf("\t\t\t\t\t8:返回\n"); printf("\t\t\t\t\t\t请输入您的选择(1-8)=:"); scanf("%d",&z);} if(z==8) break; switch(x) { case 1:printf("这里是创建链式线性表"); break; case 2:printf("这里是求链式线性表的长度"); break; case 3:printf("这里是按序号取链表元素"); break; case 4:printf("这里是按序号取链表元素"); break; case 5:printf("这里是插入元素"); break; case 6:printf("这里是删除元素"); break; case 7:printf("这里是输出链式线性表");break; default:printf("error"); break;} return 1; }
请各位帮帮忙:指定一个数据,如果双向非循环链表中的有n个重复数据,往其中插入n个新的节点。打印节点数据后就死循环了?
//*******************双向非循环链表**********************// ``` #include"myhead.h" ```typedef struct dou_list_node { int data; struct dou_list_node *next; struct dou_list_node *prev; }dou_list,*dou_link; ```dou_link init_list() { dou_link head_ptr=malloc(sizeof(dou_list)); head_ptr->prev=NULL; head_ptr->next=NULL; return head_ptr; } ```dou_link creat_node(int data) { dou_link newnode_ptr=malloc(sizeof(dou_list)); newnode_ptr->data=data;//数据域 newnode_ptr->next=NULL;//指针域 newnode_ptr->prev=NULL;//指针域 return newnode_ptr; } ```int insert_tailnode(int data,dou_link head_ptr)//尾增 { dou_link newnode_ptr=creat_node(data); if(newnode_ptr==NULL) { puts("新节点传创建失败"); return -1; } dou_link p=head_ptr;//寻找尾节点 ``` while(p->next) { p=p->next; } //后增数据 newnode_ptr->prev=p; p->next=newnode_ptr; return 0;} ``` int PriDouList(dou_link head_ptr) { dou_link p=head_ptr->next; if(p==NULL) { puts("链表为空"); return -1; } puts("链表数据如下(顺序):"); while(1) { printf("%d\n",p->data); if(p->next==NULL) break; p=p->next; } puts("链表数据如下(逆序):"); while(p) { printf("%d\n",p->data); p=p->prev; if(p==head_ptr) break; } return 0; } ```int NumOfListNode(dou_link head_ptr)//计算链表的节点数量(不包括头节点) { dou_link p=head_ptr->next; if(p==NULL) { puts("链表为空"); return -1; } int count=1; while(p=p->next) { count++; } return count; } ```int NumOfSpecifiedData(int des_data,dou_link head_ptr)//计算链表中指定数据的数量(不包括头节点) { int count=0; dou_link p=head_ptr; if(p->next==NULL) { puts("链表为空"); return -1; } while(p=p->next) { if(p->data==des_data) { count++; } } return count; } ``` int insert2_midnode(int des_data,int newdata,dou_link head_ptr) { while(head_ptr->next==NULL) { puts("无法对指定位置插入数据,链表为空"); return -1; } int num_spe_data=NumOfSpecifiedData(des_data,head_ptr);//寻找目标数据在链表中的数量 if(num_spe_data==0) { puts("找不到指定数据"); return -1; } else { //创建对应数量的新节点 dou_link newnode_ptr[num_spe_data]; for(int i=0;i<num_spe_data;i++) { newnode_ptr[i]=creat_node(newdata); //printf("%p\n%d\n",newnode_ptr[i],newnode_ptr[i]->data); } //找到目标位置并插入数据 dou_link p=head_ptr->next; while(1) { int i=0; if(p->data==des_data&&p->next!=NULL) { newnode_ptr[i]->next=p->next; newnode_ptr[i]->prev=p; p->next=newnode_ptr[i]; newnode_ptr[i]->next->prev=newnode_ptr[i]; i++; p=p->next; } else if(p->data==des_data&&p->next==NULL) { newnode_ptr[i]->prev=p; p->next=newnode_ptr[i]; return 0; } p=p->next; if(p==NULL) return 0; } } } ```int main() { dou_link head_ptr=init_list();//初始化 for(int i=1;i<4;i++) { insert_tailnode(i,head_ptr); } insert_tailnode(2,head_ptr); PriDouList(head_ptr); int des_data,newdata; puts("输入目标节点数据和新节点数据"); scanf("%d%d",&des_data,&newdata); insert2_midnode(des_data,newdata,head_ptr); PriDouList(head_ptr); } 上面的代码希望指定一个数据,在链表中找到相同的数据节点,并往后插入一个数据,如果指定数据在链表中有多个,则插入相应数量的新节点。 情况:编译无报错,如果指定的数据在链表中只有一个,打印出的链表无误。如果有多个,打印出来的链表就死循环了。 弄了好久了,希望热心人帮忙解答,谢谢。
用C语言实现数据结构的链表创建时出错
请教大家,下面的程序哪里有错啊?十分感谢 #include "stdio.h" #include "malloc.h" #include "stdlib.h" #define NULL 0 #define OK 1 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,LinkList; Status InitLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); return 0; } Status CreatLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); L->next=NULL; LinkList *p,*q; p=L; ElemType temp=0; printf("请按递增的顺序输入数据,输入-1结束\n"); for(int i=0;;i++) { scanf("%d",&temp); if(temp == -1)break; q=(LinkList *)malloc(sizeof(LNode)); q->data=temp; q->next=NULL; p->next=q; p=q; L->data++; } return OK; } Status PrintfLinkList(LinkList *L) { LinkList *p; p=L->next; while(p!=NULL) { printf("%d\t",p->data); p=p->next; } printf("\n"); return 0; } void main() { LinkList *m; m=(LinkList *)malloc(sizeof(LNode)); CreatLinkList(m); PrintfLinkList(m); }
C++链表头指针位置不知为什么出错
希望实现第一行输入n和m,后面共输入n+m行 后面有n行由四个数字组成,第一个为1,表示创建新的结点,第二个为此 结点的数据域,第三个为某个结点的数据域(如果为-1则表示此为第一个 创建的结点),第四个为0或者1,若为0表示新结点 建立在第三个数字代表的结点的左边,若为1则表示在右边。 后面有m行由2个数字组成,第一个为0,表示删除结点,第二个为需要删除 的结点的数据域。 最终把最后的链表打印出来,并在末尾加-1表示输出结束。 代码如下: #include<iostream> #include<conio.h> using namespace std; typedef struct node //同学结点 { int data; //同学编号 struct node *next; //结点指针,指向下一个 }NODE; class list { private: NODE *head; int length; public: list(){head=NULL;length=0;} ~list(){} int find(int i) { NODE *p=head; int j=1; //元素地址,第一位标记为第1位 while(p&&p->data!=i&&p&&p!=NULL) { p=p->next; j++; } if(p==NULL)return 0; //未找到返回0 return j; } int Insert(int i,int x,int k) { NODE *p=head, *s; int j=0; int location=find(x); if(location==0) { s=(NODE *)new NODE[1]; s->data=i; s->next=p; head=s; length++; return 1; } if(k==0) //插入左边 { while(p&&j<location-2){p=p->next;j++;} if(!p)return 0; s=(NODE *)new NODE[1]; s->data=i; s->next=p->next; p->next=s; length++; return 1; } else if(k==1) //插入右边??? { while(p&&j<location-1){p=p->next;j++;} if(!p)return 0; s=(NODE *)new NODE[1]; s->data=i; s->next=p->next; p->next=s; length++; return 1; } return 0; } int Delete(int i) { NODE *p=head,*q; int j=0; int location=find(i); if(!p)return 0; if(location==1) { head=head->next; delete p; p=NULL; length--; return 1; } while(p->next&&j<i-1){p=p->next;j++;} if(!(p->next)||j>i-1)return 0; q=p->next; p->next=q->next; delete q; q=NULL; length--; return 1; } void setlength(int n,int m) { length=n-m; } void print() //打印函数 { NODE *p=head; for(int i=0;i<length&&p!=NULL&&p;i++) { cout<<p->data<<' '; p=p->next; } } }; int main() { list student; int m,n,a1,a2,a3,a4,a5; scanf("%d",&n); scanf("%d",&m); student.setlength(n,m); for(int i=0;i<n+m;i++) { scanf("%d",&a1); if(a1==1) { scanf("%d",&a2); scanf("%d",&a3); scanf("%d",&a4); student.Insert(a2,a3,a4); } if(a1==0) { scanf("%d",&a5); student.Delete(a5); } } student.print(); cout<<-1; return 0; } 结果指针的顺序倒是没问题,但是打印出来的结果 经常不是从头开始打印,请问这是为什么?
验证线性表及其上的基本操作。
要求 1、 定义单链表类及双向循环链表类。 2、 实现如下功能: 1 根据输入的测试数据(整型)按序从无到有创建一个单链表 L1。 比如,输入{9,2,5},单链表 L1 中结点顺序为,9->2->5 。 2 根据老师输入的测试数据(整型)创建一个非降序单链表 L2。比如, 输入{9,2,5},单链表 L2 中结点顺序为,2->5->9。 3 打印单链表 L2 中表头至表尾所有结点的数据域值,并输出单链表长度 以及这些结点数据域之和。 4 打印单链表 L1 中表尾至表头所有结点的数据域值,并输出最大值及最 小值。 5 由单链表 L1 生成一个双向循环链表 L3. 查找 L3 中任一结点,并输出从 该结点出发沿右指针域访问的线性表遍历序列。
输入序列生成二叉树(c++版的)
输入一个序列,生成一个二叉树。 二叉树采用二叉链表形式构造。 要求: 创建一个adtTree,方法有二叉树的生成。 验证是否正确,采取输出二叉树三种遍历顺序。
编程实现有向图的深度和广度优先遍历
1. 输入一个有向图的顶点数 n 和边数 e,设图中顶点编号为 1 到 n, 1)依次输入每个边的起点和终点,创建该图的邻接表; 2)边链表中边结点编号按照从小到大的顺序存储。 2. 实现图的深度优先遍历和广度优先遍历,输入顶点序号 v,给出 1 中有向图 自 v 开始的深度优先遍历序列和广度优先遍历序列
数据结构链表创建出错
麻烦大家帮我看看哪里出错了,十分感谢啊 #include "stdio.h" #include "malloc.h" #include "stdlib.h" #define NULL 0 #define OK 1 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,LinkList; Status InitLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); return 0; } Status CreatLinkList(LinkList *L) { L=(LinkList *)malloc(sizeof(LNode)); L->next=NULL; LinkList *p,*q; p=L; ElemType temp=0; printf("请按递增的顺序输入数据,输入-1结束\n"); for(int i=0;;i++) { scanf("%d",temp); if(temp == -1)break; q=(LinkList *)malloc(sizeof(LNode)); q->data=temp; q->next=NULL; p->next=q; p=q; L->data++; } return OK; } Status PrintfLinkList(LinkList *L) { LinkList *p; p=L->next; while(p!=NULL) { printf("%d\t",p->data); p=p->next; } printf("\n"); return 0; } void main() { LinkList *m; m=(LinkList *)malloc(sizeof(LNode)); CreatLinkList(m); PrintfLinkList(m); }
用C++创建单链表,运行到p->next=(*list)->next;时显示发生访问冲突
![图片说明](https://img-ask.csdn.net/upload/201905/04/1556935808_498196.png) 代码如下 ``` #include<iostream> using namespace std; struct Node//创建单链表结构体 { int date; Node *next; }; int list_headinsert(Node **list, int a[], int n); int getlist(Node *list, int i); int main() { int *p, n; cout << "请输入n="; cin >> n; p = new int[n]; for (int i = 0; i < n; i++) { cout << "请输入第" << i << "个元素="; cin >> p[i]; } Node **list=new Node*;//创建一个空表; if (*list == NULL) { cout << "空间申请失败"; return 0; } list_headinsert(list, p, n); for (int i = 1; i < n; i++)//按顺序导出数据元素; cout << getlist(*list, i) << ' '; return 1; } int list_headinsert(Node **list, int a[], int n)//头插法新建带头结点的单链表,并将数组元素导入 { Node *p = new Node; p->next = NULL; for (int i = n; i >1; i--) { Node*p = new Node; p->date = a[i]; p->next = (*list)->next; (*list)->next = p; } return 1; } int getlist(Node *list, int i)//查找链表数据元素 { Node *p = list->next; int j = 0; if (p == NULL) { cout << "空表"; return 0; } while (p&& j < i) { p = p->next; j++; } return p->date; } ```
关于链表打印问题,链表头与表头指针所指向的节点。
typedef struct Node { int data; struct Node *next; }SLIST; p = pHead->next; p为头链表的指针,也就是指向第二个节点,应该从用户输入的第二个数字打印才对。 为什么连链表头都打印了?![图片](https://img-ask.csdn.net/upload/201602/18/1455787513_927132.png)![图片](https://img-ask.csdn.net/upload/201602/18/1455787521_576596.png) 这个是看不清部分的代码 SLIST *Creat_SList() { //1 创建头结点并初始化 int data = 0; SLIST *pHead = NULL, *pM = NULL, *pCur; pHead = (SLIST *)malloc(sizeof(SLIST)); pHead->data = 0; pHead->next = NULL; //2循环创建结点,结点数据域中的数值从键盘输入, //以-1作为输入结束标志 printf("\nPlease enter the data of node(-1:quit) "); scanf("%d", &data); //准备环境 让pCur指向pHead pCur = pHead; while(data != -1) { //不断的malloc新节点 并且数据域 赋值 pM = (SLIST *)malloc(sizeof(SLIST)); pM->data = data; pM->next = NULL; //1新节点入链表 pCur->next = pM; //2 当前结点下移(新结点变成当前结点) pCur = pM; // (pCur = pCur->next) pCur之前不是指向head吗?现在指向了PM. printf("\nPlease enter the data of node(-1:quit) "); scanf("%d", &data); } return pHead; } 我链表头也记录数据了,它应该从第二个接点开始打印才对,为什么从链表头开始打印了?
我写的链表,每次到末尾插入的时候就会报错 调试的时候出现segmentation fault 请大佬看看时怎么回事
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct stu{ int score; char name[10]; struct stu *next; }STU; STU *creat1(STU *head,int n); STU *creat2(STU *head,STU *tail,int n); void myprintf(STU*); STU *insert(STU *head); STU *delet(STU *head); int main(){ int n,num; STU *head=NULL;//头指针 STU *tail=NULL;//尾指针 记得初始化为NULL。 char name[10]; printf("*********1.创建链表。***********************\n"); printf("*********2.输出所有的节点内容。*************\n"); printf("*********3.插入一个新的节点。***************\n"); printf("*********4.删除一个节点。*******************\n"); printf("*********5.修改一个节点。*******************\n"); printf("*********6.结束操作。***********************\n"); printf("请输入指令:"); scanf("%d",&n); do{ switch(n){ case 1: printf("请输入节点数:"); scanf("%d",&num); head=creat2(head,tail,num); break; case 2: myprintf(head); break; case 3: head=insert(head); break; case 4: head=delet(head); break; // case 5:change(head); break; case 6: printf("欢迎您再次使用!"); break; default:printf("请输入正确的数值!"); scanf("%d",&n); continue; } if(n!=6){ printf("请输入指令:"); scanf("%d",&n); } }while(n!=6); return 0; } /*struct stu *creat1(STU *head,int n){//头部差法。最后一个输入的第一个出现,后面的直接插在头上。 STU *p; int i;// for(i=0;i<n;i++){ p=(STU*)malloc(sizeof(STU));//先给指针分配空间,这是创建的第一件事。 printf("请输入学生的分数:"); scanf("%d",&p->score); printf("请输入学生的名字:"); scanf("%s",&p->name); p->next=head; head=p;//这两步可以用图理解 不然死记也行。 } return head; }*/ STU*creat2(STU *head,STU *tail,int n){//尾部差法。最后一个输出在最后一个出现,后面的在后面加。 STU *p; int i; for(i=0;i<n;i++){ p=(STU*)malloc(sizeof(STU)); printf("请输入学生的分数:"); scanf("%d",&p->score); printf("请输入学生的名字:"); scanf("%s",&p->name); p->next=NULL; if(head==NULL) head=p; else tail->next=p; tail=p; } return head; } void myprintf(struct stu *head){ STU*p; p=head; do{ printf("%3d %s\n",p->score,p->name); p=p->next; }while(p!=NULL); } STU*insert(STU *head){//按一定的顺序插入,之前就要保证是按顺序的。 这个是从小到大排序。 STU *p=NULL,*p2=NULL,*p1=NULL; int i; p=(STU*)malloc(sizeof(STU)); printf("请输入新加入的学生的分数:"); scanf("%d",&p->score); printf("请输入新加入的学生的名字:"); scanf("%s",&p->name); p2=head; /*while (p2->score<p->score && p2){//当插到最后一个点时会报错 我也不知道怎么改了。。。 p1=p2; p2=p2->next; } if(!p2){//新插入的学生的分数最高 ,在最后面。 p1->next=p; p->next=NULL; } else if(p2==head){//新插入的学生分最少,在最前面。 p->next=p2; head=p; } else{//新插入的同学的中间的一个。 p1->next=p; p->next=p2; }*/ return head; } STU *delet(STU *head){ STU *p1=NULL,*p2=NULL; char t[10]; printf("请输入要删除的学生的名字:"); scanf("%s",t); p1=head; p2=head; while (strcmp(p2->name,t) && p2){ p1=p2; p2=p2->next; } if(!p2) printf("没有找到该同学!"); else if(p2==head){ head=p2->next; free(p2); } else if(!p2->next){ p1->next=NULL; free(p2); } else { p1->next=p2->next; free(p2); } return head; } ``` ``` ``` ```
链表排序出了问题,求大佬帮忙看看
输出时会中断,注释掉之后没有输出了;最后找到应该是链表排序的问题,但没找到哪里错了,求大佬解惑 ``` #include<stdio.h> #include<string.h> #include<stdlib.h> /*定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项 分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针, 其中:学号、姓名、成绩是输入项,等级、名次是计算项*/ struct StuLink*Creat_Link(); //创建链表 struct StuLink*Rank_Link(struct StuLink*list); //计算名次 void display(struct StuLink *p); //输出一个节电的内容 struct StuLink*Sort_Link(struct StuLink *list,int n);//链表排序 struct StuLink*Output_Link(struct StuLink*list,int n);//链表按顺序输出 void menu1(); void menu2(); int main() { struct StuLink*list; menu1(); list=Creat_Link (); //display(list);Output_Link(list,0); Rank_Link(list); //Output_Link(list,1); display(list);Output_Link(list,0); printf("嘤嘤嘤"); return 0; } struct StuLink { int xh; char xm[20]; int cj; char dj; int mc; struct StuLink*next; }; /* Creat_Link函数(10分):建立一个StuLink类型的学生链表,返回链表头指针 每个链表结点代表一个学生信息,要求输入学号、姓名和成绩 其中:学号从1开始按递增1自动生成,成绩必须在[0,100]区间的整数,当输入成绩为-1时,表示输入结束*/ struct StuLink*Creat_Link() { struct StuLink*list=0,*p1=0,*p2;int i=0; int score;char name[20]; //list->xh =0;p2=list; printf("\n输入成绩为-1,结束输入!\n"); printf("请输入学生姓名"); scanf("%s",name); printf("请输入学生成绩"); scanf("%d",&score ); while(score!=-1) { if(score<0||score>100) { printf("输入成绩格式错误,请重新输入正确的学生成绩\n"); scanf("%d",&score ); continue ; } if( (p1=(struct StuLink*)malloc(sizeof(struct StuLink))) ==0) { printf("动态内存空间分配失败\n"); exit(0); } else { switch(score/10) { case 9:p1->dj='A';break; //计算等级 case 8:p1->dj='B';break; case 7:p1->dj='C';break; case 6:p1->dj='D';break; default:p1->dj='E'; } i++; p1->xh =i; p1->cj =score; strcpy(p1->xm,name); if(list==0) list=p1; else p2->next=p1; p2=p1; printf("请输入学生姓名 "); scanf("%s",name); printf("请输入学生成绩 "); scanf("%d",&score); } } return list; } /*设计Rank_Link函数(10分):计算学生链表中每个学生的名次 名次规则:按成绩降序排名,从第1名开始依次排名,若出现并列名次,则名次需要叠加 例如,若出现5个并列第1名,则没有第2名,下一个名次是第6名,依此类推。*/ struct StuLink *Rank_Link(struct StuLink*list) { struct StuLink *p1,*p2; p1=list;p2=list;; while(p1) { while(p2) { p1->mc=1; if(p1->cj<p2->cj) //算法:每一个节点的成绩都依次和list开始所有节点比较一遍 (p1->mc)++; //若有一个节点成绩更高,则名次变大1,成绩相同则不变; p2=p1->next; } p1=p1->next; } return list; } /*设计Sort_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】对学生链表进行排序*/ struct StuLink*Sort_Link(struct StuLink *list,int n) { if(n=0) //若链表排序后改变了原学号排序方式和list,则其他函数诸多不变 {} //故此处可新建一个链表,按名次进行排序;返回新链表地址 (*****未完成*******) //此处为判定排序方式; } /*设计Output_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】输出学生成绩表、各等级人数。 学生成绩表每行输出一个学生信息(依次为学号、姓名、成绩、等级和名次,各项间以1个空格隔开),各等级人数分行输出*/ void display(struct StuLink *p) { printf("学号 %d",p->xh); printf("姓名 %s",p->xm); printf("成绩 %d",p->cj); printf("等级 %c",p->dj); if(p->mc>1) printf("名次 %d\n",p->mc); else printf("kong"); if(p->mc) printf("名次 %d\n",p->mc); else printf("kong"); } struct StuLink*Output_Link(struct StuLink *list,int n) { struct StuLink *Rank_Link(list); int i=1,j=0;struct StuLink*p=NULL;p=list; if(n==1) //如果按成绩名次输出 { for(i=1;;i++) { if(p) { if(p->mc ==i) { j++; display(p); } p=p->next; } //算法:由i循环控制,从头结点到尾先找到第i名并输出;(ok) else if(j) continue; //若上面判定是while(p),则p为空小循环停止后是否跳出第i词for循环进行下一次; else break; //遍历链表后若无对应名次则所有名次学生均已输出,跳出i的for循环 } } else { while(p) { display(p); p=p->next; } } return list; } void menu1 () { printf("===============================================\n"); printf("|| 1--创建链表 2--链表维护 ||\n"); printf("|| 3--计算排序 4--统计分析 ||\n"); printf("|| 5--报表输出 0--退出 ||\n"); printf("===============================================\n"); printf(" 请输入菜单编号(0,1-5): "); } ```
新手求指教!用c语言 简单学生成绩统计软件 。万分感谢,编好发到邮箱425572938@.
实现的任务: (1)每个学生记录中包含学号、姓名和C 语言课设成绩等信息; (2)创建学生记录链表; (3)更新学生记录(插入、排序、删除); (4)能统计各分数段的人数,并以分布图显示; (5)输出学生记录到屏幕。 设计内容: 1. 学生记录应该包括学号、姓名、C 语言课设成绩等信息,是本程序的核心数据结构,定 义如下: typedef struct { char num[11]; /*学号*/ char name[10]; /*姓名*/ int cgrade; /*c 语言课设成绩*/ }elemtype ; 使用链表实现学生记录的存储,链表中的结点结构如下: typedef struct node { elemtype data; struct node * next; } NODE,*Nodeptr; int n=0; 2.程序应具有以下基本功能: (1)以菜单形式显示主界面,提示用户进行选择,完成相应任务,如图1-1 所示。 (2)创建学生记录链表:从键盘输入一定数量的学生记录。 (3)插入学生记录:从键盘输入待插入的学生记录,插入到指定位置。 (4)对学生记录中的C 语言课设成绩按指定顺序(升序、降序)进行排序; (5)删除学生记录:在指定位置上删除学生记录。 (6)能统计各分数段的人数,并以分布图显示,如图1-2 所示。 (7)输出学生记录到屏幕。 设计要求: 1.核心数据结构用到的结构体要采用动态内存分配和链表结构。 2.使用文件进行存储和管理。程序启动时可从文件中读取学生成绩信息, 或从键盘输入学生成绩信息;运行过程中如添加或删除记录时也可对文件进 行存取;退出前可根据需要提醒是否保存学生成绩信息到文件中。 3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用 接口要注释清楚。对程序其它部分也进行必要的注释。
c程序求查错 自己真找不出哪里错了
test3.cpp ``` #include<stdio.h> #include<string.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW 0 typedef int Elemtype; /*通讯录的结构*/ typedef struct MailList{ int num; char name[20]; char tel1[12]; char tel2[12]; char email[50]; }MailList; /*用于恢复删除信息的结构*/ typedef struct DeleteList{ MailList data; DeleteList *next; }DeleteList,*LinkList; /*顺序表的定义结构*/ typedef struct{ MailList *elem; //存储空间基址 int length; //当前长度 int Listsize; //当前分配的存储容量 }SqList; int InitList_Sq(SqList &L);//初始化通讯录 bool InitList_Delete(MailList &L);//初始化回收站 int ListIsert_Sq(SqList &L,int i,Elemtype e);//插入数据 void ShowAll(SqList &L);//显示全部通讯录内容 int deleteList(SqList &L1,int i,MailList &e);//删除某一条并以e返回 void ListInsert(LinkList &L,MailList x);//添加到回收站 void WatchList(LinkList &L);//查看回收站 bool find_int(SqList &L,int x);//按照编号查找数据 void find_char(SqList &L,char x[]);//按照姓名查找数据 bool recoverList(LinkList &L2,int n,MailList &e);//从回收站中删除并以e返回 bool ChangeList(SqList &L1,int n);//修改信息 #include"test3_Seq.h" #include"test3_Link.h" int main(void) { SqList L1; InitList_Sq(L1); LinkList L2; InitList_Delete(L2); MailList M; int i = 1; printf("请创建新的通讯录,格式为:姓名 电话1 电话2 电子邮箱。(输入数字“0”结束)\n"); while(1) { M.num = i; scanf("%s",M.name); if(M.name[0] == '0') break; scanf("%s %s %s",M.tel1,M.tel2,M.email); ListIsert_Sq(L1,M); i ++; } printf("输入成功!^_^\n"); int number; while(1){ printf("请输入数字进行相关操作\n1.查看通讯录\n2.查找通讯录\n3.添加通讯录\n4.修改通讯录\n5.删除通讯录\n6.查看已删除的通讯录\n7.恢复通讯录\n0.退出菜单\n"); scanf("%d",&number); switch(number) { case 1: ShowAll(L1); break; case 2: int n,m; char find_name[20]; printf("选择查找方式\n1.按编号查找\n2.按姓名查找\n"); scanf("%d",&n); if(n == 1) { printf("请输入编号: "); scanf("%d",&m); find_int(L1,m); } else if(n == 2) { printf("请输入姓名: "); scanf("%s",find_name); find_char(L1,find_name); } break; case 3: printf("请输入你要添加的内容: "); M.num = i; scanf("%s %s %s %s",M.name,M.tel1,M.tel2,M.email); ListIsert_Sq(L1,M); i ++; break; case 4: int c; printf("请输入你要修改的条目编号: "); scanf("%d",&c); ChangeList(L1,c); break; case 5: int a; printf("请输入你要删除的成员序号: "); scanf("%d",&a); MailList N; deleteList(L1,a,N); ListInsert(L2,N); break; case 6: WatchList(L2); break; case 7: int b; printf("请输入要还原的成员在回收站中的编号: "); scanf("%d",&b); recoverList(L2,b,M); ListIsert_Sq(L1,M); break; case 0: free(L1.elem); return 0; default: printf("请输入正确的数字!\n"); break; } } } ``` test_Link.h ``` #include<stdio.h> #include<stdlib.h> //此函数用于创建链表 int InitList_Delete(LinkList &L) { L = NULL; L = (LinkList)malloc(sizeof(DeleteList)); if(L == NULL) return 0; LinkList P = L -> next; P = NULL; return 1; } //此函数用于在链表中(回收站)插入元素 void ListInsert(LinkList &L,MailList x) { LinkList p,q; p = L; while(p->next) p = p->next; q = (LinkList)malloc(sizeof(DeleteList)); q->data = x; q->next = p->next; p->next = q; printf("删除成功!可在回收站中查看。\n"); } //此函数用于查看回收站 void WatchList(LinkList &L) { LinkList p; p = L->next; while(p) { printf("%d %s %s %s %s\n",p->data.num,p->data.name,p->data.tel1,p->data.tel2,p->data.email); p = p->next; } } //此函数用于从回收站中删除数据并以e返回 int recoverList(LinkList &L2,int n,MailList &e) { LinkList p,q; int i,k = 0; q = L2->next; while(q){ q = q->next; k ++; } if(n < 1 || n > k){ printf("输入错误\n"); return 0; } p = L2; for(i = 0;i < n - 1;i ++) p = p->next; e = p->next->data; p->next = p->next->next; printf("恢复成功!\n"); return 1; } ``` test_Seq.h ``` #include<stdio.h> #include<stdlib.h> /*此函数用于初始化顺序表*/ int InitList_Sq(SqList &L) { L.elem = (MailList *)malloc(LIST_INIT_SIZE*sizeof(MailList)); //为线性表分配100个空间 if(! L.elem) exit(OVERFLOW); //如果分配失败则返回0 L.length = 0; L.Listsize = LIST_INIT_SIZE; return 1; } //此函数用于删除第i条内容 int deleteList(SqList &L1,int i,MailList &e) { if((i<1)||(i>L1.length)) { printf("请输入正确的数字!\n"); return 0; } int j; e = L1.elem[i - 1]; for(j = i;j <= L1.length -1;j ++) { L1.elem[j].num --; L1.elem[j - 1] = L1.elem[j]; } L1.length --; return 1; } /*此函数用于在顺序表末尾插入数据元素*/ int ListIsert_Sq(SqList &L,MailList e) { MailList *newbase ; if(L.length >=L.Listsize) { newbase = (MailList *)realloc(L.elem,(L.Listsize + LISTINCREMENT) * sizeof(MailList)); if(! newbase) exit(OVERFLOW); L.elem = newbase; L.Listsize +=LISTINCREMENT; } MailList *p; p = &(L.elem[L.length]); *p = e; ++ L.length; return 1; } //此函数用于显示整个通讯录内容 void ShowAll(SqList &L) { MailList* p; p = &(L.elem[0]); for (p = &(L.elem[0]);p < &(L.elem[L.length]);p ++) printf("%d %s %s %s %s\n",p->num,p->name,p->tel1,p->tel2,p->email); } //此函数用于通过编号查找成员信息 int find_int(SqList &L,int x) { if(x < 1 || x > L.length) { printf("编号不存在!\n"); return 0; } MailList *p; int i; p = &(L.elem[0]); for(i = 1;i < x;i ++) p += 1; printf("%d %s %s %s %s\n",p->num,p->name,p->tel1,p->tel2,p->email); } //此函数用于通过姓名查找成员信息 void find_char(SqList &L,char x[]) { MailList* p; int h = 0,i; p = &(L.elem[0]); for(i = 0;i < L.length;i ++) { if(strcmp(p->name,x) == 0) { printf("%d %s %s %s %s\n",p->num,p->name,p->tel1,p->tel2,p->email); h = 1; } p ++; } if(h == 0) printf("编号不存在!\n"); } //此函数用于修改成员信息 int ChangeList(SqList &L1,int n) { if(n < 1 || n > L1.length) { printf("编号不存在!\n"); return 0; } MailList *p; int i; p = &(L1.elem[0]); for(i = 1;i < n;i ++) p += 1; int s = 1; while(s != 0){ printf("请选择你要修改的信息:\n1.姓名\n2.电话1\n3.电话2\n4.电子邮箱\n0.退出\n"); scanf("%d",&s); printf("修改为:"); switch(s) { case 1: char nm[20]; scanf("%s",nm); strcpy(p->name , nm); printf("修改成功!\n"); break; case 2: char t1[12]; scanf("%s",t1); strcpy(p->tel1 , t1); printf("修改成功!\n"); break; case 3: char t2[12]; scanf("%s",t2); strcpy(p->tel2 , t2); printf("修改成功!\n"); break; case 4: char em[50]; scanf("%s",em); strcpy(p->email , em); printf("修改成功!\n"); break; case 0: return 1; default: printf("请输入正确的数字!\n"); } } } ```
数据结构问题:一棵普通的树转化成二叉树,为什么输出的时候无法输出呢(是我转化没有成功吗)?
``` /* 树转换为二叉树 题目说明:建立一棵树,将其转化为二叉树,并给出该二叉树的先序遍历序列。 要求:树为任意输入,以孩子链表法存储,转换所得二叉树以二叉链表为存储结构。 */ #include <stdio.h> #include <stdlib.h> #define MAX_TREE_SIZE 100 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int TElemType; typedef int Status; #define OK 1 void visit(TElemType e) { printf("%d", e); } typedef struct CTNode { //孩子结点 int child; struct CTNode *next; }*ChildPtr; typedef struct { TElemType data;//结点值 ChildPtr firstchild; //孩子链表头指针 //可增设一个双亲的域,能方便地找到其双亲。int Parent; }CTBox; typedef struct { CTBox nodes[MAX_TREE_SIZE]; //建立顺序表头结构 int n, r; //结点数和根的位置 }CTree; typedef struct BTNode { int data; CTBox list[MAX_TREE_SIZE]; struct BTNode *lchild; struct BTNode *rchild;//兄弟结点 }BTNode; typedef struct { CTBox list[MAX_TREE_SIZE];//邻接表表头 int n;//结点个数 }Tree;//定义树 //--------------树的孩子链表存储表示------------------- Status CreateTree(CTree &T) { //构建一棵树 int i; printf("请输入结点数及根结点的位置下标:\n"); scanf("%d %d",&T.n, &T.r); printf("请输入各节点的值\n"); for(i = 0; i < T.n; ++i) { scanf("%d",&T.nodes[i].data); T.nodes[i].firstchild = NULL; } printf("创建每个结点的孩子结点...\n"); system("pause"); for(i =0; i < T.n; ++i) { printf("请输入位置为%d的结点的孩子个数(>=0)(有孩子则输入孩子们的位置,无则输入0):\n",i); int nChild=0; scanf("%d",&nChild); ChildPtr p=NULL; //p指向插入孩子位置的前一个位置 ChildPtr q=NULL; //q用于提示即将插入的新b孩子链表结点 for(int j = 0; j < nChild; ++j) { q= (ChildPtr)malloc(sizeof(struct CTNode));//为孩子的位置开辟一个空间 if(!q) exit(OVERFLOW); scanf("%d",&(q->child)); //将孩子链表结点置入位置值 q->next = NULL; if(j == 0)//将孩子链表头结点指向孩子链表第一个结点 { T.nodes[i].firstchild = q; } else { p->next = q; } p = q; } } return OK; } Status PrintChild(const ChildPtr &C) {//打印出结点的孩子 if(C) { ChildPtr p; p = C; while(p) { printf("[%d| ] ->",p->child); p = p->next; } printf("^"); //return TRUE; } else { printf("^"); //return FALSE; } } void PrintChildTree(const CTree &T)//输出树的结点及他们的孩子 { printf("\n位置%d为树的根%d\n\n", T.r, T.nodes[T.r].data); for(int i = 0; i < T.n; ++i) { printf("位置%d,结点值[%d| ] ->", i, T.nodes[i].data); PrintChild(T.nodes[i].firstchild); printf("\n"); } printf("---建立树成功----"); } //--------------树转化为二叉树-------------- ? void treeToBtree(Tree *t,BTNode *bt,int i) {//树转二叉树 if(t != NULL) { CTBox *p = &(t->list[i]); bt->list[i]= t->list[i];//二叉树的头结点等于树的头结点 ChildPtr b = p->firstchild;//该结点的孩子结点 BTNode *q = bt->lchild;//二叉树的左孩子结点 while(b)//把该层的树全部转为二叉树 { treeToBtree(t,q,b->child);//若该结点以及该结点的子孙结点转为二叉树 b = b->next;//指向树结点下一个孩子结点 q = q->rchild;//指向二叉树的右孩子结点 } } } void PrintAsTree(BTNode *T,int i) //显示转化结果 { int cnt; if (T!=NULL) { printf("转化后的二叉树:"); for (cnt=1; cnt<i; cnt++) //visit(T->data); printf("\n"); printf("位置%d,结点值[%d| ] ->", cnt, T->data); PrintAsTree(T->lchild, i+1); //遍历左孩子 PrintAsTree(T->rchild, i); //遍历右孩子 } } //---------------二叉树的先序遍历---------------- void PreOrder(BTNode *T) { if(T==NULL) return; else { printf("二叉树的先序遍历结果为:"); printf("%d--",T->data); PreOrder(T->lchild); PreOrder(T->rchild); } } int main() { CTree T; Tree *Y; BTNode *bt; ChildPtr C; int i; i=T.n; CreateTree(T); PrintChildTree(T);//输出普通树的结点值 PrintChild(C); //输出各结点的孩子结点值 treeToBtree(Y,bt,i);//树转化为二叉树 PrintAsTree(bt,i);//输出转化后的二叉树 PreOrder(bt); //输出二叉树的先序遍历序列 return 0; } ```
单链表的创建及操作(代码已给出)
代码如下,只是自己不知道输入的顺序,有点蒙,希望大神给出运行截图,最好有点解释,谢谢![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/66.gif) #include <iostream> #include<iomanip> using namespace std; struct student//定义结构体变量; { long int num; double score; student *next; }; student *creatlink()//创建链表节点 { student *p1,*p2,*p3,*head=NULL;//初始化头指针; p1=new student;//动态申请内存, cin>>p1->num>>p1->score;//输入结构体中的内容(为了好以0 0结束创建节点) if(p1->num!=0&&p1->score!=0) { head=p1; while(p1->num!=0&&p1->score!=0)//判断是不是0 0; { p2=new student;//再次申请内存。 p1->next=p2; p3=p1; cin>>p2->num>>p2->score;//输入数据 p1=p2; } p3->next=NULL;//尾指针置空。 } else head=NULL; return head; } student *dellink(student *head,long m) { student *p=head,*p1; while(p!=NULL) { if((p->num==m)&&(p==head))//如果要删除的节点在头上。 { head=p->next; break; } else if((p->num==m)&&(p->next==NULL))//删除的节点在结尾 { p=NULL; } else { if(p->num!=m)//要删的节点在中间时判断是否是要删的节点 { p1=p; p=p->next; } else { p1->next=p->next; break; } } } return head; } student *insertlink(student *head,student *stu) { student *p,*p1,*p3,*p2; p=head; p2=new student;//申请动态内存,为了将新的节点地址变化(如果不变第二次插入式会出错) //cout<<p2<<endl; p2->num=stu->num;//赋值,(也可以用结构体直接赋值) p2->score=stu->score; p2->next=stu->next; p1=p2; if(head==NULL)//判断链表是否为空 { head=p1; p1->next=NULL; } else { while(p->next->next!=NULL) { if((p->num<=p1->num)&&(p->next->num>=p1->num))//判断是否是要插入的位置(此处要求输入是按升序输入的,插入时按升序插入) { p3=p->next; p->next=p1; p1->next=p3; break; } p=p->next; } //cout<<p->next->next<<endl; if((p->num<=p1->num)&&(p->next->num>=p1->num))//由于判断结束的标志是p->next->next,所以还有两组数据还没比较。 { p3=p->next; p->next=p1; p1->next=p3; } else if(p->next->num<=p1->num) { p->next->next=p1; p1->next=NULL; } } return head; } void printlink(student *head) { student *p=head; while(p->next!=NULL) { cout<<p->num<<" "<<p->score<<endl; p=p->next; } cout<<p->num<<" "<<p->score<<endl; } void freelink(student *head) { student *p=head,*p1; while(p!=NULL) { p1=p->next;//存储下一个指针的内容 delete(p);//释放p的内存 p=p1; } delete(p); } int main() { student *creatlink(void); student *dellink(student *,long); student *insertlink(student *,student *); void printlink(student *); void freelink(student *); student *head,stu; long del_num; head=creatlink(); cin>>del_num; head=dellink(head,del_num); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cout<<setiosflags(ios::fixed); cout<<setprecision(2); printlink(head); freelink(head); return 0; }
单链表的创建及其他操作
这是一段代码,但是自己不会运行(搞不清输入顺序,希望大神给个代码运行截图,最好解释一下,谢谢了) #include <iostream> #include<iomanip> using namespace std; struct student//定义结构体变量; { long int num; double score; student *next; }; student *creatlink()//创建链表节点 { student *p1,*p2,*p3,*head=NULL;//初始化头指针; p1=new student;//动态申请内存, cin>>p1->num>>p1->score;//输入结构体中的内容(为了好以0 0结束创建节点) if(p1->num!=0&&p1->score!=0) { head=p1; while(p1->num!=0&&p1->score!=0)//判断是不是0 0; { p2=new student;//再次申请内存。 p1->next=p2; p3=p1; cin>>p2->num>>p2->score;//输入数据 p1=p2; } p3->next=NULL;//尾指针置空。 } else head=NULL; return head; } student *dellink(student *head,long m) { student *p=head,*p1; while(p!=NULL) { if((p->num==m)&&(p==head))//如果要删除的节点在头上。 { head=p->next; break; } else if((p->num==m)&&(p->next==NULL))//删除的节点在结尾 { p=NULL; } else { if(p->num!=m)//要删的节点在中间时判断是否是要删的节点 { p1=p; p=p->next; } else { p1->next=p->next; break; } } } return head; } student *insertlink(student *head,student *stu) { student *p,*p1,*p3,*p2; p=head; p2=new student;//申请动态内存,为了将新的节点地址变化(如果不变第二次插入式会出错) //cout<<p2<<endl; p2->num=stu->num;//赋值,(也可以用结构体直接赋值) p2->score=stu->score; p2->next=stu->next; p1=p2; if(head==NULL)//判断链表是否为空 { head=p1; p1->next=NULL; } else { while(p->next->next!=NULL) { if((p->num<=p1->num)&&(p->next->num>=p1->num))//判断是否是要插入的位置(此处要求输入是按升序输入的,插入时按升序插入) { p3=p->next; p->next=p1; p1->next=p3; break; } p=p->next; } //cout<<p->next->next<<endl; if((p->num<=p1->num)&&(p->next->num>=p1->num))//由于判断结束的标志是p->next->next,所以还有两组数据还没比较。 { p3=p->next; p->next=p1; p1->next=p3; } else if(p->next->num<=p1->num) { p->next->next=p1; p1->next=NULL; } } return head; } void printlink(student *head) { student *p=head; while(p->next!=NULL) { cout<<p->num<<" "<<p->score<<endl; p=p->next; } cout<<p->num<<" "<<p->score<<endl; } void freelink(student *head) { student *p=head,*p1; while(p!=NULL) { p1=p->next;//存储下一个指针的内容 delete(p);//释放p的内存 p=p1; } delete(p); } int main() { student *creatlink(void); student *dellink(student *,long); student *insertlink(student *,student *); void printlink(student *); void freelink(student *); student *head,stu; long del_num; head=creatlink(); cin>>del_num; head=dellink(head,del_num); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cin>>stu.num>>stu.score; head=insertlink(head,&stu); cout<<setiosflags(ios::fixed); cout<<setprecision(2); printlink(head); freelink(head); return 0; }
两个指针指向同一个节点,明明对两个指针操作一样却一个正常,一个无法读取内存,急求大佬解惑
求大佬帮忙解惑,万分感谢 出错函数代码如下 ``` struct StuLink*Rank_Link(struct StuLink*list) { struct StuLink *p1,*p2; p1=list;p2=list; for(;p1!=NULL ;p1=p1->next) for(;p2!=NULL;p2=p2->next) { if(p1->xh ==p2->xh ) continue; if(p1->cj<p2->cj) p1->mc++; } return list; } ``` + p1 0x00be9f38 {xh=1 xm=0x00be9f3c "aaa" cj=88 ...} StuLink * + p2 0xcdcdcdcd {xh=??? xm=0xcdcdcdd1 <读取字符串的字符时出错。> cj=??? ...} StuLink * /*设计Rank_Link函数(10分):计算学生链表中每个学生的名次 名次规则:按成绩降序排名,从第1名开始依次排名,若出现并列名次,则名次需要叠加 例如,若出现5个并列第1名,则没有第2名,下一个名次是第6名,依此类推。*/ 完整简化程序如下 ``` #include<stdio.h> #include<string.h> #include<stdlib.h> /*定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项 分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针, 其中:学号、姓名、成绩是输入项,等级、名次是计算项*/ struct StuLink*Creat_Link(); //创建链表 struct StuLink*Rank_Link(struct StuLink*list); //计算名次 void display(struct StuLink *p); //输出一个结点的内容 struct StuLink*Sort_Link(struct StuLink *list,int n);//链表排序 struct StuLink*Output_Link(struct StuLink*list);//链表按顺序输出 void menu1();//一级菜单 void menu2(); //创建链表 struct StuLink { int xh; char xm[20]; int cj; char dj; int mc; struct StuLink*next; }; int main() { struct StuLink *list; list=Creat_Link(); Rank_Link(list); Output_Link(list); return 0; } struct StuLink*Creat_Link() { struct StuLink*list=0,*p1=0,*p2;int i=0; int score;char name[20]; //list->xh =0;p2=list; printf("\n输入成绩为-1,结束输入!\n"); printf("请输入学生姓名"); scanf("%s",name); printf("请输入学生成绩"); scanf("%d",&score ); while(score!=-1) { if(score<0||score>100) { printf("输入成绩格式错误,请重新输入正确的学生成绩\n"); scanf("%d",&score ); continue ; } if( (p1=(struct StuLink*)malloc(sizeof(struct StuLink))) ==0) { printf("动态内存空间分配失败\n"); exit(0); } else { switch(score/10) { case 9:p1->dj='A';break; //计算等级 case 8:p1->dj='B';break; case 7:p1->dj='C';break; case 6:p1->dj='D';break; default:p1->dj='E'; } i++; p1->xh =i; p1->cj =score; p1->mc=1; strcpy(p1->xm,name); if(list==0) list=p1; else p2->next=p1; p2=p1; printf("请输入学生姓名 "); scanf("%s",name); printf("请输入学生成绩 "); scanf("%d",&score); } } return list; } void display(struct StuLink*p) { printf("学号 %d",p->xh); printf("姓名 %s",p->xm); printf("成绩 %d",p->cj); printf("等级 %c",p->dj); /*if(p->mc>1)*/ printf("名次 %d\n",p->mc); /*else printf("kong\n");*/ /*if(p->mc) printf("名次 %d\n",p->mc); else printf("kong");*/ } struct StuLink*Rank_Link(struct StuLink*list) { struct StuLink *p1,*p2; p1=list;p2=list; for(;p1!=NULL ;p1=p1->next) for(;p2!=NULL;p2=p2->next) { if(p1->xh ==p2->xh ) continue; if(p1->cj<p2->cj) p1->mc++; } return list; } struct StuLink*Output_Link(struct StuLink*list) { struct StuLink *p3=list; for(;p3!=NULL ;p3=p3->next) display(p3); } ```
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
世界上最牛的网络设备,价格低廉,其貌不扬......
夜深人静,电视和电脑都已经关机休息,但是我还在默默工作,我安静地趴在你家中的某个地方,7*24小时不眠不休,任劳任怨,目的只有一个,能让你舒服地躺在床上,畅快地刷手机!没错,这就是我,...
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试一个ArrayList我都能跟面试官扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
2020年刚刚开始,就意味着离职潮高峰的到来,我身边就有不少人拿着年终奖离职了,而最让我感到意外的,是一位工作十年的数据分析师也离职了,不同于别人的主动辞职,他是被公司炒掉的。 很多人都说数据分析是个好饭碗,工作不累薪资高、入门简单又好学。然而今年34的他,却真正尝到了中年危机的滋味,平时也有不少人都会私信问我: 数据分析师也有中年危机吗?跟程序员一样是吃青春饭的吗?该怎么保证自己不被公司淘汰...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
立即提问