程序员成长之双向循环链表

来源:互联网 发布:数据编是不是得英语好 编辑:程序博客网 时间:2024/05/21 09:43

/*在gentoo下编译通过*/

#include<stdio.h>
#include<stdlib.h>

typedef int elemtype;
typedef struct node{
  struct node *pre;
  elemtype data;
  struct node *next;
}tclist;

tclist* create_list(tclist *L){  /*初始化并建立链表*/
  int i,n;
  tclist *t,*p;
  if(!(L=(tclist *)malloc(sizeof(tclist)))) return NULL;
  L->pre=NULL;
  L->next=NULL;
  printf("请输入初始化元素的个数:");
  scanf("%d",&n);
  p=L;
  for(i=1;i<=n;i++){
    if(!(t=(tclist *)malloc(sizeof(tclist)))) return NULL;
    printf("请输入第%d个元素的值:",i);
    scanf("%d",&t->data);
    t->pre=p;
    p->next=t;
    p=p->next;
  }
  p->next=L;
  L->pre=p;
  return L;
}

void destory_list(tclist *L){  /*销毁链表*/
  tclist *p,*c;
  if(L->next==NULL) free(L);
  else{
    c=L->next;
    p=c->next;
    L->next=NULL;
    while(c){
      free(c);
      c=p;
      if(p) p=p->next;
    }
  }
  printf("链表销毁成功!/n");
}

tclist* delete_list(tclist *L){  /*清空链表*/
  tclist *p,*c;
  c=L->next;
  p=c->next;
  L->pre->next=NULL;
  L->next=NULL;
  L->pre=NULL;
  while(c){
    free(c);
    c=p;
    if(p) p=p->next;
  }
  return L;
}

int is_empty(tclist *L){  /*判断是否为空*/
  if(L->next==NULL) return 1;
  else return 0;
}

int get_list_length(tclist *L){   /*获取链表长度*/
  int i;
  tclist *p;
  if(is_empty(L)) return 0;
  else{
    for(p=L->next,i=0;p!=L;p=p->next,i++);
    return i;
  }
}

void print_list(tclist *L){  /*打印链表*/
  tclist *p;
  for(p=L->next;p!=L;p=p->next) printf(" %d",p->data);
}

int find(tclist *L,elemtype e){  /*查找某元素出现次数*/
  tclist *p;
  int i;
  for(p=L->next,i=0;p!=L;p=p->next){
    if(p->data==e) i++;
  }
  return i;
}

tclist* append(tclist *L,elemtype e){  /*链表尾插入*/
  tclist *t;
  if(!(t=(tclist *)malloc(sizeof(tclist)))) printf("分配临时点出错。。/n");
  else{
   t->data=e;
   t->pre=L->pre;
   t->next=L;
   L->pre->next=t;
   L->pre=t;
  }
  return L;
}

tclist* delete_elem(tclist *L,elemtype e){  /*删除所有指定元素*/
  tclist *p,*t;
  p=L->next;
  while(p!=L){
    if(p->data==e){
      t=p;
      p->pre->next=p->next;
      p->next->pre=p->pre;
      p=p->next;
      free(t);
    }
    else p=p->next;
  }
  return L;
}

int scan(){  /*菜单函数*/
  int i;
  printf("/t/t***   操作菜单   ***/n");
  printf("0.销毁链表 1.初始化并建立链表 2.清空链表 3.判断空否 4.取链表长度/n");
  printf("5.打印链表元素 6.查找某元素在链表中出现的次数/n");
  printf("7.向链表中插入元素 8.删除链表中所有值为给定值的元素/n");
  printf("其它键退出!/n");
  scanf("%d",&i);
  return i;
}

void main(){
  int quit=0;
  elemtype e;
  tclist *L;
  while(!quit){
    switch(scan()){
      case 0:
        destory_list(L);
 break;
      case 1:
        if(L=create_list(L)) printf("初始操作成功/n");
 else printf("初始化操作失败/n");
 break;
      case 2:
        if(L=delete_list(L)) printf("清空链表成功!/n");
 else printf("清空链表失败...!/n");
 break;
      case 3:
        if(is_empty(L)) printf("这是一个空链表!/n");
 else printf("本链表非空!/n");
 break;
      case 4:
        printf("链表长度为:%d/n",get_list_length(L));
 break;
      case 5:
        if(is_empty(L)) printf("这是一个空链表!/n");
 else{
   printf("链表的值分别为:");
          print_list(L);
          printf("/n");
        }
 break;
      case 6:
        printf("请输入要查找的元素:");
 scanf("%d",&e);
 printf("元素%d在链表中出现了%d次。/n",e,find(L,e));
 break;
      case 7:
        printf("请输入要插入的元素:");
 scanf("%d",&e);
 L=append(L,e);
 break;
      case 8:
        printf("请输入要删除的元素:");
 scanf("%d",&e);
        L=delete_elem(L,e);
 break;
      default:quit=1;
    }
  }
}

原创粉丝点击