雙連結清單比單連結清單多了一個指針域,即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 ;
}
有錯誤或者遺漏的請指正,謝謝。