数据结构——链表(头结点循环链表)
来源:互联网 发布:广电网络运维体系建设 编辑:程序博客网 时间:2024/05/17 22:20
头文件:
#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;}
main函数:
#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 0 for (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);#endif Delete_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语言
- 数据结构(四)——单链表 、带头结点的单链表、循环链表 及其实现
- 数据结构(二)——单链表 、带头结点的单链表、循环链表 及其实现
- 数据结构——单链表头指针与头结点
- 数据结构:头结点线性链表
- 顺序表,头结点链表,头指针链表,头结点循环链表
- 笔记6:链表(三种:头指针、头结点、头结点循环)
- 数据结构——单链表的头指针、头结点…
- 数据结构—头指针和头结点分析
- 数据结构-线性表-头指针&头结点
- java中的接口和内部类
- python2.7读取.7z压缩的文件
- PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
- 调用阿里云短信服务
- Jquery Validate 相关参数及常用的自定义验证规则
- 数据结构——链表(头结点循环链表)
- 欢迎使用CSDN-markdown编辑器
- map集合排序
- X Chen笔记---Centos网卡桥接 方法一(按部就班)
- DevPts持续交付系统开启试用阶段
- open函数O_CLOEXEC作用
- Lua和C++交互详细总结
- 桥数据包处理函数——br_handle_frame_finish(七)
- BZOJ1453 WCDface 双面棋盘