数据结构——基本数据结构之链表
2008-01-23 11:43
651 查看
双向循环链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
DuLinkListMain.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
/**//*简单测试程序*/
int main(int argc, char **argv)
...{
ElemType elem;
LinkList pDuList;
InitList(&pDuList);
ListInsert(&pDuList, 1, 2);
printf("%d %d ", pDuList->data, pDuList->next->data);
ListDelete(&pDuList, 1, &elem);
printf("The delete element is %d ", elem);
DestroyList(&pDuList);
return 0;
}
linklist.h
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef int ElemType;
typedef struct DuLinkNode...{
ElemType data;
struct DuLinkNode *prior;
struct DuLinkNode *next;
}LNode, *LinkList;
int InitList(LinkList *head);
int DestroyList(LinkList *head);
int ListInsert(LinkList *head, int i, ElemType e);
int ListDelete(LinkList *head, int i, ElemType *e);
int ListSearch(LinkList head, ElemType e);
int GetElem(LinkList head, int i, ElemType *e);
#endif
linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
/**//*产生头结点为head的空双向链表*/
int InitList(LinkList *head)
...{
*head = (LinkList)malloc(sizeof(LNode));
if(!(*head))
return 0;
(*head)->next = *head;
(*head)->prior = *head;
(*head)->data = 0; /**//*链表长度*/
return 1;
}
/**//*操作结果:销毁头结点为head双向链表*/
int DestroyList(LinkList *head)
...{
LinkList p, q;
p = (*head)->next;
while(p != *head)
...{
q = p->next;
free(p);
p = q;
}
free(*head);
*head = NULL;
return 1;
}
/**//*在头结点为head的双链线性表中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1*/
int ListInsert(LinkList *head, int i, ElemType e)
...{
int j;
LinkList p, s;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!(s = (LinkList)malloc(sizeof(LNode))))
return 0;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return 1;
}
/**//*删除带头结点的双链线性表的第i个元素,i的合法值为1≤i≤表长*/
int ListDelete(LinkList *head, int i, ElemType *e)
...{
int j;
LinkList p;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 1;
}
/**//*带头结点的双链线性表中查找是否含有值为e的节点*/
int ListSearch(LinkList head, ElemType e)
...{
LinkList p;
p = head->next;
while(p != NULL && p->data != e)
...{
p = p->next;
}
if(p != NULL)
return 1;
else
return 0;
}
/**//*当第i个元素存在时,其值赋给e并返回1,否则返回0*/
int GetElem(LinkList head, int i, ElemType *e)
...{
int j;
LinkList p;
p = head->next;
j = 1;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
return 1;
}
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
DuLinkListMain.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
/**//*简单测试程序*/
int main(int argc, char **argv)
...{
ElemType elem;
LinkList pDuList;
InitList(&pDuList);
ListInsert(&pDuList, 1, 2);
printf("%d %d ", pDuList->data, pDuList->next->data);
ListDelete(&pDuList, 1, &elem);
printf("The delete element is %d ", elem);
DestroyList(&pDuList);
return 0;
}
linklist.h
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef int ElemType;
typedef struct DuLinkNode...{
ElemType data;
struct DuLinkNode *prior;
struct DuLinkNode *next;
}LNode, *LinkList;
int InitList(LinkList *head);
int DestroyList(LinkList *head);
int ListInsert(LinkList *head, int i, ElemType e);
int ListDelete(LinkList *head, int i, ElemType *e);
int ListSearch(LinkList head, ElemType e);
int GetElem(LinkList head, int i, ElemType *e);
#endif
linklist.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
/**//*产生头结点为head的空双向链表*/
int InitList(LinkList *head)
...{
*head = (LinkList)malloc(sizeof(LNode));
if(!(*head))
return 0;
(*head)->next = *head;
(*head)->prior = *head;
(*head)->data = 0; /**//*链表长度*/
return 1;
}
/**//*操作结果:销毁头结点为head双向链表*/
int DestroyList(LinkList *head)
...{
LinkList p, q;
p = (*head)->next;
while(p != *head)
...{
q = p->next;
free(p);
p = q;
}
free(*head);
*head = NULL;
return 1;
}
/**//*在头结点为head的双链线性表中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1*/
int ListInsert(LinkList *head, int i, ElemType e)
...{
int j;
LinkList p, s;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!(s = (LinkList)malloc(sizeof(LNode))))
return 0;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return 1;
}
/**//*删除带头结点的双链线性表的第i个元素,i的合法值为1≤i≤表长*/
int ListDelete(LinkList *head, int i, ElemType *e)
...{
int j;
LinkList p;
j = 1;
p = (*head)->next;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
return 1;
}
/**//*带头结点的双链线性表中查找是否含有值为e的节点*/
int ListSearch(LinkList head, ElemType e)
...{
LinkList p;
p = head->next;
while(p != NULL && p->data != e)
...{
p = p->next;
}
if(p != NULL)
return 1;
else
return 0;
}
/**//*当第i个元素存在时,其值赋给e并返回1,否则返回0*/
int GetElem(LinkList head, int i, ElemType *e)
...{
int j;
LinkList p;
p = head->next;
j = 1;
while(p && j < i)
...{
p = p->next;
j++;
}
if(!p || j > i)
return 0;
*e = p->data;
return 1;
}
相关文章推荐
- 郝斌数据结构(1)----数据结构基本分类和链表创建
- (摘)面向对象c++数据结构之基本数据结构-链表-使用链表管理器(连载中)
- 数据结构——基本数据结构之链表
- 【数据结构与算法003】基本数据结构——线性表(链表)
- 数据结构实验一--单链表的基本操作的算法
- 数据结构C语言>3基本链表>3-8链表结构的反转
- C++数据结构(1)----基本数据结构
- 【数据结构与算法001】基本数据结构——队列
- 数据结构基本结构 数据结构期末复习
- 数据结构之线性表之顺序表和链表(通过数据结构角度深入理解arrayList和linkedList的特性)
- 数据结构—链表-单链表基本操作实现
- 数据结构之设置尾指针的单向循环链表(参考整理严蔚敏数据结构)
- 【数据结构作业】实验三 单链表的基本操作(必做,设计性实验,4学时)
- 三.数据结构与基本绘图(2.常用图形数据结构)
- 数据结构大学教程之数据结构及其基本概念(1)
- 面向数据c++数据结构之基本数据结构(队列)--【美】Jan Harrington 陈博译
- 【数据结构与算法004】基本数据结构——树
- 数据结构中双向链表的基本操作(源代码)
- 【数据结构与算法】基本数据结构——队列的链式表示
- 学习数据结构 -> 数据结构的基本概念