双向链表基本操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

双向链表

输入一个双向链表,显示些双向链表并对此双向链表排序运行结果:

源程序:

#include

#include

#include

typedef struct Link/*双向链表结构体*/

{

int data;

struct Link *lift;

struct Link *right;

}linkx,*linky;

linky Init();/*建立双向链表*/

void PrLink(linky p);/*输出双向链表*/

linky Sort(linky head);/*对双向链表排序*/

linky Swap(linky head,linky one,linky two);/*任意交换双向链表两个结点的地址*/ void main(void)

{

linky head;

head=Init();

head=Sort(head);

PrLink(head);

}

linky (Init())/*建立链表*/

{

linky p,q,head;

int n=0;

head=p=q=(linky)malloc(sizeof(linkx));

printf("排序前的链表: ");

scanf("%d",&p->data);/*输入数据*/

head->lift=NULL;

n++;

while(n!=10)/*一直输入到规定的数字个数停止*/

{

q=p;

p=(linky)malloc(sizeof(linkx));

scanf("%d",&p->data);/*输入数据*/

q->right=p;

p->lift=q;

n++;

}

p->right=NULL;

return(head);

}

linky Swap(linky head,linky one,linky two)/*任意交换两个结点*/ {linky temp;

if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交换*/ {

if(one->right==two)/*只有两个结点的情况下*/

{

two->right=one;

two->lift=NULL;

one->lift=two;

one->right=NULL;

head=two;

}

else/*有间隔的首尾交换*/

{

one->right->lift=two;

two->lift->right=one;

two->right=one->right;

one->lift=two->lift;

two->lift=one->right=NULL;

head=two;/*尾结点成为头结点*/

}

}

else if(two->right==NULL)/*尾和任意一个交换*/ {

if(one->right==two)/*交换最后两个结点*/ {

one->lift->right=two;

two->lift=one->lift;

two->right=one;

one->lift=two;

one->right=NULL;

}

else/*和前面其他结点交换*/

{

temp=two->lift;

temp->right=one;

one->lift->right=two;

one->right->lift=two;

two->lift=one->lift;

two->right=one->right;

one->lift=temp;

one->right=NULL;

}

}

else if(one->lift==NULL)/*头和任意一个交换*/ {

if(one->right==two)/*交换头两个结点*/

{

two->right->lift=one;

one->right=two->right;

one->lift=two;

two->right=one;

two->lift=NULL;

head=two;

}

else/*头结点和后面其他结点交换*/

{

temp=one->right;

temp->lift=two;

one->lift=two->lift;

one->right=two->right;

two->lift->right=one;

two->right->lift=one;

two->right=temp;

two->lift=NULL;

head=two;/*交换的结点成为头结点*/

}

}

else/*当中的任意两个交换*/

{

if(one->right==two)/*交换连在一起的两个结点*/ {

temp=one->lift;

one->lift->right=two;

one->right->lift=two;

one->lift=two;

one->right=two->right;

two->right->lift=one;

two->right=one;

two->lift=temp;

}

相关文档
最新文档