//Filename:DLink.cpp
//Writed by CaoLichen
//双向链表及其操作
#include<stdio.h>
#include<stdlib.h>
//结点类型
typedef struct DNode
{
int data;
struct DNode *next; //指向后继结点
struct DNode *pre; //指向前继结点
}DLink;
//线性表初始化
DLink *InitLink(DLink *head)
{
head = (DLink *)malloc(sizeof(DLink)); //申请空间
head->next = NULL;
head->pre = NULL;
return head;
}
//建立双向链表
void CreateLink(DLink *head, int n)
{
DLink *tmp;
for(; n > 0; n --){
tmp = (DLink *)malloc(sizeof(DLink));
printf("请输入数据:");
scanf("%d",&(tmp->data));
tmp->next = head->next; //头插法,逆序排放
head->next = tmp;
tmp->pre = head;
if(tmp->next != NULL){
tmp->next->pre = tmp;
}
//head = head->next;
}
printf("建立双向链表成功!\n");
}
//打印列表
void PrintLink(DLink *head)
{
head = head->next;
while(head != NULL){
printf("%d\n",head->data);
head = head->next;
}
printf("打印双向列表成功!\n");
}
//删除第n个结点
int DeleteLink(DLink *head, int n)
{
int count = 1; //当 n=1时会出错,删除的是头结点
while(count != n && head != NULL){
head = head->next;
count ++;
}
if(head == NULL){
printf("删除结点出现错误!\n"); // n大于链表长度
return 0;
}
head->pre->next = head->next; //
if(head->next != NULL){
head->next->pre = head->pre;
}
free(head); //释放空间
}
//在第n个结点后添加结点
int InsertLink(DLink *head, int n)
{
int count = 1;
//int num;
DLink *tmp;
//head = head->next;
while(count != n && head != NULL){
count ++;
head = head->next;
}
if(head == NULL){
printf("添加结点出现错误!\n"); // n 大于链表的长度
return 0;
}
printf("请输入插入的数据:");
tmp = (DLink *)malloc(sizeof(DLink));
scanf("%d",&tmp->data);
tmp->next = head->next;
head->next = tmp;
tmp->pre = head;
if(tmp->next != NULL){
tmp->next->pre = tmp;
}
}
int main(){
DLink *head;
head = NULL;
head = InitLink(head); //双向链表初始化
int n;
printf("请输入数据总量:");
scanf("%d",&n);
CreateLink(head,n); //建立双向链表
PrintLink(head); //打印线性表
printf("请输入要删除结点位置:");
scanf("%d",&n);
DeleteLink(head,n); //删除结点
PrintLink(head); //打印线性表
printf("请输入要添加结点位置:");
scanf("%d",&n);
InsertLink(head,n); //添加结点
PrintLink(head); //打印线性表
return 0;
}双向链表的一些操作
最新推荐文章于 2024-08-22 14:17:39 发布
本文详细介绍了双向链表的概念、初始化、建立、打印、删除和添加节点等基本操作。
3389

被折叠的 条评论
为什么被折叠?



