在单链表当中,从已知节点出发,只能访问该节点的后继节点,却无法访问
该节点之前的节点,在单循环链表当中,虽然可以通过一个节点访问表中所
有节点,但是要找到直接前驱却要遍历整个表,因此为了加快寻找某个节点
的前驱,可以在每个节点的结构体上添加一个直接访问前驱的指针域来快速
定位前驱节点。下面是简单的双链表代码,当然优势还没有体现出来,后面
在慢慢补充
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1typedef struct Dbnode{int data;struct Dbnode * next;struct Dbnode * prior;
} Dbnode, *Dblink;typedef int ElemType;
typedef int Status;
/*********************
初始化
输入:链表指针,初始个数
输出:状态码
功能:初始化带数值的双向链表
*********************/
Status initLink(Dblink * link,int num){srand(time(0));
Dblink L = *link;Dblink tmp,new;L->data = 0;L->prior = NULL;L->next = NULL;tmp = L;int i;for(i=0;i<num;i++){new = (Dblink)malloc(sizeof(Dbnode));new->data = rand()%100 +1;new->next = tmp->next;new->prior = tmp;tmp->next = new;tmp = tmp->next;}tmp->next = *link; //connect the head(*link)->prior = tmp;return OK;
}
/*********************
插入
输入:链表指针,插入位置,插入值
输出:状态码
功能:在指定的位置插入指定的值
*********************/
Status insertLink(Dblink *link,int index,ElemType e){Dblink tmp = (*link)->next; //ignore head nodeDblink new,pre;int i=1;while( tmp!=*link && i<index ){tmp = tmp->next;i++;}if( tmp==*link || i>index){printf("overflow\n");return OVERFLOW;}new = (Dblink)malloc(sizeof(Dbnode));pre = tmp->prior;new->data = e;new->prior=pre;new->next =tmp;pre->next = new;tmp->prior= new;return OK;
}
/*********************
删除
输入:链表指针,删除位置
输出:状态码
功能:在指定位置删除节点
*********************/
Status deleteLink(Dblink *link,int index){Dblink tmp = (*link)->next; //ignore head node int i=1;while( tmp!=*link && i<index ){tmp=tmp->next;i++;}if( tmp==*link || i>index ){printf("overflow\n");return OVERFLOW;}Dblink pre = tmp->prior;Dblink net = tmp->next;pre->next = tmp->next;net->prior = tmp->prior;free(tmp);return OK;
}
/*********************
颠倒
输入:链表指针
输出:状态码
功能:将链表的节点颠倒过来
*********************/
Status convertLink(Dblink * link){Dblink p,q;p = (*link)->next;while( p != *link){q = p->next;p->next = p->prior;p->prior = q;p=q;}q = (*link)->next; //p is *link(*link)->next = p->prior;(*link)->prior = q;return OK;
}
/*********************
打印
输入:链表指针
输出:状态码
功能:将链表的元素一一打印
*********************/
Status printLink(Dblink link){Dblink p = link;while(p->next!=link){p = p->next; //ignore head nodeprintf("[%d] ",p->data);}printf("\n");return OK;
}int main(){int num,index,value;Dblink link = (Dblink)malloc(sizeof(Dbnode));//initationprintf("[create]enter the num:");scanf("%d",&num);initLink(&link,num);printLink(link);//convertprintf("[convert]\n");convertLink(&link);printLink(link);//insertprintf("[insert]enter the index:");scanf("%d",&index);printf("[insert]enter the value:");scanf("%d",&value);insertLink(&link,index,value);printLink(link);//deleteprintf("[delete]enter the index:");scanf("%d",&index);deleteLink(&link,index);printLink(link);return OK;
}