基本操作
(1)头插法和尾插法进行初始化
(2)查找值为x的结点
(3)按照序号查找结点值
(4)双向链表的插入操作(在第i位插入n)
(5)删除第i个结点
(6)打印链表所有结点的值
版本1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode
{
int data;
struct DNode *prior, *next;
}DNode, *DLinkList;
//双链表的初始化操作(这里使用头插法进行初始化)
DLinkList List_HeadInsert(DLinkList &L)
{
//初始化一个链表
L = (DLinkList)malloc(sizeof(DNode));
L->prior = NULL;
L->next = NULL;
int x;
scanf("%d", &x);
while (x != 9999) {
DNode *s = (DNode*)malloc(sizeof(DNode));
s->data = x;
s->next = L->next;
if (L->next != NULL) {
L->next->prior = s;
}
L->next = s;
s->prior = L;
scanf("%d", &x);
}
return L;
}
//双链表的初始化操作(尾插法)
DLinkList List_TailInsert(DLinkList& L)
{
L = (DLinkList)malloc(sizeof(DNode));
L->prior = NULL;
L->next = NULL;
int x;
DNode* r = L;//尾指针
scanf("%d", &x);
while (x != 9999) {
DNode* s = (DNode*)malloc(sizeof(DNode));
s->data = x;
r->next = s;
s->prior = r;
r = s;//更新尾指针
scanf("%d", &x);
}
r->next = NULL;
return L;
}
//查找值为x的结点
DNode* LocateElem(DLinkList& L,int x) {
DNode* p = L->next;
while (p != NULL) {
if (p->data == x) {
break;
}
p = p->next;
}
return p;
}
//按照序号查找结点值
DNode* GetElem(DLinkList L,int i)
{
int j = 1;
DNode* p = L->next;
if (i < 1) {
return NULL;
}
if (i == 0) {
return L;
}
while (p && j < i) {
p = p->next;
j++;
}
return p;
}
//双链表的插入操作(在第i位插入n)
void insert_Elem(DLinkList& List, int i, int n) {
DNode* tmp = GetElem(List, i - 1);
DNode* newnode = (DNode*)malloc(sizeof(DNode));
newnode->data = n;
newnode->next = tmp->next;
if (tmp->next != NULL) {
tmp->next->prior = newnode;
}
tmp->next = newnode;
newnode->prior = tmp;
}
//删除第i个结点
void delete_Elem(DLinkList&List,int i)
{
DNode* p = GetElem(List, i - 1);
DNode* tmp = p->next;
p->next = tmp->next;
if (tmp->next != NULL) {
tmp->next->prior = p;
}
delete tmp;
}
//打印双链表
void display(DLinkList List)
{
DNode* p = List->next;
printf("链表元素的数值为:\n");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
DLinkList L;
printf("头插法初始化链表\n");
List_HeadInsert(L);
display(L);
DLinkList L1;
printf("尾插法初始化链表\n");
List_TailInsert(L1);
display(L1);
printf("L的第一个元素为:%d", GetElem(L, 1)->data);
insert_Elem(L, 2, 100);
printf("在2位置处插入100后的L中元素为:\n");
display(L);
delete_Elem(L, 3);
printf("删除第三个元素后L中元素为:\n");
display(L);
return 0;
}
版本2:另一种结构体定义方式,就写了头插法的初始化和打印,原理和版本1差不多。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//分别定义结点和双向链表结构体
typedef struct DNode
{
int data;
DNode* prior, * next;
} DNode;
typedef struct DLinkList
{
DNode* head;
DNode* tail;
int size;
}DLinkList;
DLinkList List_HeadInsert(DLinkList& L)
{
L.head = (DNode*)malloc(sizeof(DNode));
L.tail = (DNode*)malloc(sizeof(DNode));
L.head->next = L.tail;
L.tail->prior = L.head;
int x;
scanf("%d", &x);
while (x != 9999) {
DNode* s = (DNode*)malloc(sizeof(DNode));
s->data = x;
s->next = L.head->next;
L.head->next->prior = s;
L.head->next = s;
s->prior = L.head;
scanf("%d", &x);
}
return L;
}
//打印双链表
void display(DLinkList List)
{
DNode* p = List.head->next;
printf("链表元素的数值为:\n");
while (p != List.tail) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
DLinkList L;
printf("头插法初始化链表\n");
List_HeadInsert(L);
display(L);
}