数据结构头结点循环链表

来源:互联网 发布:进口软件 增值税 编辑:程序博客网 时间: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;}




原创粉丝点击