带头结点的双循环链表程序 /* author:star Data:2011.04.02 双循环链表程序 */ #include<stdio.h> #include<iostream> #include<malloc.h> using namespace std; #define ERROR 0 #define OK 1 typedef int ElemType; typedef int Status; typedef struct DulNode { ElemType data; struct DulNode *prior; struct DulNode *next; }DulNode,*DulLinkList; /*Status InitList_Dul( DulLinkList &L )//因为在CreatList_Dul中有一段初始化的程序,这个函数就没用了,但是还是学习一下吧 { L = ( DulLinkList ) malloc ( sizeof( DulNode ) ); if( !L ) return ERROR; L ->prior = L; L ->next = L; return OK; }*/ DulLinkList GetElem( DulLinkList L, int i ) { DulLinkList p; int j = 1; p = L ->next; while( ( p != L ) && j < i ) { p = p ->next; j++; } if( p && j == i ) return p; else return NULL; } Status ListInsert_Dul( DulLinkList &L, int i, ElemType e ) {//在带头结点的双循环链表L中第i个位置之前插入e //i的合法值为1<=i <=表长+1 DulNode *p,*s; if( !( p = GetElem( L , i ) ) )//在L中确定插入位置 return ERROR; //p=NULL 插入位置不合法 if( ! ( s = ( DulLinkList ) malloc ( sizeof( DulNode ) ) ) ) return ERROR; s ->data = e; s ->prior = p ->prior; p ->prior ->next = s; s ->next = p; p ->prior = s; cout << "插入函数示例/n"<<endl; return OK; } Status ListDelete_Dul( DulLinkList &L, int i, ElemType &e ) {//删除带头结点的双循环链表的第i个元素,i的合法值1<=i<=表长 DulLinkList p; p = ( DulLinkList ) malloc ( sizeof( DulNode ) ); if( !( p = GetElem( L , i ) ) ) return ERROR; e = p ->data; p ->prior ->next = p ->next; p ->next ->prior = p ->prior; free( p ); cout << "删除函数示例/n"; return OK; } Status CreateList_Dul( DulLinkList &L, int n ) {//逆位序输入N个元素的值,建立代表头结点的双循环链表 DulLinkList p; if( ! ( L = ( DulLinkList ) malloc ( sizeof( DulNode ) ) ) ) return ERROR; L ->next = L; L ->prior = L;//先建立一个带头结点的双循环链表 for( int i = n; i > 0; i-- ) { p = ( DulLinkList ) malloc ( sizeof( DulNode ) ); cin >> p ->data; p ->next = L ->next;//这个函数的重点在于这四个语句,需要很读懂。 L ->next ->prior = p; L ->next = p; p ->prior = L; } return OK; } void show( DulLinkList L ) { DulLinkList p = L ->next; while( p != L ) { cout << p ->data << " "; p = p ->next; } cout << "/n"; } int main() { DulLinkList head; int i = 0; ElemType num = 0;//删除的数据 i = CreateList_Dul( head, 5 ); if( i == 0 ) cout << "ERROR"; else { cout << "链表为:" ; show( head ); } i = ListInsert_Dul( head, 1, 1000 ); if( i == 0 ) cout << "Insert ERROR/n"; else { cout << "链表为:"; show( head ); } i = ListDelete_Dul( head, 2, num ); if( i == 0 ) cout << "Delete ERROR/n"; else { cout << "链表为:"; show( head ); } system( "pause"); return 0; } vs2008下测试通过