循环链表C程序
来源:互联网 发布:网络数据分析 编辑:程序博客网 时间:2024/06/05 07:00
main.c文件
include <stdio.h>#include "headNode.h"int main(){// 创建链表,空链表Node *head = Create_List();if (head == NULL)return -1;int i;for (i = 0; i < 20; i++){Insert_Head(head, i);}for (i = 0; i < 20; i++){;//Insert_Last(head, i);}// 错误1:空表的情况下插入节点//Insert_Pos(head, 0, 2); // 正确:空表的情况下在第一个节点处插入//Insert_Pos(head, 1, 2); // 错误2:空表的情况下在非第一个节点处插入//Insert_Pos(head, 2, 2); // 正确:在最后一个节点后面插入//Insert_Pos(head, 2, 2); // 错误3:越界//Insert_Pos(head, 5, 2); //Insert_Pos(head, 11, 200); DisPlay_List(head);//Reverse_List(head);//Delete_Data(head, 11);//Delete_Pos(head, 1);if (Find_Element(head, 300) == OK)printf ("有\n");elseprintf ("没有\n");printf ("%d\n", Get_Element(head, 5));printf ("len = %d\n", Get_Len(head));DisPlay_List(head);return 0;}headNode.c文件
#include "headNode.h"#include <stdlib.h>#include <stdio.h>// 创建链表,所谓创建链表,就是创建一个头结点Node* Create_List(){Node* head = (Node*)malloc(sizeof(Node)/sizeof(char));if (head == NULL)return NULL;// 空表head->next = head; return head;}int Insert_Head(Node* head, ElementType data){if (head == NULL)return ERROR;Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL){return ERROR;}node->data = data;node->next = head->next; // 让新结点指向当前的第一个结点head->next = node; // node变成了当前的第一个结点return OK;}int Insert_Last(Node* head, ElementType data){if (head == NULL){return ERROR;}Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL){return ERROR;}node->data = data;node->next = head;// 找到next为空的结点Node *tmp = head;while(tmp->next != head){tmp = tmp->next;}tmp->next = node;return OK;}int Insert_Pos(Node* head, int pos, ElementType data){if (head == NULL || pos < 1){printf ("参数有误\n");return ERROR;}Node *tmp = head;int k = 0;while (tmp != head && k < pos -1){tmp = tmp->next;k++;}if (tmp == head) // 越界{printf ("插入位置越界\n");return ERROR;}Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL){return ERROR;}node->data = data;node->next = tmp->next;tmp->next = node;return OK;}int Reverse_List(Node *head){// head->next == head 空表// head->next->next == NULL 只有一个结点if (head == NULL || head->next == head || head->next->next == head){return OK;}Node *p = head->next->next; // 第二个结点 Node *q = head->next; // 第一个结点Node *temp;while (p != head){temp = p->next;p->next = q;q = p;p = temp;}// 把第一个节点的下一个节点置为空head->next->next = head;// 重置头节点的next head->next = q;return OK;}int Delete_Data(Node* head, ElementType data){if (head == NULL){return ERROR;}Node *tmp = head;while(tmp->next != head){if (tmp->next->data == data)break;tmp = tmp->next;}if (tmp->next != head) // 找到了存data结点的前一个结点{Node *p = tmp->next;tmp->next = p->next;free(p);}return OK;}int Delete_Pos(Node* head, int pos){if (head == NULL || pos < 1){printf ("参数有误\n");return ERROR;}Node *tmp = head;int k = 0;while (tmp != head && k < pos -1){tmp = tmp->next;k++;}if (tmp == head || tmp->next == head) // 越界{printf ("删除位置越界\n");return ERROR;}Node *p = tmp->next;tmp->next = p->next;free(p);return OK;}int Find_Element(Node* head, ElementType data){if (head == NULL){return ERROR;}Node *tmp = head->next;while(tmp != head){if (tmp->data == data)break;tmp = tmp->next;}if (tmp == head)return ERROR;return OK;}ElementType Get_Element(Node* head, int pos){if (head == NULL || pos < 1){printf ("参数有误\n");return ERROR;}Node *tmp = head->next;int k = 1;while (tmp != head && k < pos){tmp = tmp->next;k++;}if (tmp == head){return ERROR;}return tmp->data;}int Get_Len(Node * head){if (head == NULL)return ERROR;int count = 0;Node *tmp = head->next;while (tmp != head){count++;tmp = tmp->next;}return count;}void DisPlay_List(Node* head){Node *tmp = head->next;int count = 0;while(tmp != head){//count++ % 4 == 0 && putchar('\n');if (count++ % 4 == 0)putchar('\n');printf ("%8d", tmp->data);tmp = tmp->next;}putchar('\n');}int Clean_List(Node * head){if (head == NULL)return ERROR;Node *tmp = head;while (tmp->next != head){Delete_Pos(head, 1);}return OK;}int Destroy(Node *head){Clean_List(head);free(head); // 释放头节点return OK;}
headNode.h文件
#ifndef __HEADNODE_H__#define __HEADNODE_H__#define OK 0#define ERROR -1typedef int ElementType;// 链表的节点typedef struct _Node{ElementType data; // 链表节点数据 : 数据域struct _Node *next; // 链表节点的指针 : 指针域}Node;// 创建链表Node* Create_List();// 插入数据:头插法int Insert_Head(Node* head, ElementType data);// 插入数据:尾插法int Insert_Last(Node* head, ElementType data);// 在 第 pos 个节点处插入数据 约定:链表没有第0个节点,从第一个节点开始int Insert_Pos(Node* s, int pos, ElementType data);// 逆序int Reverse_List(Node *head);// 链表数据打印void DisPlay_List(Node* head);// 删除指定数据int Delete_Data(Node*, ElementType data);//删除 第 pos 个结点int Delete_Pos(Node*, int pos);// 查找元素:查看顺序表中是否有对应的元素,有返回元素的索引int Find_Element(Node* s, ElementType data);// 获取顺序表中的元素:通过下标获取ElementType Get_Element(Node* s, int pos);int Get_Len(Node * head);int Clean_List(Node * head);// 销毁顺序表int Destroy(Node *);#endif // __HEADNODE_H__
阅读全文
0 0
- 循环链表C程序
- 双向循环链表程序(C语言版)
- 数据结构 循环链表 C语言程序实现
- 循环链表 c
- C语言程序 循环结构
- list-c循环链表
- C语言循环链表
- C循环链表详解
- 循环链表实现的一个程序
- 数据结构循环队列的实现c程序
- 单向循环链表C/C++版
- 数据结构C#——循环链表
- C实现的循环链表排序
- C语言数据结构----循环链表
- C语言实现双向循环链表
- Linux-C学习笔记-循环链表
- C语言中的双向循环链表
- c实现逆转单向循环链表
- 新闻资讯类的数据表
- Curator分布式锁注意事项
- 内网和外网的区别
- 数据的预处理
- 软件开发项目最困难的是什么,我们该怎么办
- 循环链表C程序
- 从零开始学--Java搭建 Spring MVC 框架
- easyUI textbox填坑
- PHP设计模式——简单工厂
- $http请求之options
- Windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式
- 线程基础
- MFC添加窗体菜单
- 对表的一些操作