/*程序的版权和版本声明部分:
*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[n];
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;
}
运行结果: