C语言版本:循环单链表的实现
SClist.h
#ifndef __SCLIST_H__
#define __SCLIST_H__ #include<cstdio>
#include<malloc.h>
#include<assert.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
}Node,*PNode; typedef struct List {
PNode first;
PNode last;
size_t size;
}List; void InitSClist(List *list);//初始化循环单链表
void push_back(List *list, ElemType x);//在循环单链表的末尾插入元素
void push_front(List *list, ElemType x);//在循环单链表的头部插入元素
void show_list(List *list);//打印循环单链表
void pop_back(List *list);//删除循环单链表的最后一个元素
void pop_front(List *list);//删除循环单链表的第一个元素
void insert_val(List *list, ElemType val);//将数据元素插入到循环单链表中(要求此时循环单链表中的数据元素顺序排列)
Node* find(List *list, ElemType x);//查找循环单链表中数据值为x的结点
int length(List *list);//求循环单链表的长度
void delete_val(List *list, ElemType x);//按值删除循环单链表中的某个数据元素
void sort(List *list);//对循环单链表进行排序
void reverse(List *list);//逆置循环单链表
void clear(List *list);//清除循环单链表
void destroy(List *list);//摧毁循环单链表 //优化
Node* _buynode(ElemType x);//创建结点 #endif
SClist.cpp
 #include"SClist.h"
 Node* _buynode(ElemType x) {
     Node *s = (Node*)malloc(sizeof(Node));
     assert(s != NULL);
     s->data = x;
     s->next = NULL;
     return s;
 }
 void InitSClist(List *list) {
     Node *s = (Node*)malloc(sizeof(Node));
     assert(s != NULL);
     list->first = list->last = s;
     list->last->next = list->first;//让链表最后一个结点的指针域指向头结点,从而时链表循环
     list->size = ;
 }
 void push_back(List *list, ElemType x) {
     Node *s = _buynode(x);
     list->last->next = s;
     list->last = s;
 23     list->last->next = list->first;
     list->size++;
 }
 void push_front(List *list, ElemType x) {
     Node *s = _buynode(x);
     s->next = list->first->next;
     list->first->next = s;
 31     if (list->last == list->first)
 32         list->last = s;
     list->size++;
 }
 void show_list(List *list) {
     Node *p = list->first->next;
     while (p != list->first) {
         printf("%d->", p->data);
         p = p->next;
     }
     printf("Nul.\n");
 }
 void pop_back(List *list) {
     if (list->size == ) return;
     Node *p = list->first;
     while (p->next != list->last)
         p = p->next;
     free(list->last);
     list->last = p;
 52     list->last->next = list->first;
     list->size--;
 }
 void pop_front(List *list) {
     if (list->size == ) return;
     Node *p = list->first->next;
     list->first->next = p->next;
 60     if (list->size == 1)
 61         list->last = list->first;
     free(p);
     list->size--;
 }
 void insert_val(List *list, ElemType x) {
     Node *p = list->first;
     while (p->next != list->last && p->next->data < x)
         p = p->next;
     if (p->next == list->last && p->next->data < x)
         push_back(list, x);
     else {
         Node *s = _buynode(x);
         s->next = p->next;
         p->next = s;
         list->size++;
     }
 }
 Node* find(List *list, ElemType key) {
     if (list->size == ) return NULL;
     Node *p = list->first->next;
     while(p != list->first && p->data != key)
         p = p->next;
 85     if (p == list->first)
 86         return NULL;
     return p;
 }
 int length(List *list) {
     return list->size;
 }
 void delete_val(List *list, ElemType x) {
     if (list->size == ) return;
     Node *p = find(list, x);
     if (p == NULL) {
         printf("没有要删除的数据!\n");
         return;
     }
     if (p == list->last)
         pop_back(list);
     else {
         Node *q = p->next;
         p->data = q->data;
         p->next = q->next;
         free(q);
         list->size--;
     }
 }
 void sort(List *list) {
     if (list->size ==  || list->size == ) return;
     Node *s = list->first->next;
     Node *q = s->next;
     list->last->next = NULL;
     list->last = s;
     list->last->next = list->first;
     while (q != NULL) {
         s = q;
         q = q->next;
         Node *p = list->first;
         while (p->next != list->last && p->next->data < s->data)
             p = p->next;
         if (p->next == list->last &&p->next->data < s->data) {
             list->last->next = s;
             list->last = s;
             list->last->next = list->first;
         }
         else {
             s->next = p->next;
             p->next = s;
         }
     }
 }
 void reverse(List *list) {
     if (list->size ==  || list->size == ) return;
     Node *p = list->first->next;
     Node *q = p->next;
     list->last->next = NULL;
     list->last = p;
     list->last->next = list->first;
     while (q != NULL) {
         p = q;
         q = q->next;
         p->next = list->first->next;
         list->first->next = p;
     }
 }
 void clear(List *list) {
     Node *p = list->first->next;
     while (p != list->first) {
         list->first->next = p->next;
         free(p);
         p = list->first->next;
     }
     list->last = list->first;
     list->last->next = list->first;
     list->size = ;
 }
 void destroy(List *list) {
     clear(list);
     free(list->first);
     list->first = list->last = NULL;
 }
main.cpp
 #include"SClist.h"
 void main() {
     List mylist;
     InitSClist(&mylist);
     ElemType item;
     Node *p = NULL;
     int select = ;
     while (select) {
         printf("*******************************************\n");
         printf("*[1]  push_back        [2]  push_front    *\n");
         printf("*[3]  show_list        [4]  pop_back      *\n");
         printf("*[5]  pop_front        [6]  insert_val    *\n");
         printf("*[7]  find             [8]  length        *\n");
         printf("*[9]  delete_val       [10] sort          *\n");
         printf("*[11] reverse          [12] clear         *\n");
         printf("*[13*] destroy         [0]  quit_system   *\n");
         printf("*******************************************\n");
         printf("请选择:>>");
         scanf("%d", &select);
         if (select == ) break;
         switch (select) {
         case :
             printf("请输入要插入的数据(-1结束):>");
             while (scanf("%d", &item), item != -) {
                 push_back(&mylist, item);
             }
             break;
         case :
             printf("请输入要插入的数据(-1结束):>");
             while (scanf("%d", &item), item != -) {
                 push_front(&mylist, item);
             }
             break;
         case :
             show_list(&mylist);
             break;
         case :
             pop_back(&mylist);
             break;
         case :
             pop_front(&mylist);
             break;
         case :
             printf("请输入要插入的数据:>");
             scanf("%d", &item);
             insert_val(&mylist, item);
             break;
         case :
             printf("请输入要查找的数据:>");
             scanf("%d", &item);
             p = find(&mylist, item);
             if (p == NULL)
                 printf("要查找的数据在单链表中不存在!\n");
             break;
         case :
             printf("单链表的长度为%d\n", length(&mylist));
             break;
         case :
             printf("请输入要删除的值:>");
             scanf("%d", &item);
             delete_val(&mylist, item);
             break;
         case :
             sort(&mylist);
             break;
         case :
             reverse(&mylist);
             break;
         case :
             clear(&mylist);
             break;
             //case 13:
             //destroy(&mylist);
             //break;
         default:
             printf("选择错误,请重新选择!\n");
             break;
         }
     }
     destroy(&mylist);
 }
C语言版本:循环单链表的实现的更多相关文章
- C语言版本:单链表的实现(优化版本)
		
未优化版本:http://www.cnblogs.com/duwenxing/p/7569376.html slist.h #ifndef __SLIST_H__ #define __SLIST_H_ ...
 - C语言版本:单链表的实现
		
slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...
 - c语言实现循环单链表
		
//初始化 Node*InitList() { Node*head=(Node*)malloc(sizeof(Node)); head->next=NULL; head->data=-1; ...
 - c语言循环单链表
		
/************************************************************************* > File Name: singleLin ...
 - c语言有头循环单链表
		
/************************************************************************* > File Name: singleLin ...
 - 带头结点的循环单链表----------C语言
		
/***************************************************** Author:Simon_Kly Version:0.1 Date: 20170520 D ...
 - 循环单链表定义初始化及创建(C语言)
		
#include <stdio.h> #include <stdlib.h> /** * 含头节点循环单链表定义,初始化 及创建 */ #define OK 1; #defin ...
 - C代码实现非循环单链表
		
C代码实现非循环单链表, 直接上代码. # include <stdio.h> # include <stdlib.h> # include <malloc.h> ...
 - 简单约瑟夫环的循环单链表实现(C++)
		
刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...
 
随机推荐
- postMessage 消息传递
			
点击查看demo 前言 web开发了,除了前台与服务器交换数据,还有可能前台页面间需要进行数据传递,比如窗口间,页面和嵌套的iframe间.这些问题之前都有解决办法,但是现在html5引入的messa ...
 - uwsgi+django  配置
			
uwsgi+django 创建新的虚拟环境,且解决crm的环境依赖 在虚拟环境下安装uwsgi pip3 install uwsgi 学习uwsgi命令,如何启动python应用 启动python w ...
 - JS 点击元素发ajax请求 打开一个新窗口
			
JS 点击元素发ajax请求 打开一个新窗口 经常在项目中会碰到这样的需求,点击某个元素后,需要发ajax请求,请求成功以后,开发需要把链接传给前端(或者说请求成功后打开新窗口),前端需要通过新窗口打 ...
 - 【转】阿里云Ubuntu系统搭建SVN服务器
			
##SVN服务器相关软件安装 1.使用SSH远程服务器 (1)对于MAC OS/Liunx的用户直接打开终端输入 ssh 用户名@实例名,例如 ssh root@192.168.1.100 执行上面 ...
 - HDU1599(Floyd最小环)
			
Floyd最小环理解+模板: https://www.cnblogs.com/DF-yimeng/p/8858184.html 除了上述博文里写的,我再补充几点我的理解. 1.为什么先枚举ij求经过i ...
 - chrome调试如何禁用浏览器缓存
			
0.写在前面的话 遇到过很多很多次,修改了页面代码,但是程序始终没有按照设想的方向走,有时候折腾了几个小时,发现问题最后却是莫名其妙恢复的.后来进一步调试发现,自己已经修改了如js代码,但是前端在载入 ...
 - strstr(),strchr()
			
strstr($a, $b)和strchr()一样,起的别名,表示查找$a中第一次出现$b,并返回字符串的剩余部分: .strrchr()从后往前查第一个出现的 直接写两行代码: <?php $ ...
 - 【H5】复制粘贴
			
源文案地址 使用案例 案例1:复制分享链接 function copyTextToClipboard(text) { var textArea = document.createElement(&qu ...
 - Redis Twemproxy
			
主从复制+哨兵解决了读性能和高可用问题,但没有解决写性能问题. Twemproxy将写请求分配到不同节点处理. Twemproxy是Twitter开源的一个redis和memcache代理服务器. 允 ...
 - 大数据入门第二十二天——spark(二)RDD算子(1)
			
一.RDD概述 1.什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的 ...