#include <stdio.h>
#include <stdlib.h>
typedef int Elemtype;
typedef int Status;
//双向链表的结构
typedef struct node
{
Elemtype data;
struct node *prior, *next;
}ListNode;
typedef ListNode *LinkList;
//双向链表的初始化
void InitList(LinkList L)
{
L->prior = NULL;
L->next = NULL;
}
//判断双向链表是否为空
int ListEmpty(LinkList L)
{
if(L->next == NULL)
return 1;
else
return 0;
}
//创建双向链表(尾插法)
/*void ListCreate(LinkList L, int n)
{
ListNode *p = L, *s;
int i;
printf("Input:");
for(i = 1; i <= n; i++)
{
s = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &s->data);
p->next = s;
s->prior = p;
p = s;
}
p->next = NULL;
}*/
//创建双向链表(头插法)
void ListCreate(LinkList L, int n)
{
int i;
ListNode *p = L, *s;
for(i = 1; i <= n; i++)
{
s = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &s->data);
if(i == 1)
{
s->next = p->next;
p = s;
}
else
{
s->next = p;
p->prior = s;
p = s;
}
}
L->next = p;
p->prior = L;
}
//遍历双向链表
void ListTra(LinkList L)
{
ListNode *p = L->next;
while(p->next != NULL)
{
printf("%d ", p->data);
p = p->next;
}
if(p->next == NULL)
printf("%d", p->data);
printf("\n");
}
//判断双向链表的长度
int ListLength(LinkList L)
{
int i = 1;
ListNode *p = L->next;
if(ListEmpty(L))
return 0 ;
while(p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
//销毁双向链表
void ClearList(LinkList L)
{
ListNode *p = L->next, *r;
while(p != NULL)
{
r = p->next;
free(p);
p = r;
}
L->next = NULL;
}
//第i个位置的元素返回
Status GetElem(LinkList L, int i, Elemtype *e)
{
ListNode *p = L->next;
int j = 1;
if(ListEmpty(L))
return 0;
if(i < 1)
return 0;
while(p->next != NULL && j < i)
{
p = p->next;
j++;
}
if(p->next == NULL && j != i)
return 0;
*e = p->data;
return 1;
}
//返回元素e的位置
int LocateElem(LinkList L, Elemtype e)
{
ListNode *p = L->next;
int j = 1;
if(ListEmpty(L))
return 0;
while(p->next != NULL && p->data != e)
{
p = p->next;
j++;
}
if(p->next == NULL && p->data != e)
return 0;
return j;
}
//第i个位置插入元素e
Status ListInsert(LinkList L, int i, Elemtype e)
{
ListNode *p = L->next, *s, *r = L;
int j = 1;
if(ListEmpty(L))
return 0;
if(i < 1 || i > ListLength(L) + 1)
return 0;
s = (ListNode *)malloc(sizeof(ListNode));
s->data = e;
while(p != NULL && j < i)
{
p = p->next;
r = r->next;
j++;
}
if(p == NULL && j == i)
{
r->next = s;
s->prior = r;
s->next = NULL;
}
else
{
s->next = p;
p->prior->next = s;
s->prior = p->prior;
p->prior = s;
}
return 1;
}
//删除第i个位置的元素
Status ListDelete(LinkList L, int i, Elemtype *e)
{
ListNode *p = L->next;
int j = 1;
if(ListEmpty(L))
return 0;
if(i < 1 || i > ListLength(L))
return 0;
while(p->next != NULL && j < i)
{
p = p->next;
j++;
}
if(p->next == NULL && j == i)
{
*e = p->data;
p->prior->next = NULL;
free(p);
}
else
{
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
return 1;
}
int main()
{
LinkList L = (ListNode *)malloc(sizeof(ListNode));
int n, i;
Elemtype e;
InitList(L);
printf("Input ListCreate n:");
scanf("%d", &n);
ListCreate(L, n);
if(!ListEmpty(L))
{
printf("L:");
ListTra(L);
printf("Input GetElem i:");
scanf("%d", &i);
if(GetElem(L, i, &e))
printf("GetElem e:%d\n", e);
else
printf("error\n");
printf("Input LocateElem e:");
scanf("%d", &e);
if(i = LocateElem(L, e))
printf("LocateElem i:%d\n", i);
else
printf("error\n");
printf("ListLength L:%d\n", ListLength(L));
printf("Input ListInsert i, e:");
scanf("%d %d", &i, &e);
if(ListInsert(L, i, e))
ListTra(L);
else
printf("error\n");
printf("Input ListDelete i:");
scanf("%d", &i);
if(ListDelete(L, i, &e))
{
ListTra(L);
printf("ListDelete e:%d\n", e);
}
else
printf("error\n");
ClearList(L);
}
else
printf("ListEmpty\n");
return 0;
}
#include <stdlib.h>
typedef int Elemtype;
typedef int Status;
//双向链表的结构
typedef struct node
{
Elemtype data;
struct node *prior, *next;
}ListNode;
typedef ListNode *LinkList;
//双向链表的初始化
void InitList(LinkList L)
{
L->prior = NULL;
L->next = NULL;
}
//判断双向链表是否为空
int ListEmpty(LinkList L)
{
if(L->next == NULL)
return 1;
else
return 0;
}
//创建双向链表(尾插法)
/*void ListCreate(LinkList L, int n)
{
ListNode *p = L, *s;
int i;
printf("Input:");
for(i = 1; i <= n; i++)
{
s = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &s->data);
p->next = s;
s->prior = p;
p = s;
}
p->next = NULL;
}*/
//创建双向链表(头插法)
void ListCreate(LinkList L, int n)
{
int i;
ListNode *p = L, *s;
for(i = 1; i <= n; i++)
{
s = (ListNode *)malloc(sizeof(ListNode));
scanf("%d", &s->data);
if(i == 1)
{
s->next = p->next;
p = s;
}
else
{
s->next = p;
p->prior = s;
p = s;
}
}
L->next = p;
p->prior = L;
}
//遍历双向链表
void ListTra(LinkList L)
{
ListNode *p = L->next;
while(p->next != NULL)
{
printf("%d ", p->data);
p = p->next;
}
if(p->next == NULL)
printf("%d", p->data);
printf("\n");
}
//判断双向链表的长度
int ListLength(LinkList L)
{
int i = 1;
ListNode *p = L->next;
if(ListEmpty(L))
return 0 ;
while(p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
//销毁双向链表
void ClearList(LinkList L)
{
ListNode *p = L->next, *r;
while(p != NULL)
{
r = p->next;
free(p);
p = r;
}
L->next = NULL;
}
//第i个位置的元素返回
Status GetElem(LinkList L, int i, Elemtype *e)
{
ListNode *p = L->next;
int j = 1;
if(ListEmpty(L))
return 0;
if(i < 1)
return 0;
while(p->next != NULL && j < i)
{
p = p->next;
j++;
}
if(p->next == NULL && j != i)
return 0;
*e = p->data;
return 1;
}
//返回元素e的位置
int LocateElem(LinkList L, Elemtype e)
{
ListNode *p = L->next;
int j = 1;
if(ListEmpty(L))
return 0;
while(p->next != NULL && p->data != e)
{
p = p->next;
j++;
}
if(p->next == NULL && p->data != e)
return 0;
return j;
}
//第i个位置插入元素e
Status ListInsert(LinkList L, int i, Elemtype e)
{
ListNode *p = L->next, *s, *r = L;
int j = 1;
if(ListEmpty(L))
return 0;
if(i < 1 || i > ListLength(L) + 1)
return 0;
s = (ListNode *)malloc(sizeof(ListNode));
s->data = e;
while(p != NULL && j < i)
{
p = p->next;
r = r->next;
j++;
}
if(p == NULL && j == i)
{
r->next = s;
s->prior = r;
s->next = NULL;
}
else
{
s->next = p;
p->prior->next = s;
s->prior = p->prior;
p->prior = s;
}
return 1;
}
//删除第i个位置的元素
Status ListDelete(LinkList L, int i, Elemtype *e)
{
ListNode *p = L->next;
int j = 1;
if(ListEmpty(L))
return 0;
if(i < 1 || i > ListLength(L))
return 0;
while(p->next != NULL && j < i)
{
p = p->next;
j++;
}
if(p->next == NULL && j == i)
{
*e = p->data;
p->prior->next = NULL;
free(p);
}
else
{
*e = p->data;
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
return 1;
}
int main()
{
LinkList L = (ListNode *)malloc(sizeof(ListNode));
int n, i;
Elemtype e;
InitList(L);
printf("Input ListCreate n:");
scanf("%d", &n);
ListCreate(L, n);
if(!ListEmpty(L))
{
printf("L:");
ListTra(L);
printf("Input GetElem i:");
scanf("%d", &i);
if(GetElem(L, i, &e))
printf("GetElem e:%d\n", e);
else
printf("error\n");
printf("Input LocateElem e:");
scanf("%d", &e);
if(i = LocateElem(L, e))
printf("LocateElem i:%d\n", i);
else
printf("error\n");
printf("ListLength L:%d\n", ListLength(L));
printf("Input ListInsert i, e:");
scanf("%d %d", &i, &e);
if(ListInsert(L, i, e))
ListTra(L);
else
printf("error\n");
printf("Input ListDelete i:");
scanf("%d", &i);
if(ListDelete(L, i, &e))
{
ListTra(L);
printf("ListDelete e:%d\n", e);
}
else
printf("error\n");
ClearList(L);
}
else
printf("ListEmpty\n");
return 0;
}