数据结构——链表(头结点循环链表)

来源:互联网 发布:广电网络运维体系建设 编辑:程序博客网 时间: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;}