㈠ 链表中每个节点所占用的储存空间是连续的,但节点之间在空间上可以连续也可以不连续 对这句话不是很明白
一个链表有很多个节点,各个节点之间通过指针连接起来,所以各个结点之间的位置可以不连续,也就是可以放在不同的位置,所以在空间上可以是不连续的;但对于一个节点,因为节点内部是一个整体,所以就要占用连续的存储空间。
队列是先进先出的栈是先进后出的都是线性表线性表是最基础、最常用的数据结构,线性表中数据元素都是一对一的对应关系。可以不连续,它的存储空间分两段,一段存放数据,另一段存放着地址,链表是通过地址将数据串联起来的数组必须是连续的存储空间。
(1)对于一段连续的存储空间扩展阅读:
一个链表或者多个链表使用独立的存储空间,一般用数组或者类似结构实现,优点是可以自动获得一个附加数据:唯一的编号,并且方便调试;缺点是不能动态的分配内存。当然,另外的在上面加一层块状链表用来分配内存也是可以的,这样就解决了这个问题。
这种方法有时候被叫做数组模拟链表,但是事实上只是用表示在数组中的位置的下标索引代替了指向内存地址的指针,这种下标索引其实也是逻辑上的指针,整个结构还是链表,并不算是被模拟的(但是可以说成是用数组实现的链表)。
㈡ 怎样申请一段连续的内存空间
malloc(sizeof(Type)*size)
㈢ 数据结构题目
1.假设以数组S[0..m-1]作为循环队列的存储结构,同时设变量front和rear分别指向队头元素的前一个位置和队尾元素位置,则队列中元素个数为(rear-front+m)%m。对于普通队列,如果变量front和rear分别指向队头元素的前一个位置和队尾元素位置,则队列中元素个数为rear-front。考虑到这里是循环队列,所以队列中元素个数为(rear-front+m)%m。2.指出下述程序段的功能是什么?(1)voidDemo1(SeqStack*S){inti;arr[64];n=0;while(StackEmpty(S))arr[n++]=Pop(S);for(i=0,i<n;i++)Push(S,arr[i]);}//Demo1把栈S里的元素逆序。(2)SeqStackS1,S2,tmp;DataTypex;//假设栈tmp和S2已做过初始化while(!StackEmpty(&S1)){x=Pop(&S1);Push(&tmp,x);}while(!StackEmpty(&tmp)){x=Pop(&tmp);Push(&S1,x);Push(&S2,x);}把栈S1中的元素按序(注意不是逆序)添加到栈S2中(3)voidDemo2(SeqStack*S,intm){//设DataType为int型SeqStackT;inti;InitStack(&T);while(!StackEmpty(S))if((i=Pop(S))!=m)Push(&T,i);while(!StackEmpty(&T)){i=Pop(&T);Push(S,i);}}删除栈S中值为m的元素(4)voidDemo3(CirQueue*Q){//设DataType为int型intx;SeqStackS;InitStack(&S);while(!QueueEmpty(Q)){x=DeQueue(Q);Push(&S,x);}while(!StackEmpty(&s)){x=Pop(&S);EnQueue(Q,x);}}//Demo3把Q的元素逆序。(5)CirQueueQ1,Q2;//设DataType为int型intx,i,n=0;//设Q1已有内容,Q2已初始化过while(!QueueEmpty(&Q1)){x=DeQueue(&Q1);EnQueue(&Q2,x);n++;}for(i=0;i<n;i++){x=DeQueue(&Q2);EnQueue(&Q1,x);EnQueue(&Q2,x);}把Q1的元素按序复制到Q2中
㈣ 数据在内存中存储都是用连续的存储空间块来存放
例如A、B、C、D一开始时是连续存放的,当B被删除后,A、C、D就不是连续存放了,因为中间还空出B的位置。
㈤ C语言中数组在内存中占用一段连续的存储空间,它的首地址由什么表示 在线等
数组的首地址就是数组名,比如有数组a[10],则a就是该数组的首地址。