算法导论--10.3-4 多数组表示双向链表(紧凑)

来源:互联网 发布:java中的finally 编辑:程序博客网 时间:2024/05/17 03:12

问题:双向链表的所有m个元素在存储器中保持紧凑,即在多数组表示中占用前m个下标

思路:分配内存: 总是分配相邻的存储位置;

    释放内存:若删除链表中的一个元素,导致存储位置中间空了一个,让数组的最后一个元素补上,并修改其prev和next值

代码:

#include<iostream>#include <iomanip> using namespace std;int n=15, f=-1, head=-1;//n为数组大小,f为目前已存值的下标,head为链表表头void Insert(int *key, int *next, int *prev, int x){if(f==n-1)//检测上溢cout<<"overflow"<<endl;else{++f;key[f]=x;next[f]=head;     //对应x.next=headif(head>=0)       //对应if(head!=NULL)prev[head]=f; //对应head.prev=xhead=f;          //对应head=xprev[f]=-1;       //对应x.prev=NULL}} void Delete(int *key, int *next, int *prev, int x){if(f==-1)//检测上溢{cout<<"underflow"<<endl;return;}int i=0;//找到元素i的位置while(i<=f && key[i]!=x)++i;if(prev[i]!=-1)//删除i位置元素next[prev[i]]=next[i];if(next[i]!=-1)prev[next[i]]=prev[i];//将数组f位置元素补到i位置上key[i]=key[f];//先将f位置上元素复制到i位置prev[i]=prev[f];    prev[i]=next[f];if(prev[f]!=-1)//再修改prev元素的next值和next元素的prev值next[prev[f]]=i;if(next[f]!=-1)prev[next[f]]=i;--f;}void Print(int *key, int *next, int *prev, int m){cout<<setw(8)<<"next:";for(int t=0;t<m;t++)cout<<setw(3)<<setiosflags(ios::right)<<next[t]<<" ";cout<<endl;cout<<setw(8)<<"key:";for(int j=0;j<m;j++)cout<<setw(3)<<setiosflags(ios::right)<<key[j]<<" ";cout<<endl;cout<<setw(8)<<"prev:";for(int k=0;k<m;k++)cout<<setw(3)<<setiosflags(ios::right)<<prev[k]<<" ";cout<<endl;}int main(){int* key=new int[n];int* prev=new int[n];int* next=new int[n];for(int i=0;i<10;i++)Insert(key, next, prev, 2*i+11);Print(key, next, prev, f+1);Delete(key, next, prev, 17);Print(key, next, prev, f+1);delete[] key;delete[] prev;delete[] next;return 0;}


0 0
原创粉丝点击