数据结构(线性表):双链表

来源:互联网 发布:ee源码网 编辑:程序博客网 时间:2024/06/10 13:17
/**数据结构:线性表的链式表示*双链表*线性表元素序号从1算起*Date:2017/4/13*/#include <stdio.h>#include <stdlib.h>#define InitSize 100#define ElemType chartypedef struct LNode{ElemType data;int length;struct LNode *prior,*next;}LNode,*LinkList;LinkList createList1(LinkList &L);//头插法建立双链表LinkList createList2(LinkList &L);//尾插法建立双链表LNode *getElem(LinkList L,int i);//按序号查找表结点值LNode *locateElem(LinkList L,ElemType e);//按值按序号顺序查找表结点在链表L中第一次出现的位置void listInsert(LinkList L,int i,ElemType e);//在第i个结点位置插入新结点,元素值为evoid listDelete(LinkList L,int i,ElemType *e);//删除第i个结点,用e返回删除元素的值void printList(LinkList L);//按先后序号打印链表bool emptyList(LinkList L);//判断链表是否为空,为空就返回true,否则返回falseint lengthList(LinkList L);//返回链表长度void destoryList(LinkList &L);//销毁链表LinkList createList1(LinkList &L){LNode *s;char ch;L = (LinkList)malloc(sizeof(LNode));L->length = 0;L->prior = NULL;L->next = NULL;while(scanf("%c",&ch) != EOF && ch != '\n'){s = (LNode *)malloc(sizeof(LNode));s->data = ch;if(L->next != NULL){//若头结点的下一个结点不指向NULLL->next->prior = s;//让头结点的下一个结点的前驱指针指向s}s->next = L->next;L->next = s;s->prior = L;//让s的前驱指针指向L头结点L->length++;//scanf("%c",&ch);}return L;}LinkList createList2(LinkList &L){char ch;L = (LinkList)malloc(sizeof(LNode));L->length = 0;L->prior = NULL;L->next = NULL;LNode *s,*r=L;while(scanf("%c",&ch) != EOF && ch != '\n'){s = (LNode *)malloc(sizeof(LNode));s->data = ch;r->next = s;s->prior = r;//让s的前驱指针指向尾指针rr = s;L->length++;}r->next = NULL;//让尾指针指向NULLreturn L;}LNode *getElem(LinkList L,int i){int j = 1;LNode * s = L->next;if(i == 0){return L;}while(s && j < i){s = s->next;j++;}return s;}LNode *locateElem(LinkList L,ElemType e){LNode *s = L->next;while(s && s->data != e){s = s->next;}return s;}void listInsert(LinkList L,int i,ElemType e){LNode *s = getElem(L,i-1);LNode *p = (LNode *)malloc(sizeof(LNode));p->data = e;if(s->next != NULL){s->next->prior = p;}p->next =  s->next;s->next = p;p->prior = s;L->length++;}void listDelete(LinkList L,int i,ElemType *e){LNode *s = getElem(L,i-1);LNode *p = s->next;*e = p->data;s->next = p->next;if(p->next != NULL){p->next->prior = s;}free(p);L->length--;}void printList(LinkList L){LNode *s = L->next;while(s){printf("%c ",s->data);s = s->next;}printf("\n");}bool emptyList(LinkList L){if(L->next == NULL){return true;}else{return false;}}void destroyList(LinkList &L){while(L->next != NULL){LNode *tmp = L;L = L->next;free(tmp);}printf("\n%p\n",L);printf("已销毁链表");}int lengthList(LinkList L){return L->length;}int main(){freopen("in.txt","r",stdin);printf("/*************************双链表****************************/\n\n\n");LinkList L1,L2;/*if(emptyList(L1)){printf("L1为空\n");}else{printf("L1不为空\n");}*/createList1(L1);createList2(L2);printList(L1);printList(L2);printf("L1长度:%d\nL2长度:%d\n",lengthList(L1),lengthList(L2));LNode *s1 = getElem(L1,3);printf("L1第3个位置:%c\n",s1->data);LNode *s2 = getElem(L2,4);printf("L2第4个位置:%c\n",s2->data);printf("s2->prior->data:%c\n",s2->prior->data);printf("s2->prior->prior->prior->data:%c\n",s2->prior->prior->prior->data);s1 = locateElem(L1,'e');s2 = locateElem(L2,'p');printf("s1 = locateElem(L1,'e'):%c\n",s1->data);printf("s2 = locateElem(L2,'p'):%c\n",s2->data);listInsert(L1,2,'z');printf("listInsert(&L1,2,'z') :");printList(L1);char e;listDelete(L2,3,&e);printf("listDelete(&L2,3,&e) : %c\n",e);printList(L2);if(emptyList(L1)){printf("L1为空\n");}else{printf("L1不为空\n");}if(emptyList(L2)){printf("L2为空\n");}else{printf("L2不为空\n");}printf("L1长度:%d\nL2长度:%d\n",lengthList(L1),lengthList(L2));destroyList(L2);printf("L2\n");printf("\n%p\n",L2);printf("L2 LENGTH :%d\n",L2->length);printf("%p\n",L2->next);return 0;}


in.txt:

abcepoui
apple

0 0
原创粉丝点击