思路: 每个链表数组都指向一个链表的头节点,如果当前链表已经满 为链表数组申请空间为新列。
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ #define clen 2 //当前最大长度 //#typedef llen 2 //当前最大长度 int llen=0;//列总长度 typedef struct no { int data; //初始化 no *pnext; }node; typedef struct { node head; node tail; // 初始化 int size; }lht; void link_init(lht larr[]) { llen++; larr[llen-1].head.pnext=&larr[llen-1].tail; larr[llen-1].tail.pnext=NULL; //构造链表数组 larr[llen-1].size=0; } void link_addlength(lht *p) //增加链表长度 { lht *t=(lht *)malloc(sizeof(lht)+sizeof(node)); //在原有基础上扩展指针范围 t=p; free(p); p==NULL; if(t!=NULL) { llen++; //列标记增加 (t+llen-1)->head.pnext=&(t+llen-1)->tail; (t+llen-1)->tail.pnext=NULL; //初始化新列 (t+llen-1)->size=0; } else link_addlength(p);//这个可能有bug 不过这条代码执行的概率不高 } void link_adddata(lht l[],int i) //增加数据 { node *pk=l[llen-1].head.pnext; if(l[llen-1].size==clen) //当 当前列已经满 { link_addlength(l); link_adddata(l,i); } else { node *pf=NULL,*pn=pf; pf=(node*)&l[llen-1].head; pn=(node*)malloc(sizeof(node)); pn->data=i; l[llen-1].size++; // printf("%d",pn->data); pn->pnext=pf->pnext; pf->pnext=pn; } } void link_sub(lht *p) //删除节点 { node *pn=NULL,*pm=NULL; pn=&(p+llen-1)->head; //因为当前列至少有一个元素 pm=pn->pnext; pn->pnext=pm->pnext; free(pm); pm=NULL; if(pn->pnext==&(p+llen-1)->tail) //如果 当前列已经空 { free((p+llen-1)); //删除这个列的空间 llen--; //列标记减1 } } void link_show(const lht larr[]) { int i=0; node *pn=larr[i].head.pnext; while(i<llen) { pn=larr[i].head.pnext; while(pn!=&larr[i].tail) { printf("%d %d ",i,pn->data); pn=pn->pnext; } printf("\n"); i++; } } int main(int argc, char *argv[]) { lht larr[1]={0}; //cout<<sizeof(larr)<<endl; link_init(larr); //cout<<sizeof(larr)<<endl; link_adddata(larr,5); //cout<<sizeof(larr)<<endl; link_adddata(larr,6); link_adddata(larr,7); link_adddata(larr,8); link_adddata(larr,9); link_adddata(larr,9); link_adddata(larr,9); link_adddata(larr,9); link_show(larr); // cout<<larr[2].head.pnext->data; link_sub(larr); // link_sub(larr); cout<<"*****************"<<endl; link_show(larr); return 0; }