/******************************************************** 双向链表 实验内容及要求: (1)分别建立包含10个数据元素的链式存储线性表; (2)从键盘输入一个数据元素,插入到线性表中第k(包含0号位置)个位置; (3)从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素; (4)给出程序及插入、删除前和插入、删除后线性表结果。 2010.4.19 *********************************************************/ #include<iostream.h> #include<string.h> #define Student EType //enum { OK ,ERROR }; #define OK 1 #define ERROR 0 //#define int HeadEType typedef struct //定义student结构体 { int numeber; char name[20]; }Student; typedef struct DoubleNode //元素结点 { EType data; DoubleNode *plink; DoubleNode *nlink; }DoubleNode; typedef struct //表头结点 { int Hdata; DoubleNode *first; }DoubleChainList; Creat/ void Creat(DoubleChainList *L) //构造一个空链表,注意 原来写成“DoubleChainList &L”会报错 { L=new DoubleChainList; L->first=NULL; } ///Output// void Output(DoubleChainList *L) //输出双向链表 { DoubleNode *current=L->first; while(current) { cout<<current->data.name<<"("<<current->data.numeber<<")"<<" <--> "; current=current->nlink; } } /Insert/ int Insert(DoubleChainList *L,int k,EType &x) //在链表L中第K个元素之后插入元素x { if(k<0) return ERROR; int index=1; DoubleNode *current=L->first; while(index<k&¤t) { current=current->nlink; index++; } if(k>0&&!current) return ERROR; DoubleNode *q=new DoubleNode; q->data=x; if(k) //X插在current之后 { q->nlink=current->nlink; current->nlink->plink=current; q->plink=current; current->nlink=q; } else //作为第一个元素插入 { q->nlink=L->first; L->first->plink=q; L->first=q; } return OK; } /Delete/// int Delete(DoubleChainList *L,int k) //删除第K个元素结点 { if(k<1||L->first==NULL) return ERROR; DoubleNode *current=L->first; // DoubleNode *current=new DoubleNode; current=L->first; if(k==1) L->first=current->nlink; else { int index=1; while(index<k&¤t) { current=current->nlink; index++; } if(k>0&&!current) return ERROR; current->plink->nlink=current->nlink;//!!!!!!! current->nlink->plink=current->plink;//!!!!!!!! } // delete current; return OK; } Search// DoubleNode * Search(DoubleChainList *L,EType &x) { DoubleNode *current=L->first; while(current&¤t->data.numeber!=x.numeber) { current=current->nlink; } if(current) return current; return NULL; } /Main int main() { DoubleChainList L; Creat(&L); //注意 原来写成creat(L)或者creat(*L)都是不对的 DoubleNode StudentNode[10]; strcpy(StudentNode[0].data.name,"Jack"); StudentNode[0].data.numeber=111; strcpy(StudentNode[1].data.name,"Lily"); StudentNode[1].data.numeber=222; strcpy(StudentNode[2].data.name,"Tom"); StudentNode[2].data.numeber=333; strcpy(StudentNode[3].data.name,"Dick"); StudentNode[3].data.numeber=444; strcpy(StudentNode[4].data.name,"Bob"); StudentNode[4].data.numeber=555; strcpy(StudentNode[5].data.name,"Ann"); StudentNode[5].data.numeber=666; strcpy(StudentNode[6].data.name,"Black"); StudentNode[6].data.numeber=777; strcpy(StudentNode[7].data.name,"White"); StudentNode[7].data.numeber=888; strcpy(StudentNode[8].data.name,"Bingo"); StudentNode[8].data.numeber=999; strcpy(StudentNode[9].data.name,"Octopus"); StudentNode[9].data.numeber=1000; L.first=&StudentNode[0]; StudentNode[0].plink=NULL; StudentNode[0].nlink=&StudentNode[1]; StudentNode[1].plink=&StudentNode[0]; for(int i=1;i<9;i++) //连接链表 { StudentNode[i].nlink=&StudentNode[i+1]; StudentNode[i].plink=&StudentNode[i-1]; //!!!!! } StudentNode[9].nlink=NULL; cout<<"Double Chain is Following!/n"; Output(&L); cout<<endl; //Test of Insert/// cout<<"Insert a New Element x/n"; EType x_insert; int k; cout<<"Please Input Name:/n"; cin>>x_insert.name; cout<<endl; cout<<"Please Input Munber:/n"; cin>>x_insert.numeber; cout<<endl; cout<<"After which ?/n"; cin>>k; Insert(&L,k,x_insert); cout<<"New Double Chain is Following!/n"; Output(&L); cout<<endl; //Test of search EType x_search; cout<<"Search a Element by Number/n"; cin>>x_search.numeber; cout<<"It is--- "<<Search(&L,x_search)->data.name<<"("<<Search(&L,x_search)->data.numeber<<")"<<endl; //Test of delete/ int n; cout<<"删除第n个元素/n"; cin>>n; Delete(&L,n); cout<<"New Double Chain is Following!/n"; Output(&L); cout<<endl; return 0; }