这是一个关于 数据结构链表结点指针赋值问题

#include<iostream>
#include<conio.h>
#include<string.h>
#define OK 1
#define MAXSIZE 100
#define ERROR -1
using namespace std;
typedef  int Status;
#define OK 1
typedef  struct  
{
char name[5];
float price;    
}Book;
typedef  Book ElemType;
typedef  struct  LNode 
{
Book data;
LNode *next;

}LNode,*List;

Status InitList(List &L)
{
  L=new LNode();
  /*if(!B)
      exit(-1);
  else
  */
    L->next=NULL;
  return OK;
}
Status GetElem(int i,List L,ElemType &e)
{

List P=L->next; int j=1;
while(P&&j<1)
{


P=P->next;
++j;
}
if(!P||j<i)
return ERROR;
e=P->data;

return OK;
}
Status QianCha(List Head,List L,List  shou)
{
if(Head->next=NULL)
{
    Head->next=L;
    L->next=shou;

}
else
{
   Head->next=L->next;
   L->next=NULL;
}   
   return 0;
}
void Q(List &L,int n)
{
L=new LNode();
L->next=NULL;
for(int i=0;i<n;i++)
{
LNode  *p=new LNode();
cin>>(p->data.price);
p->next=L->next;
L->next=p;
}

}

int main()
{

Book e;
/*
注释代码不用看!
LNode *tou=NULL;

List LL=NULL;
List MM=NULL;
InitList(tou);
List BBB=NULL;
InitList(BBB);
InitList(LL);
InitList(MM);
QianCha(tou,BBB,LL);
QianCha(tou,,BBB);
GetElem(1,tou,e);
*/
List haha;
Q(haha,4);

cout<<e.price;
getch();


return 0;
}

这是我写的代码,想测试 用前插法生成单链表,在单步调试过程中,
出现这个界面

图片说明

生成了结点L空间,给L的属性next指针赋值,调试工具中不能看到NULL(即000000地址)为什么呢?

c++

1个回答

因为L->next是NULL,你自己摄制的,所以没有办法显示,这个很正常啊。

你可以试试vs2010的环境,看着更清楚
图片说明

代码我给完善了下:

// Q1049361.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include<iostream>
#include<conio.h>
#include<string.h>
#define OK 1
#define MAXSIZE 100
#define ERROR -1
using namespace std;
typedef  int Status;
#define OK 1
typedef  struct  
{
char name[5];
float price;    
}Book;
typedef  Book ElemType;
typedef  struct  LNode 
{
Book data;
LNode *next;

}LNode,*List;

Status InitList(List &L)
{
  L=new LNode();
  /*if(!B)
      exit(-1);
  else
  */
    L->next=NULL;
  return OK;
}
Status GetElem(int i,List L,ElemType &e)
{

List P=L->next; int j=1;
while(P&&j<1)
{


P=P->next;
++j;
}
if(!P||j<i)
return ERROR;
e=P->data;

return OK;
}
Status QianCha(List Head,List L,List  shou)
{
if(Head->next=NULL)
{
    Head->next=L;
    L->next=shou;

}
else
{
   Head->next=L->next;
   L->next=NULL;
}   
   return 0;
}
void Q(List &L,int n)
{
L=new LNode();
L->next=NULL;
for(int i=0;i<n;i++)
{
LNode  *p=new LNode();
cout << "name?";
cin>>(p->data.name);
cout << "price?";
cin>>(p->data.price);
cout << endl;
p->next=L->next;
L->next=p;
}

}

int main()
{

Book e;
/*
注释代码不用看!
LNode *tou=NULL;

List LL=NULL;
List MM=NULL;
InitList(tou);
List BBB=NULL;
InitList(BBB);
InitList(LL);
InitList(MM);
QianCha(tou,BBB,LL);
QianCha(tou,,BBB);
GetElem(1,tou,e);
*/
List haha;
Q(haha,4);
haha = haha->next;
while (haha)
{
    e = haha->data;
    cout<<e.name << "," << e.price<<endl;
    haha = haha->next;
}
getch();


return 0;
}

name?a
price?1

name?b
price?2

name?c
price?3

name?d
price?4

d,4
c,3
b,2
a,1

