#include <stdio.h>
#include <stdlib.h>
#include <assert.h> typedef struct DoubleLinkNode
{
int data;
struct DoubleLinkNode *prev;
struct DoubleLinkNode *next;
}Node; /* 创建一个带头节点的双向链表 */
Node* Create_Double_link()
{
Node* phead;
Node* pnew;
Node* plast;
int i,n;
phead = (Node*)malloc(sizeof(Node));
assert(NULL != phead);
phead->prev = NULL;
phead->next = NULL; printf("please input the length of the double linked list:");
scanf("%d",&n);
if(n!=)
{
plast = phead;
for(i = ; i < n;i++)
{
pnew=(Node*)malloc(sizeof(Node));
printf("向第%d个节点输入数据:",i+);
scanf("%d",&pnew->data); plast->next = pnew;
pnew->prev = plast; plast = plast->next;
}
pnew->next=NULL;
}
return phead;
}
/* 输出每一个节点的数据 */
void print(Node* head)
{
Node* temp;
int j=;
temp = head;
while(temp->next != NULL)
{
j++;
printf("输出第%d个节点的数据:%d\n",j,temp->next->data);
temp=temp->next;
}
}
/* 插入节点 */
int InsertNode(Node* head)
{
Node* new;
Node* p=head;
int i=;
int n;
Node* pnext;
printf("please input the location which is inserted:");
scanf("%d",&n); while((i<n-) && (p!=NULL))
{
i++;
p = p->next; }
if(p==NULL)
{
return ;
}
else
{
new=(Node*)malloc(sizeof(Node));
printf("请在新插入的节点中输入数据:");
scanf("%d",&new->data);
/*
第一步:首先找到插入位置,节点 s 将插入到节点 p 之前
第二步:将节点 s 的前驱指向节点 p 的前驱,即 s->prior = p->prior;
第三步:将节点 p 的前驱的后继指向节点 s 即 p->prior->next = s;
第四步:将节点 s 的后继指向节点 p 即 s->next = p;
第五步:将节点 p 的前驱指向节点 s 即 p->prior = s;*/
if(p->next == NULL) //p是最后一个节点,新的节点在最后
{
p->next = new;
new->prev = p;
}
else
{
pnext = p->next; //p为前驱节点,新节点将插入在p和pnext之间
new->prev = pnext->prev;
pnext->prev->next = new;
new->next = pnext;
pnext->prev = new;
}
}
return ;
}
/*删除节点 */
int DeleteNode(Node*head)
{
Node*p=head;
Node*ptr;
int n;
int i=;
printf("please input the node that you will delete:");
scanf("%d",&n);
while((i<n-) && (p!=NULL))
{
i++;
p=p->next;
}
if(p==NULL)
{
return ;
}
if(p->next->next!=NULL) //删除的不是最后一个节点
{
ptr=p->next;
ptr->next->prev=p;
p->next = ptr->next;
free(ptr);
ptr = NULL;
}
else //删除的是最后一个节点
{
ptr=p->next;
p->next = ptr->next;
free(ptr);
ptr = NULL;
}
return ;
}
/* 主函数 */
int main(int argc,char**argv)
{
Node* head;
head=Create_Double_link();
InsertNode(head);
DeleteNode(head);
print(head);
return ;
}

最新文章

  1. 红豆电信JS
  2. linux命令行中单个减号表示标准输入输出流
  3. Druid Monitor监控JavaSE,杀cmd端口进程
  4. yii框架详解 之 国际化 (I18N)
  5. Sublime Text 3 Build 3065 All System CracKed By Hmily[LCG]
  6. redis的启动与停止
  7. Java中字符串相等与大小比较
  8. 类库探源——System.Exception
  9. ubuntu14.04 制作U盘启动文件
  10. MYSQL 加密的 3 类方法
  11. 深度学习大牛Yoshua Bengio
  12. css3制作3d旋转相册
  13. Connections between cities
  14. Spring WebFlux 要革了谁的命?
  15. idea部署Maven入门(一)——环境变量的配置和下载
  16. mybatis源码笔记
  17. 百战程序员——JDBC
  18. 将Bdd100k数据集转为CoCo数据集
  19. 关于mysql触发器和存储过程的理解
  20. 面向对象【day08】:反射的最佳实践(三)

热门文章

  1. 面试题思考:Stack和Heap的区别 栈和堆的区别
  2. 手动刷新客户端配置内容(Spring Cloud Config)
  3. 2.golang应用目录结构和GOPATH概念
  4. 模板 - 线性递推BM
  5. python数据结构:numpy
  6. CentOS 系统开启防火墙,屏蔽IP,解决DDOS攻击
  7. Linux 实操(root密码重置 无法上网 安装xrdp)
  8. LinuxC语言实现ATM取款机实验Socket
  9. python面向对象--类的内置方法
  10. docker设置proxy