双向链表
用C++实现一个双向链表(元素类型为int),需支持
a、两个链表之间的深拷贝
b、两个链表的拼接
c、从链表头插入/删除元素
d、查找链表中的某个元素
e、返回链表中指定下标的元素
用C++实现一个双向链表(元素类型为int),需支持
a、两个链表之间的深拷贝
b、两个链表的拼接
c、从链表头插入/删除元素
d、查找链表中的某个元素
e、返回链表中指定下标的元素
#include <stdio.h>
#include <malloc.h>
typedef struct list{
int value;
struct list *next;
struct list *pre;
}node;
//增加节点
node *insert(node *head, int tmp)
{
node *p = (node *)malloc(sizeof(node));
p->value = tmp;
if (head)
{
head->pre = p;
p->next = head;
p->pre = NULL;
}
else
{
p->next = NULL;
p->pre = NULL;
}
return p;
}
//删除节点
node *del(node *head)
{
if (!head)
return NULL;
node *p = head->next;
free(head);
head = NULL;
return p;
}
//复制链表
node *listcpy(node *dest, node *src)
{
if (!src)
return NULL;
node *p, *p1;
dest = (node *)malloc(sizeof(node));
dest->value = src->value;
dest->pre = NULL;
p1 = dest;
p = NULL;
while(src->next)
{
src = src->next;
p = (node *)malloc(sizeof(node));
p->value = src->value;
p1->next = p;
p->pre = p1;
p1 = p;
}
p1->next = NULL;
return dest;
}
//合并链表
node *merge(node *dest, node *src)
{
if (NULL == dest)
return src;
if (NULL == src)
return dest;
node *p;
p = dest;
while (p->next != NULL)
p = p->next;
p->next = src;
src->pre = p;
return dest;
}
//查找元素
bool find(node *head, int input)
{
while (head != NULL)
{
if (head->value == input)
return true;
head = head->next;
}
return false;
}
//得到第n个元素
int get(node *head, int index)
{
int i;
for (i = 1; i < index; ++i)
{
if (NULL == head->next)
return EOF;
head = head->next;
}
return head->value;
}
//遍历链表
void print(node *head)
{
while (head)
{
printf("%4d", head->value);
head = head->next;
}
printf("\n");
}
int main()
{
node *pa = NULL, *pb = NULL;
int tmp;
while (scanf("%d", &tmp) != EOF)
{
if (tmp < 0)
break;
pa = insert(pa, tmp);
}
print(pa);
pb = listcpy(pb, pa);
print(pb);
pb = del(pb);
print(pb);
pa = merge(pa, pb);
print(pa);
scanf("%d", &tmp);
tmp = find(pa, tmp);
printf("%d\n", tmp);
scanf("%d", &tmp);
tmp = get(pa, tmp);
printf("%d\n", tmp);
return 0;
}