啊哈算法-模拟链表
通过数组来模拟链表
//如果要存负数就要再开一个模拟链表存,输出的时候从负数的模拟链表头开始输出然后再从正数的模拟链表开始输出就行。 #include<stdio.h> #include<string.h> int main(){ int a[100],next[100],prior[100],n,tem,top=0,head=0; memset(a,-1,sizeof(a)); memset(next,-1,sizeof(next)); memset(prior,-1,sizeof(prior)); scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&tem); if(a[head]==-1){ a[head]=tem;//初始化链表头 } else{ int cp=a[head],cur=head;//从链表头开始遍历 while(tem>cp && next[cur]!=-1){ cp=a[next[cur]];//比较值更换为链表下一节点值 cur=next[cur]; //节点编号更换为下一节点编号 } a[++top]=tem;//新节点赋值 if(cur==head){//插入第二个节点(作为头或者第二节点 if(tem>=cp){//插入值大于头节点值 next[top]=next[cur]; prior[next[cur]]=top; next[cur]=top; prior[top]=cur; } else{//插入值小于头节点值 next[top]=cur; prior[cur]=top; head=top;//更换头结点 } } else if(next[cur]==-1){//cur到了尾结点 if(tem>=cp){//插入值大于尾结点值 next[cur]=top;//旧尾结点指向新尾节点 prior[top]=cur;//新节点指向旧尾节点 } else{//插入倒数第二个节点 next[prior[cur]]=top; prior[top]=prior[cur]; next[top]=cur; prior[cur]=top; } } else{//在中间插入 next[prior[cur]]=top; next[top]=cur; } } } tem=head; while(tem!=-1){ printf("%d ",a[tem]); tem=next[tem]; } return 0; }
第一次写,也比较繁杂,不知道还有没有bug。以后有机会也要精简一下。