Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4470923
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: C/C++

2011-05-13 13:59:50

   需求简述:用C语言编写一个 双向链表
    需要重视基础

代码v1.0:
 v1-0.rar  

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

  3. typedef char ElemType;
  4. typedef struct _list
  5. {
  6.     ElemType data;
  7.     struct _list *prior;   ##注意原先,我是写成 int*prior 的。
  8.     struct _list *next;
  9.     int length; //获取链表结点数
  10. }LIST;

  11. LIST *init_list(void)
  12. {
  13.     LIST *l=NULL;
  14.     l=(LIST *)malloc(sizeof(LIST)); //申请 head结点 *prior *next 地址空间
  15.     if(l==NULL)
  16.         exit(1);
  17.     l->prior=l->next=NULL;
  18.     l->data=0;
  19.     l->length=0; //初始化 链表结点数=0
  20.     return l;
  21. }

  22. int insert_elem(LIST *l,int i,ElemType *e)
  23. {
  24.     LIST *list=l;
  25.     LIST *new=NULL;
  26.     int j=1;

  27.     if(i<1||i>l->length+1)
  28.         return 1;

  29.     new=(LIST *)malloc(sizeof(LIST));
  30.     if(new==NULL)
  31.     {
  32.         free(new);
  33.         exit(1);
  34.     }
  35.     new->data=*e; //初始化 结点数据
  36.     new->prior=NULL;
  37.     new->next=NULL;

  38.     while(j<i) //定位到 要插入的 前一个结点 i-1
  39.     {
  40.         list=list->next;
  41.         j++;
  42.     }
  43. /* M N
  44.       NEW 三个结点,NEW为要插入的结点
  45. */
  46.     new->next=list->next; //NEW->next=N;
  47.     new->prior=list; //NEW->prior=M
  48.     if(list->next!=NULL) //如果不是最后一个结点
  49.         new->next->prior=new; //N->prior=NEW
  50.         // 如果是最后一个结点, N后没有结点
  51.     list->next=new; //M->next=NEW;
  52.     
  53.     ++l->length;
  54.     return 0;        
  55. }

  56. int delete_elem(LIST *l,int i)
  57. {
  58.     LIST *list=l;
  59.     LIST *tmp=NULL;
  60.     int j=1;
  61.     if(i<1||i>l->length)
  62.         return 1;

  63.     while(j<i) //定位到 要删除 i的前一个 i-1 结点
  64.     {
  65.         j++;
  66.         list=list->next;
  67.     }

  68.     tmp=list->next; //指向要删除的结点
  69.     list->next=tmp->next;
  70.     if(tmp->next!=NULL)//tmp 不是最后结点
  71.         tmp->next->prior=list;
  72.     free(tmp);
  73.     --l->length;
  74.     return 0;
  75. }

  76. int main()
  77. {
  78.     ElemType ch1='a';
  79.     ElemType ch2='b';
  80.     ElemType ch3='c';
  81.     LIST *list;    
  82.     list=init_list();

  83.         insert_elem(list,1,&ch1);    插入节点
  84.         insert_elem(list,1,&ch2);
  85.     insert_elem(list,3,&ch3);
  86.     printf("1th data is %c\n",list->next->data);
  87.     printf("2th data is %c\n",list->next->next->data);
  88.     printf("2th data is %c\n",list->next->next->next->data);
  89.     printf("length = %d\n",list->length);

  90.     printf("delete node 1...\n");  删除节点
  91.     delete_elem(list,1);
  92.     printf("1th data is %c\n",list->next->data);
  93.     printf("2th data is %c\n",list->next->next->data);
  94.     printf("length = %d\n",list->length);

  95.     printf("delete node 2...\n");  删除节点
  96.     delete_elem(list,2);
  97.     printf("1th data is %c\n",list->next->data);
  98.     printf("length = %d\n",list->length);

  99.     return 0;
  100. }

  1. ywx@yuweixian:~/yu/professional/1$ ./link
  2. 1th data is b
  3. 2th data is a
  4. 2th data is c
  5. length = 3
  6. delete node 1...
  7. 1th data is a
  8. 2th data is c
  9. length = 2
  10. delete node 2...
  11. 1th data is a
  12. length = 1





阅读(852) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~