单循环链表变成双循环链表

以下程序实现把单循环链表变成双循环链表:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#define ElemType char
#define ARRAYSIZE 20

typedef struct LNode
{
	ElemType data[20];
	struct LNode *next,*prior;
}LNode,*LinkList;

int InitList(LinkList &L)//生成单循环链表
{
	int i,j,t,flag,k=0;
	LinkList p=NULL,q=NULL;
	char str[ARRAYSIZE]={NULL};
	L=(LinkList)malloc(sizeof(LNode));L->next=NULL;
	strcpy(L->data,"-1");//链表头结点数据域值为 -1
	srand((unsigned)time(NULL));
	for(i=0;i<9;++i)//逆位序输入 n 个元素的值,建立带头结点的单链表 L
	{		
		k=0;t=rand()%12;
		p=(LinkList)malloc(sizeof(LNode));
		for(j=0;j<3+t;++j)//数据域赋值为随机字符串
		{
			flag=rand()%2;
			if(flag)str[k++]='A'+rand()%26;
			else str[k++]='a'+rand()%26;
		}
		str[k]='\0';//给字符数组加上结束符,使其成为合法的字符串
		strcpy(p->data,str);
		//memset(str,0,sizeof(str));//清空字符串
		p->next=L->next;//采用头插法插入新生成的结点
		L->next=p;
	}
	p=L;
	while(p->next != NULL)//寻找尾结点,找到后使其指向头结点
	{
		p=p->next;
	}
	p->next=L;
	return 1;
}

int Display(LinkList L)//从表头到表尾逐个打印链表中所有结点中的数据
{
	if(L == NULL)
	{
		printf("链表为空!\n");return -1;
	}
	printf("从表头到表尾逐个打印链表中所有结点中的数据:\n");
	LinkList p=L;
	while(p->next != L)
	{
		printf("%s -> ",p->data);
		p=p->next;
	}
	printf("%s",p->data);
	printf("\n");printf("\n");
	return 1;
}

int DoubleLinkList(LinkList &L)//将单循环链表改成双循环链表
{
	LinkList pre,p;
	pre=L;p=pre->next;
	do
	{
		p->prior=pre;
		pre=p;p=p->next;
	}while(pre != L);
	return 1;
}

int ReverseDisplay(LinkList L)//从表尾到表头逐个输出各个结点中的数据域的值
{
	LinkList p=L;
	while(p->next != L)p=p->next;//先使指针 p 指向表尾
	printf("从表尾到表头逐个输出各个结点中的数据域的值:\n");
	while(p != L)
	{
		printf("%s -> ",p->data);p=p->prior;
	}
	printf("%s",p->data);
	printf("\n");printf("\n");
	return 1;
}

int main()
{
	LinkList L;
	InitList(L);
	Display(L);
	DoubleLinkList(L);
	ReverseDisplay(L);
	return 0;
}


 

你可能感兴趣的:(算法,链表,单循环,双循环)