双链表

#include<stdio.h> #include<stdlib.h> #define ElemType char #define CREATE (DLinkList)malloc(sizeof(DLNode)) // define 后面没有分号,靠 struct DLNode{ ElemType data; DLNode *prior; DLNode *next; }; typedef DLNode *DLinkList; typedef ElemType *Elem; ////////////////////////////////////////// void testCreateDLinkListTail(); void createDLinkListTail(DLinkList &L,char arr[],int length); void output(DLinkList &L); int locateElem(DLinkList &L, ElemType e); void testLocateElem(); int insertElem(DLinkList &L, int i, ElemType e); void testInsertElem(); int deleteElem(DLinkList &L, int i, ElemType *e); void testDeleteElem(); /////////////////////////////////////////// void main() { //testCreateDLinkListTail(); //testLocateElem(); //testInsertElem(); testDeleteElem(); } ////////////////////////////////// test /////////////////////////////////// void testInsertElem() { char arr[]={'a','b','c','d','e','f','g'}; int length =7; DLinkList L; createDLinkListTail(L,arr,length); output(L); insertElem(L,4,'x'); output(L); } void testCreateDLinkListTail() { char arr[]={'a','b','c','d','e','f','g'}; int length =7; DLinkList L; createDLinkListTail(L,arr,length); output(L); } void testLocateElem() { int k; char arr[]={'a','b','c','d','e','f','g'}; int length =7; DLinkList L; createDLinkListTail(L,arr,length); k=locateElem(L,'a'); printf("%d",k); } void testDeleteElem() { char *temp; char c='x'; char arr[]={'a','b','c','d','e','f','g'}; int length =7; DLinkList L; createDLinkListTail(L,arr,length); temp =&c; // 需要初始化,要给他一个地址 deleteElem(L,1,temp); printf("test %c",*temp); } ////////////////////////////////////////////////////////////////////////// /** * 删除节点,删除 i 位置上的节点 * 成功返回 1,否则返回0 */ int deleteElem(DLinkList &L, int i, ElemType *e) { ElemType temp; DLinkList p,s; int k=0; p=L; while(p!=NULL && k<i-1) { p=p->next; k++; } if(p==NULL) { return 0; } else { s=p->next; temp=s->data; // 保存数据 *e = temp; printf("delete %c/n",*e); s->next->prior = p; p->next = s->next; free(s); return 1; } } /** * 插入节点,在 i 位置之后插入一个节点 * 成功返回 1,否则返回0 */ int insertElem(DLinkList &L, int i, ElemType e) { DLinkList p,s; int k=0; p=L; while(p!=NULL && k<i-1) // 定位 i-1 { p=p->next; k++; } if(p==NULL) // 没找到 { return 0; } else { s=CREATE; s->data = e; s->next = p->next; if(p->next!=NULL) p->next->prior=s; p->next=s; s->prior =p; return 1; } } /** * 查到第一个 data 域为 e的节点 * 有:返回序号,没有返回 0 */ int locateElem(DLinkList &L, ElemType e) { DLinkList p; int k=1; // 计数 p=L->next; // 指向首节点 while(p!=NULL && p->data!=e) // 注意 p!=NULL,不是 p->next!=NULL { p=p->next; k++; } if(p==NULL) //!!!! return 0; else return k; } /** * 采用尾插法建立 * */ void createDLinkListTail(DLinkList &L,char arr[],int length) { int k; DLinkList s,tail; L=(DLinkList)malloc(sizeof(DLNode)); // 建立头指针 L->next=NULL; L->prior=NULL; tail=L; for(k=0;k<length;k++) // length没有减 1,k 会到 7,但只计算到 6 { s=CREATE; s->data = arr[k]; //插入开始 tail->next=s; s->prior=tail; //s->next=NULL; tail=s; // 始终指向尾巴 } tail->next=NULL; } /////////////////////////////////////////////////////////////////// /** * 输出 */ void output(DLinkList &L) { DLinkList p; p=L->next; while(p->next!=NULL) { printf("%2c",p->data); p=p->next; } printf("%2c/n",p->data); }

你可能感兴趣的:(双链表)