qq_43412960
qq_43412960 爱你
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
这是一个关于数据结构的链表指针赋地址值问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; LNode *A; Status InitList(LNode *L) { L=new LNode; if(!L) exit(-1); else (*L).next=NULL; return OK; } int main() { LNode *L; InitList(L); cout<<(*L).next; //下面三行是测试代码,同样给指针赋值为NULL,测试结果,当屏蔽上面代 //码的时候发现,可以出现值。不屏蔽的话,则溢出,执行cout<<(*L).next溢出 int *a; a=NULL; cout<<a; getch(); return 0; } ``` 给链表结点初始化,给next指针赋值为NULL,并输出next指针地址,运行后程序溢出。 我为了探究原因,设计了指针A给A指针赋值NULL,单处运行测试语句, 程序并没有溢出,并且显示出了一个值。 为什么呢,都是赋值NULL,都是输出指针,区别为啥这么大?
这是数据结构一个简单的链表问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; int main() { LNode *L=new LNode(); LNode *LL; *L.next=LL; getch(); return 0; } ``` 我想弄个含两个结点的单链表,*L是第一个,*LL是第二个,但是在写地址相连代码的时候(即*L.next=LL;),报了这个错误 ![图片说明](https://img-ask.csdn.net/upload/201912/20/1576854200_271660.png) 我感觉很奇怪,定义的指针L也开辟空间了,然后选取了地址next属性,完成对另一个指针的赋值,代码应该没毛病啊。求教
C++ PAT数据结构基础02-1题 反转单链表
题目大意:反转单链表,给定常数K和单链表L,要求按每K个节点反转单链表,如:L: 1->2->3->4->5->6 K=3,输出:3->2->1->6->5->4,如果K=4,输出:4->3->2->1->5->6. 输入说明:每次输入一个案例,对每个案例,第一行内容是链表第一个节点的地址,节点数N(N<=100,000)(不一定是最终形成的单链表的节点数),常数K(<=N),K是需要反转的子链表的长度,节点的地址是一个5位的非负整数,NULL用-1来代替。 下面输入N行 格式如下: Address Data Next Address代表节点的位置,Data是整型数字,Next是下一个节点的位置。 输出说明:输出反转后的单链表,每个节点占一行,格式和输入的一样。 样例输入: 00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218 样例输出: 00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1 我的代码如下: /* PAT数据结构基础习题02-1题 */ #include<iostream> using namespace std; const int Maxn=100001; typedef struct{ int addr; int value; int nextaddr; }Node; //结构数组元素,存储三个元素 typedef struct tagnode{ Node *n; struct tagnode *nextp; }LNode; //链表节点,用于存储下一节点地址,和数组元素地址 int main() { Node nodes[Maxn]; //建立数组来存储输入的信息,排列顺序根据输入的顺序值 int firaddr,num,k; cin>>firaddr>>num>>k; nodes[0].value=num; nodes[0].addr=nodes[0].nextaddr=0; //数组大小为100001,存储从1开始,因而0节点随意赋值 int i,j; Node pnode; for(i=0;i<num;i++) //将输入内容存储到数组中 { cin>>pnode.addr>>pnode.value>>pnode.nextaddr; nodes[pnode.value]=pnode; } // for(i=1;i<=num;i++) // { // cout<<nodes[i].addr<<" "; // cout<<nodes[i].value<<" "; // cout<<nodes[i].nextaddr<<endl; // } LNode *head,*pt; //建立LNode的链表 head->n=&nodes[0]; head->nextp=NULL; //头结点的初始化 pt=head; for(i=0;i<num/k;i++) //根据反转要求,链表节点链到正确数组元素 { for(j=k;j>0;j--) { LNode *pp=new LNode; pp->n=&nodes[i*k+j]; pt->nextp=pp; pt=pt->nextp; delete pp; } } if(i*k<num) //剩下的未达到反转要求的,按顺序链到链表结尾 { for(j=1;i*k+j<=num;j++) { LNode *pp=new LNode; pp->n=&nodes[i*k+j]; pt->nextp=pp; pt=pt->nextp; delete pp; } } pt->nextp=NULL; //将链表结尾节点下一地址置为空 pt=head->nextp; //pt指针移动到头指针的下一节点,开始循环输出 while(pt!=NULL) { cout<<pt->n->addr<<" "<<pt->n->value<<" "<<pt->n->nextaddr<<endl; pt=pt->nextp; } return 0; } 求大神指导啊!!!
关于链表打印问题,链表头与表头指针所指向的节点。
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; } 我链表头也记录数据了,它应该从第二个接点开始打印才对,为什么从链表头开始打印了?
链表问题,这一句为什么是二级指针
#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); 实现的初始化操作没什么区别把 为什么要用二级指针呢, 统一成一级指针不好吗?
请问为什么数据域为2的结点最后输出的是指针?
#include<stdio.h> #include<stdlib.h> typedef int DataType; //定义单链表的数据类型为整型 struct Node { DataType data; //数据域 struct Node* next; //指针域 }; typedef struct Node *PNode; //定义指向结构体的PNode类型 typedef struct Node *LinkList; //定义链表类型 LinkList CreateList_Tail_loop( )// 尾插法建立单循环链表 { LinkList head=(LinkList)malloc(sizeof(struct Node)); PNode cur=NULL; PNode tail=head; DataType data; scanf("%d",&data); while(data != -1) { //分配空间,赋值 cur=(struct Node*)malloc(sizeof(struct Node)); cur->data=data; tail->next=cur; tail = cur; scanf("%d",&data); } tail->next=head; return tail; } void print(LinkList tail) //输出单链表 { PNode head=tail->next; PNode p=head->next; while(p!=head) { printf("%d\n", p->data); p=p->next; } } void DestoryList_Link(LinkList tail)//释放单链表 { PNode pre = tail; PNode p = tail->next; while (p!=tail) { free(p); p = p->next; } free(tail); } void Move_Odd_Even(LinkList tail) { PNode head=tail->next; PNode p,q,m; PNode pre; p=head->next; pre=head; while(p->data%2!=0) { pre=p; p=p->next; } m=p; q=p; p=p->next; pre->next=q->next; tail->next=q; q->next=head; tail=q; while(p!=m) { if(p->data%2==0) { q=p; p=p->next; pre->next=q->next; tail->next=q; q->next=head; tail=q; continue; } pre=p; p=p->next; } } int main() { LinkList tail=NULL; tail=CreateList_Tail_loop(); Move_Odd_Even(tail); print(tail); DestoryList_Link(tail); return 0; }
初学者提问:链表相关问题
``` #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)
很简单的一个关于单链表的问题
新手,遇到指针方面的问题, 按我观察的,在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; } ```
麻烦大家帮我看看在这个单链表的程序哪儿有问题嘛
#include <iostream> #include <fstream> #include <string> using namespace std; typedef struct { unsigned long int ID; //课程代码 string lesson; //课程名字 double credit; //学分 int term; //开课学期 }Lessons,*pLessons; typedef struct node //一个结点的数据类型 { Lessons data; node *next; }NODE,*pNODE; pNODE LinkList_Init() //创建一个空链表 { NODE *p; p=new NODE; if(p==NULL) { cout<<"内存不足!"; exit(0); } p->next=NULL; return p; } int LinkList_Length(pNODE head) { int Count=0; //计数器:存放表长 pNODE p=head->next; while(p!=NULL) { Count++; p=p->next; } return Count; } pNODE makeList(int n,ifstream &in) //尾插法生成链表(带头结点) { pNODE head=LinkList_Init(); //生成空表 pNODE tail=head; //尾插法 pNODE node; //一个结点(数据域+指针域) Lessons data; //一个结点的数据(一条记录) for(int i=0;i<n;i++) //记录结点循环 { in>>data.ID; in>>data.lesson; in>>data.credit; in>>data.term; //----------尾插法生成链表-------------- node=new NODE; node->data=data; //结点赋值 tail->next=node; //连入链表 tail=node; //尾结点移位 } tail->next=NULL; return head; } int LinkList_Print(pNODE head) //显示结点数据 { pNODE p=head->next; while(p!=NULL) { cout<<p->data.ID<<endl; cout<<p->data.lesson<<endl; cout<<p->data.credit<<endl; cout<<p->data.term<<endl; p=p->next; } return 0; } pNODE List_Locate(pNODE head,string lesson) { //按课程名称查找 pNODE p=head->next; while(p!=NULL&&p->data.lesson!=lesson) p=p->next; if(p==NULL) return NULL; //没找到 return p; //返回该结点指针 } pNODE List_Prior(pNODE head,string lesson) //查找前一个结点 { pNODE p=head; while(p->next!=NULL&&p->next->data.lesson!=lesson) p=p->next; //p为前一个结点 if(p->next==NULL) return NULL; return p; } pNODE link_Insert(pNODE head,pNODE s) { pNODE p=head; while(p->next!=NULL&&s->data.lesson>p->next->data.lesson) p=p->next; s->next=p->next; p->next=s; return head; } pNODE link_Delete(pNODE head,string lesson) //删除某结点 { pNODE p=head,s; while(p->next!=NULL&&p->next->data.lesson!=lesson) p=p->next; if(p->next==NULL) return head; s=p->next; p->next=s->next; delete s; return head; } void LinkList_Free(pNODE head) //删除整个链表 { //每次删除表头 pNODE p; while(head) { p=head; head=head->next; delete p; } } int main() { int RecNum; //文件中的记录数 ifstream infile("大三课程.txt"); //打开文件 char *temp=new char[1024]; infile>>temp; //读不用的信息 infile>>RecNum; infile.getline(temp,1024,'\n'); infile.getline(temp,1024,'\n'); delete[] temp; pNODE head=makeList(RecNum,infile); //创建链表 infile.close(); //关闭文件 int n=LinkList_Length(head); cout<<"结点个数:"<<n<<endl; cout<<"-------查找“数据库系统”课程--------"<<endl; pNODE node=List_Locate(head,"数据库系统"); cout<<node->data.ID<<" "<<node->data.lesson<<endl; cout<<"-------删除“计算机组成原理”---------"<<endl; link_Delete(head,"计算机组成原理"); n=LinkList_Length(head); cout<<"结点个数:"<<n<<endl; cout<<"-------在“JSP开发技术”后插入“数学建模”-------"<<endl; Lessons one={6015039,"数学建模",2,7}; pNODE newNode=new NODE; //新创建一个结点 newNode->data=one; newNode->next=NULL; link_Insert(head,newNode); n=LinkList_Length(head); cout<<"结点个数:"<<n<<endl; LinkList_Free(head); cout<<"表头结点地址:"<<head<<endl; system("pause"); return 0; }
求助,c++对结构体指针里的string成员赋值出现AV错误
#include <iostream> using namespace std; #include<string> enum gender{female,male}; //构造链表结点 typedef struct _Node{ string name; gender sex; struct _Node *next; }Node,*Node_Ptr; //结点生成函数 Node_Ptr init_node(){ Node_Ptr node; node = (Node_Ptr)malloc(sizeof(Node)); node->next = NULL; return node; } int main() { Node_Ptr node; node = init_node(); node->sex = male; node->name = "a"; return 0; } 执行到node->name = "a";时出现AV错误,请问怎么解决,谢谢!
用fscanf和fgets从文件读取数据存储到链表失败是为什么??
我建立了链表结构,然后从文件导入数据,然后输出链表内容,发现输出的内容顺序不对内容也有点地方出错了! (下面是代码) #include <iostream> #include<fstream> #include<stdlib.h> #include<string.h> #include<stdio.h> typedef struct node{ char question[200]; char option_A[50]; char option_B[50]; char option_C[50]; char option_D[50]; char answer[3]; char respond[3]; char analysis[200]; int length; struct node *next; }LNODE,*LinkList; int main(void) { LNODE *L; L=new LNODE; L->next=NULL; L->length=0; LNODE *p; LNODE *q; q=L; int i; FILE *tk; if((tk=fopen("//Users//apple//Documents//Test System//test question.txt","r"))==NULL) { printf("File open error!\n"); exit(0); } while(!feof(tk)) { fgets(q->question,sizeof(LNODE),tk); fgets(q->option_A,sizeof(LNODE),tk); fgets(q->option_B,sizeof(LNODE),tk); fgets(q->option_C,sizeof(LNODE),tk); fgets(q->option_D,sizeof(LNODE),tk); fgets(q->answer,sizeof(LNODE),tk); fgets(q->analysis,sizeof(LNODE),tk); p=new LNODE; p->next=NULL; q->next=p; q=q->next; } if(fclose(tk)) { printf("Can not close the file!\n"); exit(0); } q=L; while(q->next) { printf("%s",q->question); printf("%s",q->option_A); printf("%s",q->option_B); printf("%s",q->option_C); printf("%s",q->option_D); printf("%s",q->answer); printf("%s",q->analysis); q=q->next; } } (这是文档里的内容) 在数据结构中,从逻辑结构上可以把数据结构分成() A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 C 略 与数据元素本身的形式,内容,相对位置,个数无关的是数据的() A.存储结构 B.存储实现 C.逻辑结构 D.运算实现 C 略 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着() A.数据具有同一特点 B.每个数据元素都一样 C.不仅每个数据元素所包含的数据项都一样,而且对应数据项的类型要一致 D.数据元素所包含的数据项的个数要相等 C 只有这样系统才能高效统一的对数据进行管理。 算法的时间复杂度取决于() A.问题的规模 B.待处理的数据的初态 C.计算机的配置 D.A和B D 略 顺序表中第一个元素的储存地址是100,每个元素的长度为2,则第5个元素的地址是() A.100 B.108 C.100 D.120 B 100+(5-1)*2==108 线性表若采用链式存储结构,要求内存中可用存储单元的地址() A.部分是连续的 B.一定是不连续的 C.必须是连续的 D.连续或不连续都可以 D 因为链表有指针跟踪从而连不连续都可以。 用链接方式存储的队列,在进行删除运算时() A.仅修改头指针 B.仅修改尾指针 C.头尾指针都一定要修改 D.头尾指针可能都要修改 D 一般只修改头指针,但是删除的结点若为最后一个时,则要重新对尾指针赋值。 一个递归算法必须包括() A.递归部分 B.终止条件和递归部分 C.迭代部分 D.终止条件和迭代部分 D 略 串是一种特殊的线性表,其特殊性体现在() A.可以顺序储存 B.可以链式储存 C.数据元素是单个字符 D.数据元素可以是多个字符 C 串是一种内容受限的线性表。 把一棵树转化为二叉树后,这棵二叉树的形态是() A.唯一的 B.有多种 C.有多种,但根结点都没有左孩子 D.有多种,但根结点都没有右孩子 A 略。 利用二叉链表存储树,则根结点的右指针() A.指向最左孩子 B.指向最右孩子 C.非空 D.为空 C 右指针指向兄弟结点。 在以下的存储形式中,不是树的存储形式的是() A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法 D.顺序存储表示法 D 常用孩子兄弟表示法转化为二叉树进行储存。 在一个无向图,所有顶点的度数之和等于图的边数的()倍 A.1/2 B.1 C.2 D.4 A 略 折半查找与二叉排序树的时间性能() A.相同 B.完全不同 C.有时不相同 D.数量级都是O(log2n) C 要看初始数据的状态。 堆的形状是一棵() A.二叉排序树 B.满二叉树 C.完全二叉树 D.平衡二叉树 C 略 若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方式建立的初始堆为() A.79,46,56,38,40,84 B.84,79,56,38,40,46 C.84,79,56,46,40,38 D.84,56,79,40,46,38 C 画出图去找矛盾。 快速排序在下列()最易发挥作用 A.被排序的数据中具有多个相同的排序码 B.被排序的数据已经基本有序 C.被排序的数据完全无序 D.被排序的数据中的最大值和最小值相差悬殊 C 完全无序时用快速排序。 (这是输出后的内容,第一行与原文档的根本不同,而且后面也有很多乱的错误的) ![图片说明](https://img-ask.csdn.net/upload/201812/31/1546187214_133620.jpeg) 有哪位大神指导一下小白!!
请问建立链表并赋值,再遍历输出,输出的结果带有一串乱码是为什么呢?
建立链表并赋值后遍历输出,输出的结果带有一串乱码是为什么呢? (刚学链表懵懵懂懂求解答,谢谢~) _代码如下——_ #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)
程序运行后txt文本出现乱
程序运行后文本文件出现乱码,四个warning是相同的问题, 看了很多帖子但都没有相关的详细回答 请问这种情况该如何解决 ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134842_865518.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576134945_774123.png) ![图片说明](https://img-ask.csdn.net/upload/201912/12/1576135365_278865.png) ``` #include<iostream> #include<string.h> #include<iomanip> #include<fstream> #include<stdio.h> #include <stdlib.h> using namespace std; int count=0; class CData //定义数据基类 { public: CData(){}; virtual int Compare(CData &)=0; virtual void Show()=0; virtual ~CData(){}; }; class CNode //定义结点基类 { private: CData *pData; //用于指向数据类的指针 CNode *pNext; //用于指向链表的后向指针 public: void InputData(CData *pdata){pData=pdata;} //输入数据 void ShowNode(){pData->Show();} //打印一个节点的数据 CData *GetData(){return pData;} friend class CList; //定义链表类为基类 }; class CList { CNode *pHead; //链表头结点指针 public: CList(){pHead=0;}; ~CList(){DeleteList();} void AddNode(CNode *pnode); //在首部添加结点 CNode *DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针 CNode *Search(CData &); //查找一个指定的数据,返回该数据所在的结点在链表的指针,未找到返回0 bool IsExist(CData &); void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(){return pHead;} //返回链表首结点 CNode *GetListNextNode(CNode *pnode); //返回链表指定结点的下一个结点 }; CNode *CList::GetListNextNode(CNode *pnode) //返回链表指定结点的下一个结点 { CNode *p1=pnode; return p1->pNext; }; void CList::AddNode(CNode *pnode) //在首部添加结点 { if (pHead==0) //如果是空链表,插入的结点是唯一的结点 { pHead=pnode; pnode->pNext=0; return; } else //否则,插入到链表首部 { pnode->pNext=pHead; pHead=pnode; } }; CNode *CList::DeleteNode(CNode *pnode) //删除一个指定的结点,返回该结点的指针 { CNode *p1,*p2; p1=pHead; //指向首结点 while(p1!=pnode&&p1->pNext!=0) //寻找要删除的结点 { p2=p1; p1=p1->pNext; //结点p2始终在p1的后面 } if (p1==pHead) //如果要删除的是首结点 { pHead=pHead->pNext; //将首结点后移 return pnode; } p2->pNext=p1->pNext; //p1指向被删除的结点,将p2结点与p1后面的结点连接起来 return pnode; } CNode *CList::Search(CData &data) //查找一个指定的数据,返回指针,若未找到返回0 { CNode *p1=pHead; while(p1) //从头结点开始查找 { if (p1->pData->Compare(data)==0) return p1; //找到后返回结点指针 p1=p1->pNext; } return 0; //搜索完找不到,返回空指针0 } void CList::ShowList() //打印整个链表 { CNode *p1=pHead; while(p1) { p1->pData->Show(); p1=p1->pNext; } } void CList::DeleteList() //删除整个链表结点 { CNode *p1,*p2; p1=pHead; while(p1) { delete p1->pData; p2=p1; p1=p1->pNext; delete p2; } } class Repository:public CData //库存为记录,为数据基类的公有派生类 { private : char szName[20]; //库存中数据:商品名、商品数量和入库价格 unsigned int szNumber; char szPrice[20]; char szN; CList ShList; public: Repository(); //构造函数 Repository(char *name,int number,char *price); void SetRecord(char *name, int number,char *price); //输入数据函数 int Compare(CData &); //比较函数,比较商品名 void Show(); void AddRecord(); void Display(); void LookUpRecord(); void DeleteRecord(); void ModifyRecord(); void SaveToFile(); void Operate(string &strChoice); void ReadFromFile(); void Output(); }; Repository::Repository() { strcpy(szName,"\0"); szNumber=0; strcpy(szPrice,"\0"); } Repository::Repository(char *name,int number,char *price) { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } void Repository::SetRecord(char *name, int number,char *price) //输入数据函数 { strcpy(szName,name); szNumber=number; strcpy(szPrice,price); szN=name[0]; } int Repository::Compare(CData &data) //比较商品名 { Repository &temp=(Repository &)data; return strcmp(szName,temp.szName); } void Repository::Show() //打印一个结点的数据 { cout<<setw(15)<<szName<<setw(15)<<szNumber<<setw(15)<<szPrice<<endl; } void Repository::AddRecord() //将记录添加到链表中 { CNode *pNode; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入新商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { cout<<"请输入新商品入库价格: "; cin>>szPrice; cout<<"请输入新商品数量: "; cin>>szNumber; pSh=new Repository; //生成新的数据累对象 pSh->SetRecord(szName,szNumber,szPrice); //数据类对象赋值 pNode=new CNode; //生成新的结点 pNode->InputData(pSh); //结点插入链表 ShList.AddNode(pNode); count++; cout<<"请输入新商品名(输入0退出,并进入系统菜单) "; cin>>szName; } cout<<endl<<endl; } void Repository::Display() //显示全部链表数据 { cout<<"当前操作共有"<<count<<"条新商品的添加纪录。\n\n"; cout<<"目前库存共有商品信息记录是:\n\n"; cout<<setiosflags(ios_base::left)<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl<<endl; ShList.ShowList(); cout<<endl<<endl; system("pause"); system("cls"); } void Repository::LookUpRecord() // 按照商品名查找 { CNode *pLook; char szName[20]; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while (strcmp(szName,"0")) { Repository sh(szName,0,"0"); //生成结点 pLook=ShList.Search(sh); //查找指定结点的数据 if (pLook) { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要查找的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::DeleteRecord() //在链表中删除指定的结点的数据 { CNode *pLook; char szName[20]; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //删除时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"请确定是否删除此商品信息记录(Y/N)【确定删除请输入Y或y,取消删除请输入N或n】:"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { ShList.DeleteNode(pLook); cout<<szName<<"的信息记录删除成功!"<<endl; delete pLook; count--; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录删除失败!"<<endl; } else cout<<"在库存商品信息记录中找不到商品:"<<szName<<"。"<<endl; cout<<"请输入您需要删除的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } cout<<endl<<endl; } void Repository::ModifyRecord() //修改商品记录 { CNode *pLook; Repository *pSh; char szName[20],szPrice[20]; unsigned int szNumber; cout<<"请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); cout<<"-----下面开始修改-----"<<endl<<"请输入修改后的商品名: "; cin>>szName; cout<<"请输入修改后的商品数量:"; cin>>szNumber; cout<<"请输入修改后的商品入库价格: "; cin>>szPrice; cout<<"请确定是否修改此记录(Yes (Y) or No(N)):"; char ok; cin>>ok; if (ok=='Y'||ok=='y') { pSh=new Repository; pSh->SetRecord(szName,szNumber,szPrice); pLook->InputData(pSh); cout<<szName<<"的信息记录修改成功!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"的信息记录修改失败!"<<endl; } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要修改的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::Output() { CNode *pLook; Repository *pSh; char szName[20]; unsigned int szNumber; cout<<"请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; while(strcmp(szName,"0")) { Repository sh(szName,0,"0"); pLook=ShList.Search(sh); if (pLook) //修改时应先查找出结点 { pSh=(Repository *)pLook->GetData(); cout<<"在库存商品信息记录中找到商品:"<<szName<<",内容是:"<<endl; cout<<setw(15)<<"商品名"<<setw(15)<<"商品数量"<<setw(15)<<"入库价格"<<endl; pLook->ShowNode(); if (0==pSh->szNumber) { cout<<"该商品缺货,请及时补充!"<<endl; } else { cout<<"请输入您要取出的商品数量:"; cin>>szNumber; cout<<"请确定是否取出该商品( Yes (Y) or No(N) ):"; char ok; cin>>ok; if(ok=='Y'||ok=='y') { if(pSh->szNumber<=szNumber) { cout<<szName<<"您要求的商品数量大于仓库中的数量,故全部输出"<<pSh->szNumber<<" 个商品"<<endl; pSh->szNumber=0; } else { pSh->szNumber-=szNumber; cout<<szName<<"您已取出 "<<szNumber<<" 个商品"<<endl; } cout<<szName<<"成功取出!"<<endl; } else if(ok=='N'||ok=='n') cout<<szName<<"您取消了该操作"<<endl; } } else cout<<" 在库存商品信息记录中找不到"<<szName<<","<<endl; cout<<" 请输入您需要出库的商品名(输入0退出,并进入系统菜单):"; cin>>szName; } } void Repository::SaveToFile() //将链表中的数据保存在文件中 { ofstream outfile("repository.txt",ios::binary); if(! outfile) { cout<<"数据文件打开错误,没有将数据存入文件!\n"; return; } CNode *pnode; Repository *pSh; string strName,strNumber; pnode=ShList.GetListHead(); //取出链表首结点指针 while(pnode) { pSh=(Repository *)pnode->GetData(); //返回结点指向的数据域指针 outfile.write((char *)pSh,sizeof(Repository)); //将数据域写入文件 pnode=ShList.GetListNextNode(pnode); // 取下一结点的指针 } outfile.close(); } void Repository::ReadFromFile() //在程序开始先查找有无数据文件,找到后读取文件数据 { ifstream infile("repository.txt",ios::binary); if(! infile) { cout<<"没有数据文件,请您先添加!\n\n"; return; } CNode *pNode; Repository *pSh; while(! infile.eof()) { pSh=new Repository; //定义数据域对象 infile.read((char *)pSh,sizeof(Repository)); pNode=new CNode; pNode->InputData(pSh); //数据域对象内容生成结点 ShList.AddNode(pNode); //将结点加入链表 } ShList.DeleteNode(pNode); //由于文件多读一次,所以将首结点删除 infile.close(); } void Repository::Operate(string &strChoice) //根据主菜单选项进行操作 { if (strChoice=="1") AddRecord(); else if (strChoice=="2") Display(); else if (strChoice=="3") LookUpRecord(); else if (strChoice=="4") DeleteRecord(); else if(strChoice=="5") ModifyRecord(); else if(strChoice=="6") Output(); else if (strChoice=="0") SaveToFile(); else cout<<"对不起,您的输入有误,请重新输入您的选择: "; } int main() { Repository repository; cout<<"*******************************************************************\n\n"; cout<<" 欢迎进入库存管理系统 \n\n"; cout<<"*******************************************************************\n\n"; repository.ReadFromFile(); //从文件中输入数据 string strChoice; //接受主菜单选项 do { cout<<"【欢迎进入系统菜单】:\n\n\n"; cout<<" <1>.添加新商品信息记录\n\n"; cout<<" <2>.显示库存中商品信息记录内容\n\n"; cout<<" <3>.根据商品名查询库存中商品信息记录\n\n"; cout<<" <4>.根据商品名删除库存中商品信息记录\n\n"; cout<<" <5>.根据商品名修改库存中商品信息记录\n\n"; cout<<" <6>.商品出库\n\n"; cout<<" <0>.退出系统\n\n\n"; cout<<"【请输入您的选择】:"; cin>>strChoice; system("cls"); repository.Operate(strChoice); }while(strChoice!="0"); cout<<"***********************************************************************\n\n"; cout<<" ------------******欢迎再次使用库存管理系统******---------- \n\n"; cout<<"***********************************************************************\n\n"; system("pause"); } ```
用单链表实现集合的交、并、差运算
三段式c++ 主函数里, 1.如何调用指针函数(下方蓝色字体函数如何调用)。 2.函数中的参数(指针类型的对象,应该如何传入)。 3.如何让指针对象初始化(指向单链表的表头) “LinlList.h” #define SLIST template <class T> struct Node{ T data; struct Node<T> *next; }; template <class T> class LinkList { public: LinkList(); LinkList(T a[],int n); //尾插 LinkList(int n,T a[]); ~LinkList(); int GetLength(); T Get(int i); void Set(int i,T x); int Locate(T x); void Insert (int i,int j,T a[]); T Delete(int i); void PrintLinkList(); Node<T> *GetFirst(); Node<T> *Union(LinkList<T> *la,LinkList<T> *lb); Node<T> *Intersection(LinkList<T> *la,LinkList<T> *lb); Node<T> *Difference(LinkList<T> *la,LinkList<T> *lb); Node<T> *Judge(LinkList<T> *la,LinkList<T> *lb); private: T data; Node<T> *first; }; “LinkList.cpp” #include "LinkList.h" #include<stdio.h> #include<iostream> using namespace std; template<class T> LinkList<T>::LinkList() { first=new Node<T>; first->next=NULL; } template<class T> LinkList<T>::LinkList(T a[],int n) { first=new Node<T>;Node<T> *s; first->next=NULL; for (int i=0;i<n;i++) { s=new Node<T>; s->data=a[i]; s->next=first->next;first->next=s; } } template<class T> LinkList<T>::LinkList(int n,T a[]) { first=new Node<T>;first->next=NULL; Node<T> *r=first,*s; for(int i=0;i<n;i++) { s=new Node<T>;s->data=a[i];r->next=s;r=s; } r->next=NULL; } template<class T> LinkList<T>::~LinkList() { Node<T> *p=first; while (p) { Node<T> *q=p; p=p->next;delete q; } } template<class T> int LinkList<T>::GetLength() { Node<T> *p=first; int j=0; while (p) { p=p->next;j++; } return j; } template<class T> T LinkList<T>::Get(int i) { Node<T> *p=first->next;int j=1; while(p&&j<i){ p=p->next;j++;} if(!p) throw"位置錯誤";else return p->data; } template<class T> void LinkList<T>::Set(int i,T x) //把i位置的元素用X替代 { Node<T> *p=first->next; int j=1; while (p&&j<i){p=p->next;j++; } if(!p) throw "位置error"; else p->data=x; } /* template<class T> void LinkList<T>::Insert(int i,T x) { Node<T> *p=first;int j=0; while (p&&i-1) { p=p->next;j++; } if(!p)throw"位置出錯"; else{ Node<T> *s=new Node<T>; s->data=x;s->next=p->next;p->next=s; } }*/ template<class T> void LinkList<T>::Insert(int i,int j,T a[]) { Node<T> *p=first;int k=0; while (p&&i-1) { p=p->next;k++; } if(!p)throw"位置出錯"; else{ Node<T> *s=new Node<T>; s->data=a[j];s->next=p->next;p->next=s; } } template<class T> T LinkList<T>::Delete(int i) { Node<T> *p; int j; while (p&&j<i-1) {p=p->next;j++;} if(!p||!p->next) throw"位置"; else{Node<T> *q=p->next; T x=q->data;p->next=q->next; delete q; return x; } } template<class T> void LinkList<T>::PrintLinkList() { Node<T> *p=first->next; while (p) { cout<<p->data; p=p->next; } } template<class T> Node<T> *LinkList<T>::GetFirst() { return first; } template<class T> Node<T> *LinkList<T>::Union(LinkList<T> *la,LinkList<T> *lb) //并运算 { Node<T> *pa,*pb,*p,*pc,*atail,*tail; LinkList<T> *lc; pa=(la->GetFirst())->next; pb=(lb->GetFirst())->next; atail=pa; while(atail->next!=NULL) atail=atail->next; //atail指向la单链表的尾结点 tail=atail //tail指向la单链表与lb单链表合并处 lc=la; //对象la赋值给对象lc(la单链表头结点作为lc单链表头结点) while(pb) { while(pb->data!=pa->data && pa!=atail) pa=pa->next; if (pb->data==pa->data) { p=pb;pb=pb->next; delete p; pa=la->GetFirst()->next; } else if(pb->data!=pa->data) { atail->next=pb; atail=atail->next; pb=pb->next; pa=la->GetFirst()->next; } else { p=pb;pb=pb->next; delete p; pa=la->GetFirst()->next; } } atail->next=NULL; lb->GetFirst()->next=NULL; return lc->GetFirst()->next; } template<class T> Node<T> *LinkList<T>::Intersection(LinkList<T> *la,LinkList<T> *lb) //交运算 { return lc->GetFirst()->next; } template<class T> Node<T> *LinkList<T>::Difference(LinkList<T> *la,LinkList<T> *lb) //差运算 { return lc->GetFirst()->next; } template<class T> Node<T> *LinkList<T>::Judge(LinkList<T> *la,LinkList<T> *lb) //子集判定 { return lc->GetFirst()->next; } LinkList-main.cpp #ifndef SLIST #include "LinkList.cpp" #endif #include<iostream> using namespace std; int main() { try{ int r1[]={1,2,3,4,5}; cout<<"\n前插方式新建单链表b!"<<endl; LinkList <int> a(r1,5); cout<<"单链表b的元素为:"; a.PrintLinkList() ; cout<<"\n单链表b的长度为:"<<a.GetLength() <<endl; int r2[]={6,7,8,9,10}; cout<<"\n尾接方式新建单链表c!"<<endl; LinkList <int> b(5,r2); cout<<"单链表c的元素为:"; b.PrintLinkList() ; cout<<"\n单链表c的长度为:"; cout<<b.GetLength()<<endl; LinkList <int> d; LinkList <T> *la; LinkList <T> *lb; d.Union(LinkList<T> *la,LinkList<T> *lb); /*if(c.GetLength()) { cout<<"执行删除第一个元素操作:"<<endl; c.Delete(1); cout<<"已删除成功,单链表c的长度为:"; cout<<c.GetLength() <<endl; } else cout<<"单链表c长度为0"<<endl;*/ // cout<<"单链表c为:"; // c.PrintLinkList() ; } catch(const char *msg) {cout<<msg; } return 0; }
静态链表为什么实现不了数据反转,哪里错了,具体的代码如何实现?
``` //vc6.0实现的C++版 //功能:静态链表实现线性表的基本功能 #include <iostream.h>//读入必须包含的头文件 #include <windows.h>//清屏和颜色设置需要 #include <iomanip.h> enum returninfo{success,fail,overflow,underflow,range_error};//定义返回信息清单 #define NULLP -1//静态链表的空地址模拟 const int MAXSIZE=10;//静态链表的总空间大小 class node { public: int data;//数据域 int next;//指针域 }; /* 定义一个线性表类staticlinklist */ class staticlinklist { private: node dataarray[MAXSIZE];//定义静态链表的数组 int freep,headp;//freep管理空闲空间,headp管理实际线性表空间 int count;//计数器 统计结点个数即线性表的长度 public: staticlinklist();//构造函数 ~staticlinklist();//析构函数 int getnewnode(void);//申请一个新的可用空间 returninfo create(int number);//静态链表的初始化 bool empty(void) const;//判断是否空链 int size(void) const;//求静态链表的长度 void deletenode(int position);//把某个空间地址归还给空闲空间 returninfo traverse(void);//遍历静态链表所有元素 returninfo retrieve(int position,int &item) const;//读取一个结点 returninfo replace(int position,const int &item);//修改一个结点 returninfo insert(int position,const int &item);//插入一个结点 returninfo remove(int position);//删除一个结点 returninfo invertlist(void);//静态链表所有数据反转 void showinfo(void);//显示静态链表相关信息 }; staticlinklist::staticlinklist()//构造函数 { //静态链表初始化,约定开始时地址域为从小到大顺序挂链,最后一个为NULLP(即-1) int i; for(i=0;i<MAXSIZE;i++) dataarray[i].next=i+1; dataarray[MAXSIZE-1].next=-1; freep=0;//设置空闲区的指针 count=0;//计数器清零,表明开始时没有实际数据 headp=NULLP; } staticlinklist::~staticlinklist()//析构函数 { } staticlinklist::getnewnode(void) { int tempaddress;//定义一个临时地址指针 tempaddress=freep;//保存目前可用空间的第一个地址 freep=dataarray[freep].next;//可用空间头指针后移 return tempaddress; } returninfo staticlinklist::create(int number)//静态链表的初始化 { int tempaddress,tempp; cout<<"请依次输入数据(用空格隔开):"; for(int i=1;i<=number;i++) { tempaddress=getnewnode(); cin>>dataarray[tempaddress].data; dataarray[tempaddress].next=NULLP; count++; if(i==1)//挂第一个结点 { headp=tempaddress; tempp=headp; } else//挂其他结点 { dataarray[tempp].next=tempaddress; tempp=tempaddress; } } return success; } bool staticlinklist::empty(void) const//判断是否空链 { if(headp==NULLP) return true; else return false; } int staticlinklist::size(void) const//求静态链表的长度 { return count; } void staticlinklist::deletenode(int position) { dataarray[position].next=freep; freep=position; } returninfo staticlinklist::traverse(void)//遍历静态链表中的所有元素 { int searchp;//启用搜索指针 if(empty()) return underflow;//空表的处理 searchp=headp; cout<<"静态链表中的全部数据为:Headp->";//提示显示数据开始 while(searchp!=NULLP)//循环显示所有数据 { cout<<"["<<dataarray[searchp].data; if(dataarray[searchp].next==NULLP) cout<<"|^]"; else cout<<"|-]->"; searchp=dataarray[searchp].next; } cout<<endl;//最后有一个回车的控制 return success;//本次操作成功 } returninfo staticlinklist::retrieve(int position,int &item) const//读取一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) item=dataarray[searchp].data;//返回读取的数据 return success;//本次操作成功 } returninfo staticlinklist::replace(int position,const int &item)//修改一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp;//定义搜索指针,初始化 for(int i=1;i<position&&searchp!=NULLP;i++)//提示:注意小于号 searchp=dataarray[searchp].next;//顺序访问方式,用循环,算法复杂度是O(n) dataarray[searchp].data=item;//实际修改数据的语句 return success;//本次操作成功 } returninfo staticlinklist::insert(int position,const int &item)//插入一个结点 { if(position<=0||position>=count+2) //处理意外,范围不正确 return range_error; int newnodep,searchp=headp,followp=NULLP; newnodep=getnewnode();//此处需要申请新的一个可用空间,地址赋给newnodep if(newnodep==NULLP) return overflow; dataarray[newnodep].data=item;//给数据赋值 if(position==1) { dataarray[newnodep].next=headp; headp=newnodep; count++; return success; } for(int i=1;i<position&&searchp!=NULLP;i++)//以下为查找插入位置 { followp=searchp; searchp=dataarray[searchp].next; } //以下开始修改链表,完成插入数据 dataarray[newnodep].next=dataarray[followp].next;//注意此处的次序相关性 dataarray[followp].next=newnodep; count++;//计数器加1 return success; } returninfo staticlinklist::remove(int position)//删除一个结点 { if(empty())//处理意外,空表 return underflow; if(position<=0||position>=count+1) //处理意外,范围不正确 return range_error; int searchp=headp,followp=NULLP;//这里两个指针的初始值设计一前一后 if(position==1) { searchp=headp; headp=dataarray[headp].next; deletenode(searchp);//释放该结点空间 count--;//计数器减1 return success; } for(int i=1;i<position&&searchp!=NULLP;i++) { followp=searchp; searchp=dataarray[searchp].next; } dataarray[followp].next=dataarray[searchp].next;//删除结点的实际语句 deletenode(searchp);//释放该结点 count--;//计数器减1 return success; } returninfo staticlinklist::invertlist(void)//静态链表所有数据反转 { int nowp,midp,lastp;//启用多个辅助指针 if(empty()) return underflow; nowp=dataarray[headp].next; midp=NULLP; while(nowp!=NULLP) { lastp=midp; midp=nowp; nowp=dataarray[nowp].next; dataarray[midp].next=lastp; } dataarray[headp].next=midp; return success; } void staticlinklist::showinfo(void)//显示静态链表相关信息 { int searchp; cout<<"目前静态链表总空间:"<<setw(3)<<MAXSIZE<<"地址为(0--"<<MAXSIZE-1<<")"<<endl; cout<<"其中自由空间大小为:"<<setw(3)<<MAXSIZE-count<<"编号为:"; searchp=freep; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; cout<<"线性表的已用空间为:"<<setw(3)<<count<<"编号为:"; searchp=headp; while(searchp!=NULLP) { cout<<" "<<searchp; searchp=dataarray[searchp].next; } cout<<endl; } /* 定义一个实现静态链表功能的菜单处理类interfacebase */ class interfacebase { private: staticlinklist listonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 returninfo processmenu(int menuchoice);//菜单函数 }; void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"静态链表基本功能菜单"<<endl; cout<<"=================="<<endl; cout<<"1.输入数据(键盘输入)"<<endl; cout<<"2.显示数据(遍历全部数据)"<<endl; cout<<"3.修改数据(要提供位置和新值)"<<endl; cout<<"4.插入数据(要提供位置和新值)"<<endl; cout<<"5.删除数据(要提供位置)"<<endl; cout<<"6.读取数据(要提供位置)"<<endl; cout<<"7.求表长度"<<endl; cout<<"8.数据反转(全部数据逆序存储)"<<endl; cout<<"9.静态链表相关信息"<<endl; cout<<"0.退出程序"<<endl; cout<<"=================="<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } returninfo interfacebase::processmenu(int menuchoice) { int position,item,returnvalue; switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: cout<<"请问你要输入数据的个数,注意要在"<<MAXSIZE<<"个以内:"; cin>>item; if(item>MAXSIZE) cout<<"对不起,输入数据超限,操作已取消!请按任意键继续..."<<endl; else { returnvalue=listonface.create(item); if(returnvalue==success) cout<<"建立静态链表操作成功!请按任意键继续..."<<endl; } break; case 2: returnvalue=listonface.traverse(); if(returnvalue==underflow) cout<<"静态链表目前为空,没有数据可以显示!请按任意键继续..."<<endl; else cout<<"静态链表遍历操作成功!请按任意键继续..."<<endl; break; case 3: cout<<"请输入要修改数据的位置:"; cin>>position; cout<<"请输入要修改的新数据:"; cin>>item; returnvalue=listonface.replace(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,修改的位置超出了范围!请按任意键继续..."<<endl; else cout<<"修改操作成功!请按任意键继续..."<<endl; break; case 4: cout<<"请输入要插入数据的位置:"; cin>>position; cout<<"请输入要插入的新数据:"; cin>>item; returnvalue=listonface.insert(position,item);//注意这个位置的参数 if(returnvalue==overflow) cout<<"对不起,静态链表溢出,无法插入新数据!请按任意键继续..."<<endl; else if(returnvalue==range_error) cout<<"对不起,插入的位置超出了范围!请按任意键继续..."<<endl; else cout<<"插入操作成功!请按任意键继续..."<<endl; break; case 5: cout<<"请输入要删除数据的位置:"; cin>>position; returnvalue=listonface.remove(position);//注意这个位置的参数 if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,删除的位置超出了范围!请按任意键继续..."<<endl; else cout<<"删除操作成功!请按任意键继续..."<<endl; break; case 6: cout<<"请输入要读取数据的位置:"; cin>>position; returnvalue=listonface.retrieve(position,item); if(returnvalue==underflow) cout<<"对不起,静态链表已空!请按任意键继续......"<<endl; else if(returnvalue==range_error) cout<<"对不起,读取的位置超出了范围!请按任意键继续..."<<endl; else cout<<"读取的数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl; break; case 7: cout<<"静态链表目前的长度为:"<<listonface.size()<<endl; cout<<"求静态链表长度操作成功!请按任意键继续..."<<endl; break; case 8: returnvalue=listonface.invertlist(); if(returnvalue==underflow) cout<<"对不起,链表已空!请按任意键继续......"<<endl; else cout<<"链表所有元素反转操作成功!请按任意键继续..."<<endl; break; case 9: listonface.showinfo(); break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } return success; } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; staticlinklist linklistnow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```
c++一元多项式求和问题求大神解答
#include<iostream> using namespace std; typedef int datatype; //结点数据类型,假设为int typedef struct node * pointer;//结点指针类型 struct node { //结点结构 int coef; //系数 int exp; //指数 pointer next; }; typedef pointer lklist;//单链表类型,即头指针类型 lklist initlist() { //建立一个只有头结点的空表 pointer head; head=new node; head->next=NULL; return head; } lklist creat() {//尾插法建表,有头结点 pointer head,rear,s; int c,e,n=0; head=new node; //生成头结点 rear=head; //尾指针初值 cout<<"多项式的元素个数为:"; cin>>n; for(int i=0;i<n;i++){ cout<<"输入系数coef:"; cin>>c; cout<<"输入指数exp:"; cin>>e; cout<<endl; } while(c!=0) /*输入系数为0时,表示多项式的输入结束*/ { s=new node; s->coef=c; /*申请新结点后赋值*/ s->exp=e; /*申请新结点后赋值*/ s->next=NULL; rear->next=s; //尾插法 rear=s; //插入表尾,改尾指针 cout<<"系数coef:"<<c; cout<<"指数exp:"<<e; } //rear->next=NULL; //尾结点的后继为空 return head; } /* int n=0; cout<<"输入初始结点数:"; cin>>n; cout<<"输入结点数值:"<<endl; for(int i=0;i<n;i++){ cin>>ch; s=new node; s->data=ch; //生成新结点 rear->next=s; rear=s; //插入表尾,改尾指针 } rear->next=NULL; //尾结点的后继为空 return head;*/ void display(lklist head){ pointer p; p=head->next; while(p!=head){ //OK cout<<"为什么不出来?"; cout<<p->coef<<"*x"; cout<<"^+"<<p->exp; p=p->next; } cout<<endl; } lklist add(lklist A,lklist B) { //一元多项式相加函数,用于将两个多项式相加 pointer C,p,q,rear; int sum; p=A->next;q=B->next; C->next=NULL; C=A;rear=C; //取A头结点作C头结点 //循环条件时p!=head 即p!=A while(p!=A && q!=B) { if (p->exp==q->exp) //若指数相等时 { sum=p->coef+q->coef; //相应的系数相加 if(sum!=0) //如果相加后的系数不为零 生成新结点;尾插到新链表;按x赋值新结点;A\B当前节点都前进一步 { p->coef=sum; C->next=p; C=C->next; p=p->next; rear=q; q=q->next; delete rear; } } else if(p->exp<q->exp) //若p指向的多项式指数小于q指向的指数 { C->next=p; //将p结点加入到和多项式中 C=C->next; p=p->next; } else //若p指向的多项式指数大于q指向的指数 { C->next=q; C=C->next; q=q->next; } } while(p!=A){ C=p->next; rear=p; p=p->next; } while(q!=B){ C=p->next; rear=p; p=p->next; } C=C->next; return C; } int main() { lklist A,B; A=initlist(); B=initlist(); cout<<"请依次输入第一个多项式的系数和指数:\n"; A=creat(); cout<<"\n"; cout<<"请依次输入第二个多项式的系数和指数:\n"; B=creat(); cout<<"输入的第一个多项式是:\n"; display(A); cout<<"输入的第二个多项式是:\n"; display(B); add(A,B); cout<<"合并后的链表C:\n"; display(A); return 0; } ``` ```![图片说明](https://img-ask.csdn.net/upload/201810/05/1538706375_142352.png) 怎么办啊?为什么出不来结果。求指出哪里错误。我感觉合情合理啊
用fgets或者fscanf从文件输入到链表中的内容错误!!
#include <iostream> #include<fstream> #include<stdlib.h> #include<string.h> #include<stdio.h> typedef struct node{ char question[200]; char option_A[50]; char option_B[50]; char option_C[50]; char option_D[50]; char answer[3]; char respond[3]; char analysis[200]; int length; struct node *next; }LNODE,*LinkList; int main(void) { LNODE *L; L=new LNODE; L->next=NULL; L->length=0; LNODE *p; LNODE *q; q=L; int i; FILE *tk; if((tk=fopen("//Users//apple//Documents//Test System//test question.txt","r"))==NULL) { printf("File open error!\n"); exit(0); } while(!feof(tk)) { fgets(q->question,sizeof(LNODE),tk); fgets(q->option_A,sizeof(LNODE),tk); fgets(q->option_B,sizeof(LNODE),tk); fgets(q->option_C,sizeof(LNODE),tk); fgets(q->option_D,sizeof(LNODE),tk); fgets(q->answer,sizeof(LNODE),tk); fgets(q->analysis,sizeof(LNODE),tk); p=new LNODE; p->next=NULL; q->next=p; q=q->next; } if(fclose(tk)) { printf("Can not close the file!\n"); exit(0); } q=L; while(q->next) { printf("%s",q->question); printf("%s",q->option_A); printf("%s",q->option_B); printf("%s",q->option_C); printf("%s",q->option_D); printf("%s",q->answer); printf("%s",q->analysis); q=q->next; } } ```下面是文档的内容,图片是输出后的内容,第一题的题目变成了略,是为什么?已经崩溃了!求大神救救小白! 在数据结构中,从逻辑结构上可以把数据结构分成() A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 C 略 与数据元素本身的形式,内容,相对位置,个数无关的是数据的() A.存储结构 B.存储实现 C.逻辑结构 D.运算实现 C 略 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着() A.数据具有同一特点 B.每个数据元素都一样 C.不仅每个数据元素所包含的数据项都一样,而且对应数据项的类型要一致 D.数据元素所包含的数据项的个数要相等 C 只有这样系统才能高效统一的对数据进行管理。 算法的时间复杂度取决于() A.问题的规模 B.待处理的数据的初态 C.计算机的配置 D.A和B D 略 顺序表中第一个元素的储存地址是100,每个元素的长度为2,则第5个元素的地址是() A.100 B.108 C.100 D.120 B 100+(5-1)*2==108 线性表若采用链式存储结构,要求内存中可用存储单元的地址() A.部分是连续的 B.一定是不连续的 C.必须是连续的 D.连续或不连续都可以 D 因为链表有指针跟踪从而连不连续都可以。 用链接方式存储的队列,在进行删除运算时() A.仅修改头指针 B.仅修改尾指针 C.头尾指针都一定要修改 D.头尾指针可能都要修改 D 一般只修改头指针,但是删除的结点若为最后一个时,则要重新对尾指针赋值。 一个递归算法必须包括() A.递归部分 B.终止条件和递归部分 C.迭代部分 D.终止条件和迭代部分 D 略 串是一种特殊的线性表,其特殊性体现在() A.可以顺序储存 B.可以链式储存 C.数据元素是单个字符 D.数据元素可以是多个字符 C 串是一种内容受限的线性表。 把一棵树转化为二叉树后,这棵二叉树的形态是() A.唯一的 B.有多种 C.有多种,但根结点都没有左孩子 D.有多种,但根结点都没有右孩子 A 略。 利用二叉链表存储树,则根结点的右指针() A.指向最左孩子 B.指向最右孩子 C.非空 D.为空 C 右指针指向兄弟结点。 在以下的存储形式中,不是树的存储形式的是() A.双亲表示法 B.孩子链表表示法 C.孩子兄弟表示法 D.顺序存储表示法 D 常用孩子兄弟表示法转化为二叉树进行储存。 在一个无向图,所有顶点的度数之和等于图的边数的()倍 A.1/2 B.1 C.2 D.4 A 略 折半查找与二叉排序树的时间性能() A.相同 B.完全不同 C.有时不相同 D.数量级都是O(log2n) C 要看初始数据的状态。 堆的形状是一棵() A.二叉排序树 B.满二叉树 C.完全二叉树 D.平衡二叉树 C 略 若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方式建立的初始堆为() A.79,46,56,38,40,84 B.84,79,56,38,40,46 C.84,79,56,46,40,38 D.84,56,79,40,46,38 C 画出图去找矛盾。 快速排序在下列()最易发挥作用 A.被排序的数据中具有多个相同的排序码 B.被排序的数据已经基本有序 C.被排序的数据完全无序 D.被排序的数据中的最大值和最小值相差悬殊 C 完全无序时用快速排序。 ```[图片说明](https://img-ask.csdn.net/upload/201812/31/1546186739_926263.jpeg) [图片说明](https://img-ask.csdn.net/upload/201812/31/1546186723_760510.jpeg)
该程序运行时刀输入序号的时候输入不进去为什么?有大神知道吗
#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; }
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
阿里P8数据架构师:顶级开发者都在用什么数据库?
其实从去年已经隐隐约约感觉到数据库的有变化,只是没有想到变得这么快。今年的一些事情实实在在地给了某些数据库重击,如果以前去某数据库还是喊喊,然后该用还用,今年从传统领域刮起的去某数据库的风,已经开始了,并且后面的乌云密布也看得见。 最近看一篇国外的开源产品提供厂商的一篇文字,主要是在询问了他的几百位客户后得出了下图中的2019年数据库的使用趋势。 从图中可以看出,MySQL以38.9...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
互联网公司分布式系统架构演进之路
介绍 分布式和集群的概念经常被搞混,现在一句话让你明白两者的区别。 分布式:一个业务拆分成多个子业务,部署在不同的服务器上 集群:同一个业务,部署在多个服务器上 例如:电商系统可以拆分成商品,订单,用户等子系统。这就是分布式,而为了应对并发,同时部署好几个用户系统,这就是集群 1 单应用架构 2 应用服务器和数据库服务器分离 单机负载越来越来,所以要将应用服务器和数据库服务器分离 3 应用服务...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
程序员需要了解的硬核知识之汇编语言(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。 汇编语言和本地代码 我们在之前的文章中探讨过,计算机 CPU 只能运行本地代码(机器语言)程序,用 C 语言等高级语...
OpenCV-Python 绘图功能 | 七
目标 学习使用OpenCV绘制不同的几何形状 您将学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。 代码 在上述所有功能中,您将看到一些常见的参数,如下所示: img:您要绘制形状的图像 color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Fiddler+夜神模拟器进行APP抓包
Fiddler+夜神模拟器进行APP抓包 作者:霞落满天 需求:对公司APP进行抓包获取详细的接口信息,这是现在开发必备的。 工具:Fiddler抓包,夜神模拟器 模拟手机 安装APP 1.下载Fiddler https://www.telerik.com/download/fiddler Fiddler正是在这里帮助您记录计算机和Internet之间传递的所有HTTP和HTTPS通信...
小白学 Python 爬虫(42):春节去哪里玩(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
一文带你看清 HTTP 所有概念
上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性。我们接着上篇文章没有说完的 HTTP 标头继续来介绍(此篇文章会介绍所有标头的概念,但没有深入底层) HTTP 标头 先来回顾一下 HTTP1.1 标头都有哪几种 HTTP 1.1 的标头主要分为四种,通用标头、实体标头、请求标头、响应标头,现在我们来对这几种标头进行介绍 通用...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
[数据结构与算法] 排序算法之归并排序与基数排序
归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 基本思想 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
史上最牛逼的 Eclipse 快捷键,提高开发效率!
如果你在使用IDEA,请参考博主另外的一篇idea快捷键的博客。
如何快速打好Java基础?
二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题。我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多个年头了,真的是从一名编程白痴一步步走到现在的。 我在各大技术网站上分享了不少 Java 方面的原创文章,不知道影响了多少初学者,反正文章的留言中经常能看到他们由衷的感谢。现在每天仍然有不少同学(...
相关热词 c#判断数字不得为负数 c#帧和帧协议 c#算偏移值 c# 在枚举中 c#6 字符串 插值 c#程序中的占位符标签 c#监听数组变化 c# vlc c#索引实现 c# 局域网广播通信
立即提问