元旦日,当然是用来学习咯
#include <stdio.h>
#include <stdlib.h>
typedef struct LINK {
struct LINK *prior;
int data;
struct LINK *next;
}link;
//初始化双向链表
link * initial()
{
//创建一个结点
link *head = (link*)malloc(sizeof(link));
head->prior = NULL;
head->data = 1;
head->next = NULL;
link *list = head;
for (int i = 2; i <= 3; i++) {
link * temp = (link*)malloc(sizeof(link));
temp->prior = NULL;
temp->data = i;
temp->next = NULL;
list->next = temp;
temp->prior = list;
list = list->next;
}
return head;
}
//添加数据
link *addElem(link *head, int add, int elem) {
link *temp = head;
link *ELEM = (link*)malloc(sizeof(link));
ELEM->prior = NULL;
ELEM->data = elem;
ELEM->next = NULL;
//找到add的位置
if (add == 1)
{
ELEM->next = head;
head->prior = ELEM;
head = ELEM;
}
else
{
for (int i = 1; i < add - 1; i++)
temp = temp->next;
if (temp->next) {
temp->next->prior = ELEM;
ELEM->next = temp->next;
temp->next = ELEM;
ELEM->prior = temp;
}
else
{
temp->next = ELEM;
ELEM->prior = temp;
}
}
return head;
}
//删除数据
link *delELEM(link *head, int elem) {
link *temp = head;
//int flag = 0;
while (temp) {
if (temp->data == elem)
{
if (temp->prior && temp->next) {
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
return head;
}
else if (temp->prior==NULL)
{
temp->next->prior = NULL;
head = temp->next;
free(temp);
return head;
}
else if (temp->next == NULL)
{
temp->prior->next = NULL;
free(temp);
return head;
}
}
temp = temp->next;
}
/*if (temp->data == elem && temp->next == NULL) {
temp->prior->next = NULL;
free(temp);
return head;
}*/
printf("未找到%d\n", elem);
return head;
}
//显示链表
void display(link *head) {
link *temp = head;
while (temp) {
if (temp->next==NULL)
printf("%d", temp->data);
else
printf("%d->", temp->data);
temp = temp->next;
}
putchar('\n');
}
int main()
{
puts("双向链表的世界!");
puts("-------生成双向链表-----------");
link *head = initial();
display(head);
int add, elem;
printf("\n请输入您要添加的位置及其数据:\n");
printf("位置:"); scanf("%d", &add);
printf("数据:"); scanf("%d", &elem);
puts("----------新的双向链表--------");
head = addElem(head, add, elem);
display(head);
printf("\n请输入您要删除的数据:\n");
printf("数据:"); scanf("%d", &elem);
puts("---------新的链表--------");
head = delELEM(head, elem);
display(head);
printf("\n by xj \n");
return 0;
}
双向链表的实现其实也只是指针的移动
希望自己2018年能保持学习热情