天天看点

循环链表的基本实现

双链表比单链表多了一个指针域,即next之外加一个front,指向上一个节点。实现一下看看

#include<stdio.h>
#include<stdlib.h>
struct Node;
typedef  struct Node *position;
typedef position List;
struct Node
{
    position Front;
    int Element;
    position Next;
};

List Creat(List l);           //空链表
position Find(int x, List l);           //寻找某个数的节点
void Insert(int x,  List l);   //插入
void DeleteList(List l);
void Swap(List l, position p1, position p2);//p1->Next=p2;交换p1,p2。
int IsEmpty(List l);
int IsEmpty(List l)
{
    return l->Next == NULL;
}
List Creat(List l)
{
    l = (List)malloc(sizeof(struct Node));
    if (l == NULL)
        return NULL;
    l->Front = l;
    l->Next = l;
    l->Element = -;
    return l;
}
void Insert(int x, List l)
{
    position p;
    p = (position)malloc(sizeof(struct Node));
    p->Element = x;
    p->Front = l->Front;
    l->Front->Next = p;
    l->Front = p;
    p->Next = l;
}
position Find(int x, List l)
{
    position p, tmp;
    p = l->Next;
    tmp = l->Front;
    while (p != tmp)
    {
        if (p->Element == x)
            return p;
        else if (tmp->Element == x)
            return tmp;
    }
    if (p->Element == x)
        return p;
    return NULL;
}
void DeleteList(List l)
{
    if (!IsEmpty(l))
    {
        printf("empty list\n");
        return;
    }
    position p, tmp;
    p = l->Next;
    while (p != l)
    {
        tmp = p->Next;
        free(p);
        p = tmp;                 
    }
}
void Swap(List l, position p1, position p2)
{
    position p1f, p2n;
    p2n = p2->Next;
    p1f = p1->Front;

    p1f->Next = p2;
    p2->Front = p1f;
    p2->Next = p1;
    p1->Front = p2;
    p1->Next = p2n;
    p2n->Front = p1;
}
void PrintList(List l)
{
    position p;
    p = l->Next;
    int n = ;
    while (p&&n<)
    {
        printf("%d\n", p->Element);
        p = p->Next;
        n++;
    }
}
           
#include"循环链表.h"
int main()
{
    List l = NULL;
    l = Creat(l);
    position p = l;
    for (int i = ; i < ; i++)
    {
        Insert(i*i, l);
        p = p->Next;
    }
    PrintList(l);
    printf("交换第二个第三个元素\n");
    position p1, p2;
    p1 = l->Next->Next;
    p2 = p1->Next;
    Swap(l, p1, p2);
    PrintList(l);
    DeleteList(l);
    printf("删除链表\n");
    return ;
}
           

有错误或者遗漏的请指正,谢谢。