加载中…
个人资料
liht1634
liht1634
  • 博客等级:
  • 博客积分:0
  • 博客访问:223,741
  • 关注人气:58
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

线性表-单向循环链表

(2017-01-16 15:52:47)
标签:

线性表之单循环链表

分类: 编程类

/////////////////////////////////////Program of circular linked list ///////////////////////////

 #include "stdio.h" 
#include "malloc.h"

struct node 

  int info; 
  struct node *link; 
}*last; 

void create_list(int num)//创造一个以num为值的节点,添加到链表末尾,由于是循环链表,所以保存一个 
                                      //尾节点last作为一个链表访问接口就可以了
  struct node *tmp; 
  tmp= malloc(sizeof(struct node)); 
  tmp->info = num; 
 
  if(last == NULL)     //链表一个节点都没有 
 
    last = tmp; 
    tmp->link = last; 
 
  else 
 
    tmp->link = last->link;  
    last->link = tmp; 
    last = tmp; 
 

 
void addatbeg(int num)       //在链表首添加一个以num为值的节点 

  struct node *tmp; 
  tmp = malloc(sizeof(struct node)); 
  tmp->info = num; 
  tmp->link = last->link; 
  last->link = tmp;         //注意看这个函数同以上的else分支区别,这里没有last=temp,所以只是添加节点而已,即循环链表的入口代表last不变 

 
void addafter(int num,int pos)    //插入一个以num为值的节点,插入后位置为第pos+1位(以首节点,也就是last节点下一个作为第一位) 
{
  struct node *tmp,*q; 
  int i; 
  q = last->link; 
  for(i=0; i < pos-1; i++) 
 
    q = q->link; 
    if(q == last->link) 
   
      printf("There are less than %d elements\n",pos); 
      return; 
   
 
  tmp = malloc(sizeof(struct node) ); 
  tmp->link = q->link; 
  tmp->info = num; 
  q->link = tmp; 
  if(q==last)     
    last=tmp; 

 
void del(int num)      //删除值为num的节点 

  struct node *tmp,*q; 
  if( last->link == last && last->info == num)   
 
    tmp = last; 
    last = NULL; 
    free(tmp); 
    return; 
 
  q = last->link; 
  if(q->info == num)       //q,此时指向首节点,跟首节点值相同,进行一系列删除操作 
 
    tmp = q; 
    last->link = q->link; 
    free(tmp); 
    return; 
 
  while(q->link != last)      //一路循环,向前最多前进到q指向last节点前一个节点退出 
 
    if(q->link->info == num)      
   
      tmp = q->link; 
      q->link = tmp->link; 
      free(tmp); 
      printf("%d deleted\n",num); 
      return; 
   
    q = q->link; 
 
  if(q->link->info == num)        //最后一个节点特殊处理 
 
    tmp = q->link; 
    q->link = last->link; 
    free(tmp); 
    last = q; 
    return; 
 
  printf("Element %d not found\n",num);//实在找不到等值的也就算了 

 
void display()      //显示循环链表的所有节点的值 

  struct node *q; 
  if(last == NULL)       //空表 
 
    printf("List is empty\n"); 
    return; 
 
  q = last->link; 
  printf("List is :\n"); 
  while(q != last)     //从首节点开始循环 
 
    printf("%d ", q->info); 
    q = q->link; 
 
  printf("%d\n",last->info);   //输出完了首节点后输出last节点,结束了 
}

/////////////////////////////////////////////////////////////////////////////////////////////////

int main(void) 

  int choice,n,m,po,i;
  last=NULL;

  while(1)
  {
    printf("1.Create List\n"); 
    printf("2.Add at begining\n"); 
    printf("3.Add after \n"); 
    printf("4.Delete\n"); 
    printf("5.Display\n"); 
    printf("6.Quit\n"); 
    printf("Enter your choice : "); 
    scanf("%d",&choice);
 
    switch(choice) 
   
     case 1: 
      printf("How many nodes you want : "); 
      scanf("%d",&n);

      for(i=0; i < n;i++) 
     
        printf("Enter the element : "); 
        scanf("%d",&m); 
        create_list(m); 
     
      break;

     case 2: 
      printf("Enter the element : "); 
      scanf("%d",&m); 
      addatbeg(m); 
      break; 

     case 3: 
      printf("Enter the element : "); 
      scanf("%d",&m); 
      printf("Enter the position after which this element is inserted : "); 
      scanf("%d",&po); 
      addafter(m,po); 
      break; 

     case 4: 
      if(last == NULL) 
     
        printf("List underflow\n"); 
        continue; 
     
      printf("Enter the number for deletion : "); 
      scanf("%d",&m); 
      del(m); 
      break; 

     case 5: 
      display(); 
      break; 

     case 6: 
      exit(0); 
     default: 
      printf("Wrong choice\n"); 
   
 
  return 0; 
}

/////////////////////////////////////////////////////////////////////////////////////////////////

附录

1、参考:http://www.nowamagic.net/librarys/veda/detail/2198

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有