单循环链表的基本操作

/*
 * 单循环链表的基本操作
 */
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
  int data;
  struct Node *next;
}Node;

int main()
{
Node *creat();
Node *insert(Node *head);
Node *insert2(Node *head);
Node *del(Node *head);
Node *show(Node *head);
int surface();
  char a;
  Node *pt;

  while(1){
    surface();
    scanf("%c",&a);
    switch(a){
     case '1':{pt=creat();break;}
     case '2':{pt=insert(pt);break;}
     case '3':{pt=insert2(pt);break;}
     case '4':{pt=del(pt);break;}
     case '5':{pt=show(pt);break;}
     case '0':{return;}
    }
  }

}
//创建空链表
Node *creat()
{
   setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区
   Node *head;
   head = (Node*)malloc(sizeof(Node));
   head->next = head;
   printf("链表初始化完成!!任意健继续!");
   getchar();
   return head;

}

//插入节点(尾插法)
Node *insert(Node *head)
{
   Node *p,*q;
   //使q指向最后一个节点
   for(q=head;q->next!=head;q=q->next);

   while(1)
{
   //使指针p指向新开辟节点,并对其数据域赋值
        p = (Node*)malloc(sizeof(Node));

        printf("输入新插入学生成绩");
        scanf("%d",&p->data);

   if(p->data==0){
     break;
      }
   p->next = head;
   q->next = p;
   q = p;

}
  setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区  
  printf("节点插入完成!!任意健继续!");
  getchar();
  return head;
}
//插入节点(头插法)
Node *insert2(Node *head)
{
   Node *p,*q;

       while(1)
       {
        //使指针p指向新开辟节点,并对其数据域赋值
        p = (Node*)malloc(sizeof(Node));

            printf("输入新插入学生成绩");
            scanf("%d",&p->data);

             if(p->data==0){
                    break;
                            }
                p->next = head->next;
                head->next = p;

        }

         setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区  
         printf("节点插入完成!!任意健继续!");
         getchar();
         return head;
}

//删除节点
Node *del(Node *head)
{
   Node *p,*q;
   int a;

   printf("输入要删除的成绩");
   scanf("%d",&a);
   for(p = head;p->next!=NULL;p=p->next){
       //寻找前趋节点
       if(p->next->data==a){
            break;
            }
   }
    if (p->next == NULL) return head;

        q = p->next;
        p->next = p->next->next;
        free(q);


 printf("节点删除完成!!任意健继续!");
 setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区 
 getchar();
 return head;
}
//输出所有节点数据
Node *show(Node *head)
{
   Node *p;

   for(p=head->next;p!=head;p=p->next){
      printf("%4d",p->data);       

   }
   printf("\n按任意健继续!");
   getchar();
   getchar();
   return head;
}
//主界面
int surface()
{
  system("clear");
  printf("**单循环链表的基本操作**\n");
  printf("1.初始化空链表\n");
  printf("2.插入节点(尾插法)\n");
  printf("3.插入节点(头插法)\n");
  printf("4.删除节点\n");
  printf("5.打印所有数据\n");
  printf("0.退出系统\n");
  printf("输入选项:");
}
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环链表是一种特殊的链表,它的最后一个节点指向第一个节点,形成一个环。下面是循环链表基本操作代码,包括创建、插入、删除、遍历等。 ```c #include <stdio.h> #include <stdlib.h> // 定义循环链表结构体 typedef struct node { int data; struct node *next; } Node, *List; // 创建循环链表 List createList() { List head = (List)malloc(sizeof(Node)); head->next = head; // 指向自身,形成一个空的循环链表 return head; } // 插入节点,将新节点插入到链表尾部 void insertNode(List L, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = L; // 新节点的 next 指向头节点 Node *p = L; while (p->next != L) { // 找到最后一个节点 p = p->next; } p->next = newNode; // 将新节点插入到链表尾部 } // 删除节点,删除指定位置上的节点 void deleteNode(List L, int pos) { if (L->next == L) { // 链表为空 printf("链表为空,删除失败!\n"); return; } Node *p = L->next; Node *pre = L; int i = 1; while (p != L && i < pos) { // 找到要删除的节点 pre = p; p = p->next; i++; } if (p == L) { // 没有找到要删除的节点 printf("要删除的节点不存在!\n"); return; } pre->next = p->next; // 删除节点 free(p); } // 遍历链表,输出节点的值 void traverseList(List L) { if (L->next == L) { // 链表为空 printf("链表为空!\n"); return; } Node *p = L->next; while (p != L) { // 输出节点的值 printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { List L = createList(); insertNode(L, 1); insertNode(L, 2); insertNode(L, 3); printf("链表初始值为:"); traverseList(L); deleteNode(L, 2); printf("删除第二个节点后,链表的值为:"); traverseList(L); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值