双链表的节点删除操作,会删除掉其上一个节点,具体代码和问题输出如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
struct node *pre;
} node;
void init(node *head)
{
head->data = 0;
head->next = NULL;
head-> pre = NULL;
}
void head_insert(node *head, int n)
{
node *p = (node *)malloc(sizeof(node));
p->data = n;
p->pre = head;
p->next = head->next;
head->next = p;
head->data++;
}
void tail_insert(node *head, int n)
{
node *p = head;
node *q = (node *)malloc(sizeof(node));
while(p->next!=NULL){
p = p->next;
}
q->data = n;
q->next = p->next;
q->pre = p;
p->next = q;
head->data++;
}
void delete(node *head, int n)
{
node *pre;
node *next;
node *p = head->next;
while(p!=NULL){
if(p->data==n&&p->next!=NULL){
pre = p->pre;
next = p->next;
next->pre = pre;
pre->next = next;
head->data--;
// free(p);
break;
}else if(p->data==n&&p->next==NULL){
pre->next = p->next;
p = p->next;
head->data--;
//free(p);
break;
}
p = p->next;
}
}
void print(node *head)
{
node *p = head->next;
while(p!=NULL){
printf("%d ", p->data);
p = p->next;
}
}
int listlen(node *head)
{
return head->data;
}
int main()
{
node *head = (node *)malloc(sizeof(node));
init(head);
head_insert(head, 8);
head_insert(head, 11);
head_insert(head, 9);
tail_insert(head, 13);
printf("before delete :\n");
print(head);
printf("\n");
delete (head, 11);
printf("After delet :\n");
printf("Head->next data: %d\n", (head->next)->data);
print(head);
printf("\n");
printf("Node count: %d\n", listlen(head));
return 0;
}
输出图片
