线性表(双链表)C语言简单实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#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->next = NULL;
L->prior = NULL;
for (i = 0; i < n; i++)
{
if (L->next == NULL)
{
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
s->next = L->next;
L->next = s;
s->prior = L;
}
else
{
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
s->next = L->next;
L->next = s;
L->next->prior = s;
s->prior = L;
}
}
printf("头插法建立双链表成功\n");
return L;
}
DLinkList TailInsert(DLinkList L, int n)
{
int i;
L = (DLinkList)malloc(sizeof(DNode));
DNode *s, *r = L;
for (i = 0; i < n; i++)
{
s = (DNode *)malloc(sizeof(DNode));
scanf("%d", &s->data);
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
printf("尾插法建立双链表成功\n");
return L;
}
DNode *LocateElem(DLinkList L, Elemtype e)
{
DNode *s = L->next;
while (s && s->data != e)
{
s = s->next;
}
return s;
}
DNode *GetElem(DLinkList L, int pos)
{
int j = 1;
DNode *s = L->next;
if (pos == 0)
return L;
if (pos < 1)
return NULL;
while (s && j < pos)
{
s = s->next;
j++;
}
return s;
}
Status Insert(DLinkList L, int pos)
{
if (pos < 0 || pos > Length(L) + 1)
return error;
DNode *s, *p;
s = (DNode *)malloc(sizeof(DNode));
printf("请输入要插入结点的值为:");
scanf("%d", &s->data);
p = GetElem(L, pos);
s->next = p;
p->prior->next = s;
s->prior = p->prior;
p->prior = s;
return ok;
}
Status Insert2(DLinkList L, int pos)
{
if (pos < 0 || pos > Length(L) + 1)
return error;
DNode *s, *p;
s = (DNode *)malloc(sizeof(DNode));
printf("请输入要插入结点的值为:");
scanf("%d", &s->data);
p = GetElem(L, pos);
if(pos == Length(L))
{
p->next = s;
s->prior = p;
s->next = NULL;
}
else{
s->next = p->next;
p->next = s;
p->next->prior = s;
s->prior = p;
}
return ok;
}
Status Delete(DLinkList L, int pos)
{
DNode *p, *q, *s;
if (pos < 0 || pos >= Length(L))
return error;
else
{
s = GetElem(L, pos+1);
if (pos == Length(L) - 1)
{
s->prior->next = NULL;
free(s);
}
else
{
q = s->prior;
q->next = s->next;
s->next->prior = q;
free(p);
}
}
return ok;
}
Status Delete2(DLinkList L, int pos)
{
DNode *p, *q;
if (pos <= 1 || pos >= Length(L) + 1)
return error;
p = GetElem(L, pos);
q = p->prior;
p->prior = q->prior;
q->prior->next = p;
free(q);
return ok;
}
Status Length(DLinkList L)
{
DNode *s;
s = L->next;
int i = 0;
if (s == NULL)
{
printf("空表\n");
return error;
}
else
{
while (s != NULL)
{
i++;
s = s->next;
}
return i;
}
return error;
}
Status print(DLinkList L)
{
DNode *s = L->next;
while (s)
{
printf("%d ", s->data);
s = s->next;
}
printf("\n");
return ok;
}
int main()
{
int n;
int t, m;
DLinkList L;
Elemtype e;
DNode *p;
int pos;
while (1)
{
printf("================================\n");
printf(" 线性表(双链表)\n");
printf("================================\n");
printf("1:求表长 2:头插法 3:尾插法\n");
printf("4:按值查找 5:按序号查找 6:在pos前插入结点\n");
printf("7:在pos后插入结点 8:删除pos后继结点 9:删除pos前驱结点\n");
printf("10:打印链表 11:退出\n");
printf("--------------------------------\n");
printf("请选择:");
scanf("%d", &t);
switch (t)
{
case 1:
n = Length(L);
if (n != -1)
{
printf("表长为:%d\n", n);
}
break;
case 2:
printf("请输入元素个数:");
scanf("%d", &m);
L = HeadInsert(L, m);
break;
case 3:
printf("请输入元素个数:");
scanf("%d", &m);
L = TailInsert(L, m);
break;
case 4:
printf("请输入要查找的元素:");
scanf("%d", &e);
p = LocateElem(L, e);
if (p != NULL)
{
printf("查找值:%d成功\n", p->data);
}
else
{
printf("没有此值\n");
}
break;
case 5:
printf("请输入要查找的序号:");
scanf("%d", &pos);
p = GetElem(L, pos);
if (p)
{
printf("找到序号为%d的元素值为:%d\n", pos, p->data);
}
else
{
printf("没找到\n");
}
break;
case 6:
printf("请输入要插入的位置:");
scanf("%d", &pos);
n = Insert(L, pos);
if (n == -1)
{
printf("插入的位置错误\n");
}
else
{
printf("插入成功\n");
print(L);
}
break;
case 7:
printf("请输入要插入的位置:");
scanf("%d", &pos);
n = Insert2(L, pos);
if (n == -1)
{
printf("插入的位置错误\n");
}
else
{
printf("插入成功\n");
print(L);
}
break;
case 8:
printf("请输入要删除的位置:");
scanf("%d", &pos);
n = Delete(L, pos);
if (n == -1)
{
printf("删除的位置错误\n");
}
else
{
printf("删除成功\n");
print(L);
}
break;
case 9:
printf("请输入要删除的位置:");
scanf("%d", &pos);
n = Delete2(L, pos);
if (n == -1)
{
printf("删除的位置错误\n");
}
else
{
printf("删除成功\n");
print(L);
}
break;
case 10:
print(L);
break;
case 11:
printf("双链表模拟结束Bye!\n");
exit(0);
break;
}
}
}