双向链表

// 双向链表.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;
//---------线性表的双向链表存储结构------------

typedef struct DuLNode{
 int data;
 struct DuLNode *prior;
 struct DuLNode *next;
}DuLNode,*DuLinkList;  //用DuLNode定义的变量都是结构体变量
                       //用DuLinkList定义的变量都是结构体指针变量
int InitList(DuLinkList *L) //双向链表的初始化
 {
  //产生空的双向循环链表L
  *L=(DuLinkList)malloc(sizeof(DuLNode));
  if(*L)
  {
         (*L)->next = (*L)->prior =*L;
   return true;
  }
     else
   return false;
}

int ListLength(DuLinkList L)
{
 //初始条件:L已存在。操作结果:返回L中数据元素个数
 int i=0;
 DuLinkList p=L->next;//p指向第一个结点
 while(p!=L) //p没到表头
 {
  i++;
  p=p->next;
 }
 return i;
}
DuLinkList GetElemP(DuLinkList L,int i)
{
 //在双向链表L中返回第i个元素的位置指针
 int j;
 DuLinkList p=L;
 for(j=1;j<=i;j++)
     p=p->next;
 return p;
}

int ListInsert(DuLinkList L,int i,int e)
{
 //在带头结点的双链循环线性表L中第i个位置之前插入元素e
 DuLinkList p,s;
 if(i<1 || i>ListLength(L)+1) //i值不合法
  return false;
 p=GetElemP(L,i-1);//在L中确定第i-1个元素的位置指针p
 if(!p) //p=NULL,即第i-1个元素不存在
  return false;
 s=(DuLinkList)malloc(sizeof(DuLNode));
 if(!s)
  exit(-1);
 s->data=e;  //在地i-1个元素之后插入
    s->prior=p;
 s->next=p->next;
 p->next->prior=s;
 p->next=s;
 return true;
}
int ListDelete(DuLinkList L,int i,int *e)
{
 //删除带头结点的双链循环线性表L的第i个元素,i的合法值为1<=i<=表长+1
 DuLinkList p;
 if(i<1 || i>ListLength(L)) //i值不合法
  return false;
 p=GetElemP(L,i);//在L中确定第i个元素的位置指针p
 if(!p) //p=NULL,即第i个元素不存在
  return false;
 *e=p->data;
 p->prior->next=p->next;
 p->next->prior=p->prior;
 free(p);
 return true;
}

 
int main(int argc, char* argv[])
{
 DuLinkList DuL,p;
 InitList(&DuL);
 int e,ta,num,ch[200],k;
 cout<<"请输入元素的个数"<<endl;
 cin>>num;
 for(int i=1;i<=num;i++)
 {
  cin>>ch[i];
  ListInsert(DuL,i,ch[i]);
 }
 cout<<ListLength(DuL)<<endl;
 cout<<"输出链表中各个元素"<<endl;
 for(int j=1;j<=num;j++)
 {
       p=GetElemP(DuL,j);
       cout<<p->data<<endl;
 }
 cout<<"请输入你要删除的第i个元素"<<endl;    
 cin>>k;
 ListDelete(DuL,k,&e);
   cout<<"你要删除的第"<<k<<"个元素为"<<e<<endl;
 cout<<"删除元素"<<e<<"后的链表元素为"<<endl;
 for(int g=1;g<num;g++)
 {
  p=GetElemP(DuL,g);
  cout<<p->data<<endl;
 }


 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值