主要涉及双链表的建立、测长、打印、插入结点以及删除结点等。
实际上跟单链表的操作差不多,只是要特别注意双链表多了指向前驱结点的指针,在写相关代码的时候要特别小心,别弄错了。
代码如下:
#include <stdio.h>
#include <malloc.h>
typedef struct student
{
int data;
struct student *next;
struct student *pre;
}dnode;
dnode *creat()
{
dnode *head, *p, *s;
int input, cycle = 1;
head = (dnode *)malloc(sizeof(dnode));
p = head;
while(cycle)
{
printf("\nplease enter the data:");
scanf("%d", &input);
if(input != 0)
{
s = (dnode *)malloc(sizeof(dnode));
s->data = input;
printf("\n%d", s->data);
p->next = s;
s->pre = p;
p = s;
}
else
cycle = 0;
}
head = head->next;
head -> pre = NULL;
printf("\nThe value of the first node is: %d", head->data);
p->next = NULL;
return head;
}
//双链表测长,可以看出代码其实跟前面的单链表测长一样
int length(dnode *head)
{
dnode *p;
p = head;
int count = 0;
while(p)
{
p = p->next;
count++;
}
return count;
}
//打印链表
void print(dnode *head)
{
dnode *p;
int len = length(head);
printf("\nNOW %d node(s) in the List:", len);
p = head;
if(head != NULL)
{
while(p)
{
printf("\n ¥¥¥¥¥ %d", p->data);
p = p->next;
}
}
}
//双链表删除结点
//双链表的删除也别忘了有大致4种情况
//一是没有找到,二是在第一个结点,三是在最后一个结点,四是在中间的情况
dnode *delete_from_dlist(dnode *head, int num)
{
if(head == NULL)
{
printf("\n链表为空!!");
return head;
}
dnode *current = head;
while(num != current->data && current->next != NULL)
{
current = current->next;
}
if(num == current->data)
{
if(current == head)
{
head = head->next;
head->pre = NULL;
free(current);
}
else if(current->next == NULL)
{
current->pre->next = NULL;
free(current);
}
else
{
current->pre->next = current->next;
current->next->pre = current->pre;
free(current);
}
}
else
{
printf("\nNODE NOT FOUND!!");
}
return head;
}
//双链表插入结点
dnode *insert_to_list(dnode *head, int num)
{
dnode *cur, *insert_node;
cur = head;
insert_node = (dnode *)malloc(sizeof(dnode));
insert_node -> data = num;
while(insert_node->data > cur->data && cur->next != NULL)
{
cur = cur->next;
}
if(insert_node->data <= cur->data)
{
if(cur == head)
{
insert_node->next = cur;
cur->pre = insert_node;
head = insert_node;
}
else
{
insert_node->next = cur;
insert_node->pre = cur->pre;
cur->pre->next = insert_node;
cur->pre = insert_node;
}
}
else
{
cur->next = insert_node;
insert_node->pre = cur;
insert_node->next = NULL;
}
return head;
}
int main(void)
{
dnode *List = creat();
print(List);
List = delete_from_dlist(List, 4);
print(List);
List = insert_to_list(List, 5);
print(List);
return 0;
}
运行结果如下: