循环单链表
来源:互联网 发布:matlab floyd算法 编辑:程序博客网 时间:2024/05/21 22:53
//函数声明部分:"CirLinkList.h"#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct linknode{ElemType data;struct linknode *next;}node;void judgement_NULL(node * p); //判断动态内存是否开辟成功node * creat_order(); //建立循环链表void insert(node *head, int i, ElemType x); //在i位置上插入一个值为x的结点void delete(node *head, int i); //删除i位置的结点void find(node *head, ElemType x); //寻找只为x的结点位置void length_list(node *head); void output(node * head); //打印整个链表void inits_linklist(node *head); //释放整个链表void sortrank(node *head); //对整个链表进行排序
//函数实现:"CirLinkList.c"#include"CirLinkList.h"void judgement_NULL(node * p) //判断动态内存是否开辟成功,如果失败,程序直接结束{if (p == NULL){perror("out of memory\n");exit(EXIT_FAILURE);}}
node * creat_order() //创建一个循环单链表,以0作为结束标志{printf("请创建循环链表:");node *head, *p, *r;ElemType x;head = (node *)malloc(sizeof(node));judgement_NULL(head);r = head;head->next = NULL;while (1){scanf("%d", &x);if (x != 0){p = (node *)malloc(sizeof(node));judgement_NULL(p);p->data = x;r->next = p; r = p;}elsebreak;}r->next = head; //让最后一个结点的指针域指向头结点printf("创建成功\n");return head;}
void insert(node *head, int i, ElemType x) //在i位置上插入一个元素x{node *p, *r, *q;p = (node *)malloc(sizeof(node));judgement_NULL(p);p->data = x;r = head;while (1) //因为是循环链表,所以输入的位置只要i>1,就一定会有一个位置可以插入
{
if (i<=1) //顺着链表循环,直到i--到1 break;r = r->next;i--;}if (i < 1)printf("没有这个结点\n");else{q = r->next; //从头结点之后开始插入r->next = p;p->next = q;printf("插入成功\n");}}
void delete(node *head, int i) //删除链表中i位置的结点{node *p, *q;p = head;while (1) //循环整个链表,直到i--到1{if (i <= 1)break;p = p->next;i--;}if (i<1)printf("没有该结点\n");else{if (p->next== head) //如果找到要删除的结点是头结点,则跳过删除下一个结点{p = head->next;head->next = p->next;free(p);}else{q = p->next;p->next = q->next;free(q);q = NULL;} printf("删除成功\n");}}
void find(node *head, ElemType x) //查找值为x的元素所在结点位置{head = head->next;node *p;int count = 1;if (head->data == x) //先判断是不是第一个printf("结点位置:1");else{p = head->next;while (p != head){count++;if (p->data == x)break;elsep = p->next;}if (p == head)printf("没有这个结点\n");elseprintf("结点位置:%d\n", count);}}
void length_list(node *head) //求取循环链表的结点个数{int len = 0;if (head->next == NULL){printf("链表为NULL\n");}else{node *p = head->next;while (p != head){len++;p = p->next;}printf("链表长度:%d\n", len);}}
void output(node * head) //打印循环链表
{node *p;if (head == NULL)printf("链表为空\n");else{printf("打印链表:");p = head->next;while (p != head){printf("%d ", p->data);p = p->next;}printf("\n");}}
void inits_linklist(node *head) //初始化链表{node *p,*r;p = head->next;while (p !=head){r = p;p = p->next;free(r);r = NULL;}free(head);head = NULL;printf("初始化成功\n");}
void sortrank(node *head) //对整个链表进行排序{node *p, *r;ElemType tmp;p = head->next;while (p->next != head) //冒泡排序{r = head->next;while (r->next != head){if ((r->data) >(r->next->data)){tmp = r->data;r->data = r->next->data;r->next->data = tmp;}r = r->next;}p = p->next;}printf("排序成功\n");}
//函数测试部分:#include"CirLinkList.h"int main(){printf("******************************************** \n");printf("******************************************** \n");printf("**1.Creat_LinkList 2.Insert_Element** \n");printf("**3.Find 4.Delete_Element** \n");printf("**5.Length_LinkList 6.Output_LinkList**\n");printf("*7.InitsLinkLinst 8.Sortrank **\n");printf("*0.Exit *******************\n\n\n");node *ret = NULL;ElemType x;int i = 0;int n = 0;while (1) //循环起来,直到选择0结束{printf("请选择功能:");scanf("%d", &n);if (n == 0) //当选择功能时,选择0的优先级最高,无条件退出{free(ret);exit(1);}if (n == 1 && ret == NULL) //只有当前没创建链表,而且ret为空时,n==1时,创建链表才有效{ret = creat_order();}else if (n != 1 && ret == NULL)printf("\n链表为NULL,请建立链表\n\n");else if (ret != NULL) //当创建链表之后这些语句才有效{switch (n){case 2: //链表的末尾也可以插入元素printf("请输入要插入的位置和要插入的元素\n"); scanf("%d", &i);scanf("%d", &x);insert(ret,i,x);break;case 3:printf("请输入要查找的元素:");scanf("%d", &x);find(ret,x);break;case 4:printf("请输入要删除的位置:");scanf("%d", &i);delete(ret, i);break;case 5:length_list(ret);break;case 6: //打印链表output(ret);break;case 7:inits_linklist(ret);ret = NULL;break;case 8:sortrank(ret);break;default:printf("选择无效,请重新选择\n");break;} //switch()语句结束}}system("pause");return 0;}
0 0
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表-两个循环单链表连接
- 循环单链表的实现
- 循环单链表的建立
- 循环单链表(circular list)
- 类模版的分离编译
- 我的第五次上机实验之数组分离
- 双向循环单链表
- <模拟> UVA 11292 A-Dragon of Loowater
- 微处理器的实模式和保护模式
- 循环单链表
- nyoj 10 skiing 记忆化搜索
- Android 第一次进入App的时候进入引导页面
- 双向单链表
- Unity Shaders and Effects Cookbook (7-3) 在地形中使用顶点颜色做混合
- MySQL 对于千万级的大表要怎么优化?
- Spring MVC @ModelAttribute
- solr查询语法
- Leetcode 70. Climbing Stairs 爬楼梯 解题报告