#include
#include
#include
#define _CRT_SECURE_NO_WARNINGS
#define ok 1
#define error -1
typedef int Elemtype;
typedef int Status;
//带头结点的
typedef struct DNode
{
Elemtype data;
struct DNode *next, *prior; //后继和前驱指针
} DNode, *DLinkList;
//头插法建立单链表(插入顺序和打印顺序相反)
DLinkList HeadInsert(DNode *L, int n)
{
DNode *s;
int i;
L = (DLinkList)malloc(sizeof(DNode)); // 创建头结点的空间
L->data = NULL;
L->next = L; // 空链表
L->prior = L;
for (i = 0; i < n; i++)
{
if (L->next == L) // 与双链表的不同,这里循环双链表(L->next指向L它本身)
{ // 插入第一个元素
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
s->next = L->next; // 因为是头插法,插入的第一个元素就是最后一个结点,所以将其后继指针指向头结点
// 与双链表不同的地方
// 双链表这里是 s->next = L->next (为NULL)
L->next = s;
s->prior = L;
L->prior = s; // 与双链表不同的地方,头结点的前驱指针要指向表尾结点
}
else // 其他结点与双链表一样
{
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
s->next = L->next; // 插入结点的next指针指向原来头结点指向的元素
L->next = s; // 头结点的next指针指向插入的元素
L->next->prior = s; // 原来头结点指向的元素的prior指针指向插入的结点
s->prior = L; // 插入的结点的prior指针指向头结点
}
}
printf("头插法建立双链表成功\n");
return L;
}
//尾插法建立单链表(一样的顺序)
DLinkList TailInsert(DLinkList L, int n)
{
int i;
L = (DLinkList)malloc(sizeof(DNode)); // 创建头结点的空间
L->data = NULL;
//头结点的prior和next指针都先指向头结点本身
L->next = L;
L->prior = L;
DNode *s, *r;
for (i = 0; i < n; i++)
{
if(L->next == L){
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
L->next = s;
L->prior = s;
s->prior = L;
s->next = L;
r = L->next;
}
else{
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
s->next = r->next;
r->next = s;
s->prior = r;
L->prior = s;
r = s;
}
}
printf("尾插法建立双链表成功\n");
return L;
}
//求表长
Status Length(DLinkList L)
{
DNode *s;
s = L->next;
int i = 0;
if (s == NULL)
{
printf("空表\n");
return error;
}
else
{
while (s->data != NULL)
{
i++;
s = s->next;
}
return i;
}
return error;
}
//打印链表
Status print(DLinkList L)
{
int n;
DNode *s = L->next; //从第一个结点开始
while (s->data != NULL) //结束条件就是循环到头结点(头结点的data为NULL)//与单链表不一样的地方
{
printf("%d ", s->data);
s = s->next;
}
printf("\n");
return ok;
}
int main()
{
// 对于最后一个执行插入或是删除时要保持循环的特性就好了
int n;
DLinkList L;
// 头插法
/*
L = HeadInsert(L, 5);
print(L);
n = Length(L);
printf("表长为:%d", n);
*/
//尾插法
L = TailInsert(L,5);
print(L);
n = Length(L);
printf("表长为:%d", n);
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)