数据结构头结点循环链表
来源:互联网 发布:进口软件 增值税 编辑:程序博客网 时间:2024/05/21 11:35
头结点循环链表
#ifndef __LINKLIST_H__#define __LINKLIST_H__#define FALSE 0#define TRUE 1typedef int LinkData;typedef struct _node{LinkData data;struct _node * next;}Node;// 创建链表Node * Create_List();// 尾插int Insert_Last(Node *h, LinkData data);// 头插int Insert_Head(Node *h, LinkData data);// 在第 pos 个结点处插入数据int Insert_Pos(Node *h, int pos, LinkData data);//删除 第 pos 个结点int Delete_Pos(Node* h, int pos);// 逆序int Reverse_List(Node *head);// 删除指定数据int Delete_Data(Node*, LinkData data);// 查找元素:如果有, 返回元素的位置int Find_Element(Node* h, LinkData data, int *x);// 获取顺序表中的元素:通过位置获取int Get_Element(Node* s, int pos, int *x);int Get_Len(Node * head);// 清空所有结点int Clean_List(Node * head);// 销毁链表int Destroy(Node *);void Display(Node *h);#endif
#include "LinkList.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 *h, LinkData data){if (h == NULL)return FALSE;Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL){return FALSE;}node->data = data;node->next = h->next;h->next = node;return TRUE;}int Insert_Last(Node *h, LinkData data){if (h == NULL)return FALSE;Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL){return FALSE;}node->data = data;node->next = h;Node* tmp = h;while (tmp->next != h){tmp = tmp->next;}tmp->next = node;return TRUE;}int Insert_Pos(Node *h, int pos, LinkData data){if (h == NULL || pos < 1)return FALSE;// 找要插入位置的前一个结点Node *tmp = h;int i;for (i = 0; i < pos-1; i++){if (tmp == h)break;tmp = tmp->next;}if (tmp == h) // 越界{printf("插入位置越界\n");return FALSE;}Node *node = (Node*)malloc(sizeof(Node)/sizeof(char));if (node == NULL){return FALSE;}node->data = data;node->next = tmp->next;tmp->next = node;return TRUE;}int Delete_Pos(Node* h, int pos){if (h == NULL || pos < 1)return FALSE;// 找要插入位置的前一个结点Node *tmp = h;int i;for (i = 0; i < pos-1; i++){if (tmp->next == h)break;tmp = tmp->next;}if (tmp->next == h) // 越界{printf("删除位置越界\n");return FALSE;}Node *p = tmp->next;tmp->next = p->next;free(p);return TRUE;}int Reverse_List(Node *h){// h->next 空表// h->next->next 只有一个结点if (h == NULL || h->next == h || h->next->next == h)return FALSE;Node *pre = h->next;Node *cur = h->next->next;Node *tmp;while (cur == h){tmp = cur->next;cur->next = pre;pre = cur;cur = tmp;}h->next->next = h;h->next = pre;return TRUE;}int Delete_Data(Node* h, LinkData data){if (h == NULL)return FALSE;Node *tmp = h;while (tmp->next != h){if (tmp->next->data == data)break;tmp = tmp->next;}if (tmp->next == h)return FALSE;Node *p = tmp->next;tmp->next = p->next;free(p);return TRUE;}int Find_Element(Node* h, LinkData data, int *x){if (h == NULL)return FALSE;Node *tmp = h->next;int k = 1;while (tmp != h){if (tmp->data == data){*x = k;return TRUE;}k++;tmp = tmp->next;}return FALSE;}int Get_Element(Node* h, int pos, int *x){if (h == NULL || pos < 1)return FALSE;int i;Node *tmp = h;for (i = 0; i < pos; i++){if (tmp == h)break;tmp = tmp->next;}if (tmp == h)return FALSE;else*x = tmp->data;return TRUE;}int Get_Len(Node * h){if (h == NULL)return 0;Node *tmp = h;int count = 0;while (tmp->next != h){count++;tmp = tmp->next;}return count;}int Clean_List(Node * h){if (h == NULL)return FALSE;Node *tmp = h;while (tmp->next != h){Delete_Pos(h, 1);}return 0;}void Display(Node *h){if (h == NULL)return;int count = 0;Node *tmp = h->next;while (tmp != h){if (count++ % 4 == 0)printf ("\n");printf ("%8d", tmp->data);tmp = tmp->next;}printf ("\n");}int Destroy(Node *h){if (h == NULL)return FALSE;Clean_List(h);free(h);return TRUE;}
#include <stdio.h>#include "LinkList.h"int main(){// 创建链表Node* head = Create_List();if (head == NULL){printf("创建链表失败\n");return -1;}int i;for (i = 0; i < 10; i++){Insert_Head(head, i);}#if 0for (i = 0; i < 10; i++){Insert_Head(head, i);}Insert_Pos(head, 5, 1000);Insert_Pos(head, 1, 2000);Insert_Pos(head, 22, 2000);Insert_Pos(head, 24, 2000);Insert_Pos(head, 26, 2000);Delete_Pos (head, 21);Reverse_List(head);#endifDelete_Data(head, 0);int x;Find_Element(head, 7, &x);Get_Element(head, 8, &x);printf ("%d\n", x);printf ("%d\n", Get_Len(head));Display(head);Clean_List(head);printf ("清空后:\n");Display(head);return 0;}
阅读全文
0 0
- 数据结构头结点循环链表
- 数据结构-双向循环链表(无头结点)相关操作
- 数据结构——链表(头结点循环链表)
- 头结点循环链表
- 数据结构头结点链表
- 双向+头结点+循环的链表
- 含有头结点双向循环链表
- 头结点循环链表 C语言
- 数据结构:头结点线性链表
- 顺序表,头结点链表,头指针链表,头结点循环链表
- 数据结构-线性表-头指针&头结点
- 数据结构-线性表-头指针&头结点
- 双向非循环链表(没有头结点)
- 带有头结点的双向循环链表
- (学习java)带有头结点的单向循环链表
- 头结点链表
- 《数据结构》交换双向循环链表的结点p和它的前驱结点
- 数据结构链表结点
- 时间与时间戳的转换
- canvas 绘制动态圆环进度条
- 1.编写第1个Android应用程序实现按钮和复选框
- 如何设置EditText为密码框,并且得到焦点时弹出的是数字键盘
- 编程领域内为什么要有那么多的语言?
- 数据结构头结点循环链表
- Timeline Maker Pro 4.2.39 最新版 中文 汉化版 支持 简 / 繁 windows 系统 最好的时间轴图表制作工具
- SpringMVC默认欢迎页面的问题
- PAT1036.跟奥巴马一起编程
- JDK源码解析之HashSet
- JAVA 扩展(待整理)
- js字符串
- linux命令
- keepalived+nginx实现高可用(二)