双向链表简介和举例解析
双链表结构体的定义1:
结构体:
主函数中:
调用函数中:
双链表结构体的定义2:
结构体:
主函数中:
调用函数中:
头插法:
尾插法:
双向链表代码1
#include <stdio.h>
#include <malloc.h>
#define true 1
#define false 0
typedef int bool;
typedef int ElemType;
typedef struct DNode //定义双链表结点类型
{
ElemType data;
struct DNode *prior; //指向前驱结点
struct DNode *next; //指向后继结点
} DLinkList;
void CreateListF(DLinkList *L, ElemType a[], int n);//头插法建双链表
void CreateListR(DLinkList *L, ElemType a[], int n);//尾插法建双链表
DLinkList *InitList();
//void InitList(DLinkList *L); //初始化双链表
void DestroyList(DLinkList *L); //销毁双链表
bool ListEmpty(DLinkList *L); //判断链表是否为空
int ListLength(DLinkList *L); //求链表的长度
void DispList(DLinkList *L); //输出链表
bool GetElem(DLinkList *L, int i, ElemType *e); //获取节点的值
int LocateElem(DLinkList *L, ElemType e); //查找一个节点
bool ListInsert(DLinkList *L, int i, ElemType e);//插入一个节点
bool ListDelete(DLinkList *L, int i, ElemType *e); //删除一个节点
int main()
{
DLinkList *A;
int e;
ElemType a[] = { 1, 3, 2, 9, 0, 4, 5, 6, 7, 8 };
A=InitList();
CreateListR(A, a, 10);
printf("第三个节点的值是什么:");
GetElem(A, 3, &e);
printf("%d", e);
printf("\n链表的长度: %d\n", ListLength(A));
printf("你要查找哪个值?");
int p;
scanf("%d", &p);
printf("是第%d个节点", LocateElem(A,p));
printf("\n插入的节点,插入的位置:");
int n, v;
scanf("%d%d", &n, &v);
ListInsert(A, n, v);
printf("After Insert: ");
DispList(A);
DestroyList(A);
system("pause");
return 0;
}
DLinkList *InitList()
{
DLinkList *L;
L = (DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
L->prior = L->next = NULL;
return L;
}
void CreateListF(DLinkList *L, ElemType a[], int n)
//头插法建双链表
{
DLinkList *s;
int i;
//L = (DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
//L->prior = L->next = NULL;
for (i = 0; i<n; i++)
{
s = (DLinkList *)malloc(sizeof(DLinkList));//创建新结点
s->data = a[i];
s->next = L->next; //将*s插在原开始结点之前,头结点之后
if (L->next != NULL) L->next->prior = s;
L->next = s;
s->prior = L;
}
}
void CreateListR(DLinkList *L, ElemType a[], int n)
//尾插法建双链表
{
DLinkList *s, *r;
int i;
//L = (DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
//L->prior = L->next = NULL;
r = L; //r始终指向终端结点,开始时指向头结点
for (i = 0; i<n; i++)
{
s = (DLinkList *)malloc(sizeof(DLinkList));//创建新结点
s->data = a[i];
r->next = s;
s->prior = r; //将*s插入*r之后
r = s;
}
r->next = NULL; //终端结点next域置为NULL
}
//void InitList(DLinkList **L)
//{
// (*L) = (DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
// (*L)->prior = (*L)->next = NULL;
//}
void DestroyList(DLinkList *L)
{
DLinkList *p = L, *q = p->next;
while (q != NULL)
{
free(p);
p = q;
q = p->next;
}
free(p);
}
bool ListEmpty(DLinkList *L)
{
return(L->next == NULL);
}
int ListLength(DLinkList *L)
{
DLinkList *p = L;
int i = 0;
while (p->next != NULL)
{
i++;
p = p->next;
}
return(i);
}
void DispList(DLinkList *L)
{
DLinkList *p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
bool GetElem(DLinkList *L, int i, ElemType *e)
{
int j = 0;
DLinkList *p = L;
while (j<i && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return false;
else
{
*e = p->data;
return true;
}
}
int LocateElem(DLinkList *L, ElemType e)
{
int n = 1;
DLinkList *p = L->next;
while (p != NULL && p->data != e)
{
n++;
p = p->next;
}
if (p == NULL)
return(0);
else
return(n);
}
bool ListInsert(DLinkList *L, int i, ElemType e)
{
int j = 0;
DLinkList *p = L, *s;
while (j<i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL) //未找到第i-1个结点
return false;
else //找到第i-1个结点*p
{
s = (DLinkList *)malloc(sizeof(DLinkList)); //创建新结点*s
s->data = e;
s->next = p->next; //将*s插入到*p之后
if (p->next != NULL) p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
}
bool ListDelete(DLinkList *L, int i, ElemType *e)
{
int j = 0;
DLinkList *p = L, *q;
while (j<i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL) //未找到第i-1个结点
return false;
else //找到第i-1个结点*p
{
q = p->next; //q指向要删除的结点
if (q == NULL)
return false; //不存在第i个结点
*e = q->data;
p->next = q->next; //从单链表中删除*q结点
if (p->next != NULL) p->next->prior = p;
free(q); //释放*q结点
return true;
}
}
双向链表代码2
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int bool;
typedef char ElemType;
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLinkList;
int DuLink_ListInsertR(DuLinkList *L, ElemType e)//采用尾插法插入元素
{
DuLinkList *p = L, *q;
while (p->next != NULL)
{
p = p->next;
}
q = (DuLinkList *)malloc(sizeof(DuLinkList));
q->data = e;
q->prior = p;
p->next = q;
q->next = NULL;
return 1;
}
void DuLink_DispList(DuLinkList *L)
{
DuLinkList *p;
p = L->next;
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
void DuLink_ListLength(DuLinkList *L)
{
DuLinkList *p;
p = L;
int i = 0;
while (p->next != NULL)
{
i++;
p = p->next;
}
printf("长度为: %d\n", i);
}
bool DuLink_ListEmpty(DuLinkList *L)
{
return(L->next == NULL);
}
bool DuLink_GetElem(DuLinkList *L, int i)
{
int j = 0;
DuLinkList *p=NULL;
p = L;
while (j<i &&p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
printf("ERROR");
else
{
printf("%c\n", p->data);
}
}
int DuLink_LocateElem(DuLinkList *L, ElemType e)
{
int i = 1;
DuLinkList *p = L->next;
while (p != NULL&&p->data != e)
{
p = p->next;
i++;
}
if (p == NULL)
return 0;
else
{
return i;
}
}
void DuLink_ListInsert(DuLinkList *L, int i, ElemType e)
{
DuLinkList *p, *q;
p = L;
int j = 0;
while (j<i&&p != NULL)
{
j++;
p = p->next;
}
p = p->prior;
q = (DuLinkList *)malloc(sizeof(DuLinkList));
q->data = e;
q->next = p->next;
q->prior = p;
p->next = q;
}
int DuLink_ListDestroy(DuLinkList *L, int i)
{
int j = 0;
DuLinkList *p, *q;
p = L;
while (j<i&&p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return 0;
else
{
q = p;
p = p->prior;
p->next = q->next;
free(q);
return 1;
}
}
//void DuLink_DestroyList(DuLinkList *L)
//{
// DuLinkList *p=L, *q=p->next;
//
// while (q != NULL)
// {
// free(q);
// p = q;
// q = q->next;
// }
// free(p);
//}
void DuLink_InitList(DuLinkList **L)
{
(*L) = (DuLinkList *)malloc(sizeof(DuLinkList));
(*L)->prior = NULL;
(*L)->next = NULL;
//return L;
}
int main()
{
DuLinkList *h=NULL;
ElemType e;
printf("双链表的基本运算如下:\n");
DuLink_InitList(&h);
printf("初始化双链表h\n");
printf("依次采用尾插入法插入a,b,c,d,e元素\n");
DuLink_ListInsertR(h, 'a');
DuLink_ListInsertR(h, 'b');
DuLink_ListInsertR(h, 'c');
DuLink_ListInsertR(h, 'd');
DuLink_ListInsertR(h, 'e');
printf("输出双链表h:\n");
DuLink_DispList(h);
printf("双链表h长度");
DuLink_ListLength(h);
printf("判断双链表h是为空\n");
DuLink_ListEmpty(h);
printf("输出双链表h的第3个元素\n");
DuLink_GetElem(h, 3);
printf("元素a的位置=%d\n", DuLink_LocateElem(h, 'a'));
printf("在第4个元素插入f元素\n");
DuLink_ListInsert(h, 4, 'f');
printf("输出双链表h:");
DuLink_DispList(h);
printf("删除h的第3个元素\n");
DuLink_ListDestroy(h, 3);
printf("输出双链表h:");
DuLink_DispList(h);
/*printf("释放双链表h\n");
DuLink_DestroyList(h);*/
system("pause");
}