#include <stdio.h>
#include <stdlib.h>
struct
node {
int
value;
struct
node * prior;
struct
node * next;
};
struct
node * in_link(
void
);
//创建一个双向链表
void
print_link(
struct
node * head);
struct
node * delete_link(
struct
node * head,
int
i);
//删除链表结点
void
get(
struct
node * head,
int
i,
struct
node **pDel);
int
main(
void
)
{
int
i, y;
struct
node * head;
head = in_link();
print_link(head);
printf
(
"你想删除数据在链表的第几个数据: "
);
scanf
(
"%d"
, &i);
head = delete_link(head, i);
print_link(head);
return
0;
}
struct
node * in_link(
void
)
{
struct
node *head, *temp, *add_temp;
int
n, i;
printf
(
"您想插入几个数据: "
);
scanf
(
"%d"
, &n);
head = (
struct
node *)
malloc
(
sizeof
(
struct
node));
if
(head == NULL) {
printf
(
"分配内存失败\n"
);
exit
(EXIT_FAILURE);
}
printf
(
"请输入链表的第1个数据: "
);
scanf
(
"%d"
, &head->value);
head->next = NULL;
head->prior = NULL;
temp = head;
for
(i = 2;i <= n;i++)
{
add_temp = (
struct
node *)
malloc
(
sizeof
(
struct
node));
//动态分配内存空间
if
(add_temp == NULL)
{
printf
(
"内存分配失败\n"
);
exit
(EXIT_FAILURE);
}
printf
(
"请输入链表的第%d个数据: "
, i);
scanf
(
"%d"
, &add_temp->value);
add_temp->next = NULL;
/* 给prior赋值,将其指向其前一个节点 */
add_temp->prior = temp;
temp->next = add_temp;
temp = temp->next;
}
return
head;
}
void
print_link(
struct
node * head)
{
while
(head != NULL) {
printf
(
"%d "
, head->value);
head = head->next;
}
printf
(
"\n"
);
}
/* 想通过返回值来获取指定节点需用二级指针来实现,不建议使用,易出错 */
void
get(
struct
node * head,
int
i,
struct
node **pDel)
//将你想删除的数据取出
{
struct
node * temp;
int
j = 1;
*pDel = head;
while
(*pDel != NULL && j < i) {
*pDel = (*pDel)->next;
j++;
}
printf
(
"%d\n"
, (*pDel)->value);
}
struct
node * delete_link(
struct
node * head,
int
i)
//删除取出的数据,调用了get函数
{
struct
node * temp;
get(head, i,&temp);
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free
(temp);
return
head;
}
#include <stdio.h>
#include <stdlib.h>
struct
node {
int
value;
struct
node * prior;
struct
node * next;
};
struct
node * in_link(
void
);
//创建一个双向链表
void
print_link(
struct
node * head);
struct
node * delete_link(
struct
node * head,
int
i);
//删除链表结点
void
get(
struct
node * head,
int
i,
struct
node **pDel);
int
main(
void
)
{
int
i, y;
struct
node * head;
head = in_link();
print_link(head);
printf
(
"你想删除数据在链表的第几个数据: "
);
scanf
(
"%d"
, &i);
head = delete_link(head, i);
print_link(head);
return
0;
}
struct
node * in_link(
void
)
{
struct
node *head, *temp, *add_temp;
int
n, i;
printf
(
"您想插入几个数据: "
);
scanf
(
"%d"
, &n);
head = (
struct
node *)
malloc
(
sizeof
(
struct
node));
if
(head == NULL) {
printf
(
"分配内存失败\n"
);
exit
(EXIT_FAILURE);
}
printf
(
"请输入链表的第1个数据: "
);
scanf
(
"%d"
, &head->value);
head->next = NULL;
head->prior = NULL;
temp = head;
for
(i = 2;i <= n;i++)
{
add_temp = (
struct
node *)
malloc
(
sizeof
(
struct
node));
//动态分配内存空间
if
(add_temp == NULL)
{
printf
(
"内存分配失败\n"
);
exit
(EXIT_FAILURE);
}
printf
(
"请输入链表的第%d个数据: "
, i);
scanf
(
"%d"
, &add_temp->value);
add_temp->next = NULL;
/* 给prior赋值,将其指向其前一个节点 */
add_temp->prior = temp;
temp->next = add_temp;
temp = temp->next;
}
return
head;
}
void
print_link(
struct
node * head)
{
while
(head != NULL) {
printf
(
"%d "
, head->value);
head = head->next;
}
printf
(
"\n"
);
}
/* 想通过返回值来获取指定节点需用二级指针来实现,不建议使用,易出错 */
void
get(
struct
node * head,
int
i,
struct
node **pDel)
//将你想删除的数据取出
{
struct
node * temp;
int
j = 1;
*pDel = head;
while
(*pDel != NULL && j < i) {
*pDel = (*pDel)->next;
j++;
}
printf
(
"%d\n"
, (*pDel)->value);
}
struct
node * delete_link(
struct
node * head,
int
i)
//删除取出的数据,调用了get函数
{
struct
node * temp;
get(head, i,&temp);
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free
(temp);
return
head;
}