#include
#include
#include
#include
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define NULL 0
typedef int Status;
typedef int ElemType;
int n,i,j;
typedef struct node {
ElemType data;
node *prior,*next;
}*DLinkList;
node *p,*q;
DLinkList head;
void CreateList(int n) {
head = (DLinkList)malloc(sizeof(node));
head->data = 0;
p = head;
for(int i = 0;i < n;i++) {
q = (DLinkList)malloc(sizeof(node));
printf("请输入第%d/%d个数据 : ",i + 1,n);
scanf("%d",&q->data);
p->next = q;
p = q;
q->next = head;
}
}
Status print() {
p = head->next;
while(p != head) {
cout<
p = p->next;
}
cout< return OK; } Status DCprint() { p = head->prior; if(p == head) { cout<<"This is a empty List."< return ERROR; } do { cout< p = p->prior; }while(p != head); cout< return OK; } Status DCLinkList() { q = head; p = head->next; while(p != head) { p->prior = q; q = p; p = p->next; } head->prior = q; return OK; } int main () { cout<<"Please input the n : "; cin>>n; CreateList(n); print(); DCLinkList(); DCprint(); system("pause"); return 0; }
单向链表和双向链表的区别在于:单向链表中,每个节点只有一个指向下一个节点的指针,而双向链表则有两个指针,分别指向上一个和下一个节点。因此,将单向链表改为双向链表是容易做到的,只要在每一个节点添加一个指针就OK了。
示例程序(c++):
node* list( node* head )
{
node *p,*q;
p = head;
q = NULL;
while( p != NULL ) //一边遍历,一边加前向指针
{
q->next = p;
q=p;
p = p->next;
}
return q; //返回双向链表的尾结点
}
已知有一个单向循环链表,其每个结点从根结点找, 找到next, 把自身的地址赋给next所指的结点的prior, 如此一直