赞
踩
说明
与单链表相比,在双链表中增加了一个指向其直接前驱的指针,这样形成的链表就有两个不同的方向链,使得可以从已知的结点向前查询。
插入
删除
代码
- /*
- ** dlink create by yubo.wang 2018.9.12
- */
- #include <stdio.h>
- #include <stdlib.h>
-
- typedef char ElemType;
-
- typedef struct node
- {
- ElemType data;
- struct node *prior,*next;
- }SLink;
-
- SLink *MaxNode(SLink *L);
-
- void InitList(SLink *&L) /*SLink *&L作为引用型参数或者用二级指针SLink **L*/
- {
- L=(SLink *)malloc(sizeof(SLink));
- L->prior=NULL;
- L->next=NULL;
- }
-
- int GetLength(SLink *L)
- {
- int i=0;
- SLink *p=L->next;
- while(p != NULL)
- {
- i++;
- p=p->next;
- }
- return i;
- }
-
- int GetElem(SLink *L,int i,ElemType &e)
- {
- int j=1;
- SLink *p=L->next;
- if(i<1 || i>GetLength(L))
- return 0;
- while(j<i)
- {
- p=p->next;
- j++;
- }
- e=p->data;
- return 1;
- }
-
- int Locate(SLink *L,ElemType x)
- {
- int i=1;
- SLink *p=L->next;
- while(p!=NULL && p->data!=x)
- {
- p=p->next;
- i++;
- }
- if(NULL == p)
- return 0;
- else
- return i;
- }
-
- int InsElem(SLink *L,ElemType x,int i)//初始化是尾插,也可中途插入
- {
- int j=1;
- SLink *p=L,*s;
- s=(SLink *)malloc(sizeof(SLink));
- s->data=x;
- s->prior=NULL;
- s->next=NULL;
- if(i<1 || i>GetLength(L)+1)//防止i越界
- return 0;
-
- while(j<i)
- {
- p=p->next;
- j++;
- }
- s->next = p->next;
- s->prior = p;
- if(p->next != NULL)//若p不是最后结点,将p之后的结点的prior指向s
- s->next->prior=s;
- p->next = s;
- return 1;
- }
-
- int DelElem(SLink *L,int i)
- {
- int j=1;
- SLink *p=L,*q;
- if(i<1 || i>GetLength(L))
- return 0;
- while(j<i)
- {
- p=p->next;
- j++;
- }
- q=p->next;
- printf("%c\n", q->data);
- p->next=q->next;
- if(q->next != NULL)//若q不是最后结点,将q之后的结点的prior指向p
- q->next->prior=p;
- free(q);
- return 1;
- }
-
- void DispList(SLink *L)
- {
- SLink *p=L->next;
- while(p != NULL)
- {
- printf("%c ", p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- int main()
- {
- int i;
- ElemType e;
- SLink *L=NULL;
- InitList(L);//initial head
-
- InsElem(L,'a',1);
- InsElem(L,'b',2);
- InsElem(L,'c',3);
- InsElem(L,'d',4);
- InsElem(L,'e',5);
- InsElem(L,'f',6);
-
- printf("List:");
- DispList(L);
-
- printf("Length: %d\n", GetLength(L));
-
- i=3;
- GetElem(L,i,e);
- printf("index %d data is:%c\n", i,e);
-
- e='e';
- printf("data %c index is: %d\n", e,Locate(L,e));
-
- i=4;
- printf("delete index %d data ", i);
- DelElem(L,i);
-
- i=2;
- e='w';
- printf("insert index %d data %c\n", i, e);
- InsElem(L,e,2);
-
- printf("List:");
- DispList(L);
-
- printf("MaxNode:%c\n", MaxNode(L)->data);
- }
-
- /*通过一趟遍历返回单链表元素最大值的结点*/
- SLink *MaxNode(SLink *L)
- {
- SLink *p=L->next,*q=p;//p用来遍历,q用来记录最大的值结点
- while(p != NULL)
- {
- if(p->data > q->data)
- q=p;
- p=p->next;
- }
- return q;
- }
-
- /*ScanList算法*/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。