双链表的实现:
就是再单链表的基础上加个前驱结点,其实相较于单链表操作更加简单了,由于王道书上就指出了增加和删除的操作,这里也就简单实现下,其他操作都和单链表类似
状态码等信息定义
#define OK 1
#define ERROR 0
#define True 1
#define False 0
typedef int Elemtype;
//函数状态码
typedef int Statue;
双链表的定义
//定义adt
typedef struct Node {
Elemtype data;
struct Node* prior, * next;
}DNode,*DLinkList;
初始化
//函数的初始化
Statue InitList(DLinkList* L) {
if ((*L)) {
printf("链表已经存在,无需再初始化了");
return ERROR;
}
//开始创建
*L = (DNode*)malloc(sizeof(DNode));
if (!(*L)) { return ERROR; }
(*L)->prior = NULL;
(*L)->next = NULL;
return OK;
}
增加操作
// 在链表LL的第ii个位置插入元素ee,返回值:ERROR-失败;OK-成功。
int InsertList(DLinkList L, unsigned int ii, Elemtype* ee) {
if (L == NULL || ii < 1 || ee == NULL) {
return ERROR;
}
int count=0;
DLinkList tmp = L;
while ((count < ii-1) && (tmp != NULL)) {
tmp = tmp->next;
count++;
}
if (tmp == NULL) {
printf("超过了表长");
return ERROR;
}
DNode* nNode = (DNode*)malloc(sizeof(DNode));
if (nNode == NULL)
return ERROR;
//考虑到结构体整体拷贝的情况
memcpy(&nNode->data, ee, sizeof(Elemtype));
nNode->next = tmp->next;
nNode->prior = tmp;
if (nNode->next == NULL) {
nNode->next->prior = nNode;
}
tmp->next = nNode;
return OK;
}
双链表的删除
Statue DeleteNode(DLinkList LL, unsigned int ii) {
if ((LL == NULL) || (ii < 1)) {
return ERROR;
}
int count = 0;
DLinkList tmp = LL;
while ((tmp!= NULL)&&(count<ii-1))
{
tmp = tmp->next;
count++;
}
if (tmp->next == NULL) {
return ERROR;
}
DNode* rem = tmp->next;//要删除1结点
tmp->next = rem->next;
if (rem->next != NULL) {
tmp->next->prior = tmp;
}
free(rem);
return OK;
}
怎么说的有手就行,重点是又水了一天hhh