码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构笔记4双向链表

时间:2015-12-02 17:58:21      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define ENDFlAG 0
//双向链表节点 
struct DNode{
 int data;
 struct DNode *prior,*next;
}DNode,*DLinkList;
//初始化以及建立,采用尾插法,返回1 
int InitLinkList_Asighment(DLinkList h,int i){
 DNode *p,*q;
 h = (DNode *)malloc(sizeof(DNode));
 h->next=NULL;
 p=h;//p为终端节点指针 
 p->next=NULL;
 //初始化成功
 int x;
 for(;i>0;i--){//执行赋值操作
  scanf("%d",&x);
  q=(DNode *)malloc(sizeof(DNode));
  q->data=x;
  q->next=p->next;
  p->next=q;
  p=q;
 }
 p->next=NULL;
  return OK;//1
}
//插入操作,返回1 
int LinkList_Insert(DLinkList h,int i,int e){
 DLinkList p,s;//s为插入的节点
 p=h->next;
 int temp;
 for(temp=1;temp<i-1;temp++)
  p=p->next;
 s=(DNode *)malloc(sizeof(DNode));
 s->data=e;
 p->next->prior=s;
 s->prior=p;
 p->next=s;
 return OK;
}
//查找操作,返回1-yes 0-no
int  DLinkList_Locate(DLinkList h,int e){
 DLinkList p;//p为索引 
 p=h->next;
 int i;
 while(p!=NULL&&p->data!=e){}//此条件不能反过来
  ++i;    //否则p为空时,p->data会出错 
  p=p->next;
 }
 if(p==NULL){
  printf("对不起,该元素不存在!\n");
  return ENDFlAG;//0
 }
 else{
  printf("该元素的位置为:%d\n",i);
  return OK;
 }
   
}
//删除操作,返回1-yes 0-no
int DLinkList_Delet(DLinkList h,int i){
 int temp=1;
 DLinkList p;//索引
 p->next=NULL;
 while((temp++)!=i&&p!=NULL)
  p=p->next;
 if(p==NULL){
  printf("该位置不存在,删除失败!");
  return ENDFlAG;//0
 }
 else if(p->next==NULL){}//最后一个节?
  p->prior->next=NULL;
  free(p);
  printf("删除成功!");
  return OK;
 }
 else{
  p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p);
  printf("删除成功!");
  return OK;
 }

//主函数
int main(){
 DLinkList h;
 int i,e;
 int j;
 printf("双向链表的操作开始!\n");
 printf("请输入你要建立的个数:");
 scanf("%d",&i);
 if(1!=InitLinkList_Asighment(h,i)){
  printf("建立失败,按任意键退出!\n");
  getch();
  exit(ERROR);
 }
 else{
  printf("建立成功!\n");
  printf("是否进行查找操作?1-是\n");
  printf("请输入你的选择:"); 
 }
 scanf("%d",&j);
 if(j==1)
  goto locate;
 else{
  printf("是否进行插入操作?1-是\n");
  printf("请输入你的选择:");
 }
 scanf("%d",&j);
 if(j==1)
  goto insert;
 else{
  printf("是否进行删除操作?1-是\n");
  printf("请输入你的选择:");
 }
 scanf("%d",&j);
 if(j==1)
  goto delet;
 else{
  printf("双向链表操作测试结束,按任意键退出!\n");
  getch();
  exit(0);
 }
 locate:
  if(1!=DLinkListLocate(h,e)){
   printf("查找失败!\n");
   goto insert;
  }
 insert:
  if(1!=DLinkListInsert(h,i,e)){
   printf("插入失败!\n");
   goto delet;
  }
 delet:
  if(1!=DLinkListDelet(h,i)){
   printf("删除失败!按任意键退出!\n");
   getch();
   exit(OVERFLOW);
  }
 printf("双向链表操作测试结束!\n");
 return 0;
}
 
采用尾插法
 

数据结构笔记4双向链表

标签:

原文地址:http://www.cnblogs.com/100114jerro/p/4998740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!