双向链表的建立,增加,删除操作
2014-09-11 18:22
477 查看
/*程序的版权和版本声明部分: *Copyright(c)2014,烟台大学计算机学院学生 *All rights reserved. *文件名称: *作者:田成琳 *完成日期:2014 年 9 月 11 日 *版本号:v1.0 *对任务及求解方法的描述部分: *问题描述:链表的简单应用 *程序输入: - *程序输出:链表值 *问题分析: *算法设计: */ #include<iostream> #include<cstdlib> using namespace std; struct LinkList { int data; struct LinkList *next;//后驱 struct LinkList *front;//前驱 }; void CreateListF(LinkList *&L,int array[],int n);//头插法建立链表 void CreateListR(LinkList *&L,int array[],int n);//尾插法建立链表 bool ListInsert(LinkList *&L,int i,int e);//插入e元素在i位置 bool ListDelete(LinkList *&L,int e);//删除e元素 void ListDisplay(LinkList *&L);//显示元素 void CreateListF(LinkList *&L,int array[],int n) { LinkList *s; L=(LinkList *)malloc(sizeof(LinkList)); L->front=L->next=NULL; //L前后置空 for(int i=0; i<n; i++) //循环创建链表 { s=(LinkList *)malloc(sizeof(LinkList)); s->data=array[i]; s->next=L->next; if(L->next!=NULL) //第一次循环不进行 L->next->front=s; L->next=s; s->front=L; } } void CreateListR(LinkList *&L,int array[],int n) { LinkList *s,*r; L=(LinkList *)malloc(sizeof(LinkList)); r=L; //r指向尾节点,开始时指向头结点 for(int i=0; i<n; i++) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=array[i]; r->next=s; s->front=r; r=s; } r->next=NULL; } bool ListInsert(LinkList *&L,int i,int e) { int j=0; LinkList *p=L,*s; while(j<i-1&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else //找到了第i-1个节点 { s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next;//修改指针指向 if(p->next!=NULL)//p->next不是空节点则s后没有指向的指针 p->next->front=s; s->front=p; p->next=s; return true; } } bool ListDelete(LinkList *&L,int e) { LinkList *p=L,*q; while(p->data!=e&&p!=NULL) p=p->next; p=p->front;//指针位置到了要删除的元素,所以要前移一个 if(p==NULL) return false; else { q=p->next; if(q==NULL) return false; p->next=q->next; if(p->next!=NULL) p->next->front=p; free(q); } return true; } void ListDisplay(LinkList *&L) { LinkList *p=L->next;//p指向开始节点 while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } int main() { LinkList *L; int n,choose,position,number; cout<<"请输入数字个数及数字:"<<endl; cin>>n; int *array=new int ; for(int i=0; i<n; i++) cin>>array[i]; cout<<"请选择插入方法:"<<endl; cout<<"1.正序插入."<<endl; cout<<"2.倒序插入."<<endl; cin>>choose; if(choose==1) { cout<<"使用尾插法建立的双向链表为:"<<endl; CreateListR(L,array,n); ListDisplay(L); } if(choose==2) { cout<<"使用头插法建立的双向链表为:"<<endl; CreateListF(L,array,n); ListDisplay(L); } cout<<"请输入要插入链表中的元素位置及元素:"<<endl; cin>>position>>number; ListInsert(L,position,number); cout<<"插入后链表中的元素为:"<<endl; ListDisplay(L); cout<<"请输入要插删除的链表中的元素:"<<endl; cin>>number; ListDelete(L,number); cout<<"删除后链表中的元素为:"<<endl; ListDisplay(L); return 0; }
运行结果:
相关文章推荐
- 用java实现的双向链表增加删除修改操作
- c语言双向链表的学习,链表建立,删除,增加,减少
- java建立双向链表,插入结点,删除节点
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 链表基本操作(建立、修改,插入、删除、打印)
- 双向链表的删除操作
- javascript操作dom 建立 增加 删除 克隆 访问节点
- 单链表建立,插入,删除,查找,遍历操作
- (C++版)链表(三)——实现双向链表的创建、插入、删除等简单操作
- [原]C语言实现双向链表删除节点、插入节点、双向输出等操作
- 散列表碰撞的链接法解决之双向链表删除操作的代价
- 链表建立、删除、插入基本操作
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- 单链表 建立, 查找, 删除, 插入 操作
- 双向链表图解(前插操作,删除操作)
- 链表的基本操作(C语言版):建立,插入,删除,查找,输出
- 如何使用c语言实现双向链表的插入删除操作