创建一个长度为5的双链表,要求删除4个结点,并输入其结果
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
struct node* pre;
}*DList, Node;
// 保存双向链表的最后一个节点
typedef struct Dlist{
DList back;
}*DLL, D;
// 创建一个双向链表,number 代表创建节点的个数
DList creatDLL(int number, DLL tail){
printf("你需要输入 %d 个数值 \n", number);
int i = 1;
// 头部节点的创建
Node *head = (Node*)malloc(sizeof(Node));
printf("请输入第 %d 个节点的指: \n", i);
int input_data;
scanf("%d", &input_data);
head->data = input_data;
head->pre = NULL;
DList p = head; // 保存head 节点,方便最后直接return p
while (i < number){
Node *node = (Node*)malloc(sizeof(Node));
printf("请输入第 %d 个节点的指: \n", ++i);
int in_data;
scanf("%d", &in_data);
node->data = in_data;
p->next = node;
node->pre = p;
node->next = NULL;
p = p->next; // 更新 p 节点
}
tail->back = p;
return head;
}
// 从头到尾打印节点
void printLinkList(DList head){
int i = 1;
while (head != NULL){
printf("第 %d 个节点为: %d \n", i++, head->data);
head = head->next;
}
}
// 从尾部到头部打印节点
void printLinkListFromTail(DLL tail){
int i = 1;
DList p = tail->back;
if (p == NULL) printf("TAIL 为空值 \n");
while (p != NULL){
printf("第 %d 个节点为: %d \n", i++, p->data);
p = p->pre;
}
}
// 插入一个节点,考虑头部插入和尾部插入情况
DList insertDNode(DList head, int index, int value, DLL tail){
if (head == NULL) return NULL; // 如果是空节点
DList p = head;
Node *node = (Node*)malloc(sizeof(Node));
node->data = value;
if (index == 1){ // 头部插入节点
node->next = head;
head->pre = node;
head = node;
}
else{
// 找到需要插入的前一个节点
int i = 1;
while (i < index-1){
p = p->next;
i++;
if (p == NULL){
printf("插入位置出错 \n");
return NULL;
}
}
if (p->next == NULL){ // 从尾部插入节点
p->next = node;
node->pre = p;
node->next = NULL;
tail->back = node; // 更新最后一个节点的位置
}
else{ // 从首尾之间插入节点
p->next->pre = node;
node->next = p->next;
p->next = node;
node->pre = p;
}
}
return head;
}
// 删除指定数值的 节点
DList deleteDNode(DList head, int value, DLL tail){
// 考虑删除头部节点,尾节点,找不到情况
DList p = head;
// 如果是头部节点
if (head->data == value){
head->next->pre = NULL;
head = head->next;
return head;
}
// 找到当前节点
while (p->data != value){
p = p->next;
if (p == NULL){
printf("找不到指定的节点 \n");
}
}
if (p->next == NULL){ // 最后一个节点
p->pre->next = NULL;
tail->back = p->pre; // 记录最后一个节点的位置
free(p);
}
else{
p->pre->next = p->next;
p->next->pre = p->pre;
free(p);
}
return head;
}
int main(){
DLL tail = (DLL)malloc(sizeof(D)); // 初始化
DList head = creatDLL(4, tail);
//head = insertDNode(head, 2, 100, tail);
//printLinkList(head);
head = deleteDNode(head, 1, tail);
printLinkList(head);
printf("从尾部到头部打印节点 --- \n");
printLinkListFromTail(tail);
printf("程序结束--- \n");
return 0;
}
参考一下,如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢
代码如下,如有帮助,请帮忙采纳一下(给你答的上一个题,如果没问题,也帮忙采纳一下吧),多谢。
代码:
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *pre,*next;
};
int main()
{
struct Node* head = 0,*p,*t,*k;
int i,data;
int pos;
printf("请输入5个数字创建链表:");
for (i=0;i<5;i++)
{
p = (struct Node*)malloc(sizeof(Node));
scanf("%d",&data);
p->data = data;
p->next = NULL;
if (head == 0)
{
head = p;
head->pre = NULL;
t = head;
}else
{
t->next = p;
p->pre = t;
t = p;
}
}
printf("删除4个节点,请输入需要删除的起始位置(1-2):");
scanf("%d",&pos);
if (pos ==1)
{
i = 0;
while(i<4 && head )
{
t = head->next;
free(head);
t->pre = NULL;
head = t;
i++;
}
}else
{
p = head;
i = 0;
while(i<pos-1 && p)
{
p = p->next;
i++;
}
for(i=0;i<4 && p; i++)
{
t = p->pre;
k = p->next;
t->next = k;
if(k)
k->pre = t;
free(p);
p = k;
}
}
//显示:
t = head;
while(t)
{
printf("%d ",t->data);
t = t->next;
}
//释放空间
while(head)
{
t = head->next;
free(head);
head = t;
}
head =0;
return 0;
}