第二章(4).循环链表

来源:互联网 发布:powershell管理linux 编辑:程序博客网 时间:2024/06/07 04:13

 

#include<stdio.h>
#include<stdlib.h>

//循环链表比一般链表不同的地方就是循环条件是(p != head )

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2

typedef int ElemType;

typedef struct LNode
{
 ElemType data;
 struct LNode *next;
}LNode,*LinkList;

void InitList(LinkList *L,int n)      //利用表头指针
{
 LinkList p;
 int i;
 *L = (LinkList)malloc(sizeof(LNode));

 (*L)->next = *L;            //逆序
 for(i = n; i > 0; --i)
 {
  p = (LinkList)malloc(sizeof(LNode));
  scanf("%d",&p->data);
  p->next = (*L)->next;
  (*L)->next = p;
 }
}

void PrintList(LinkList L)
{
 LinkList p;
 p = L->next;

 while(p != L )
 {
  printf("%d ",p->data);
  p = p->next;
 }
 printf("\n");
}

void Unit(LinkList *La, LinkList Lb)   //链表合并
{
 LinkList pa,pb,qa,qb;
 pa = *La;
 qa = Lb;

 while(pa->next != *La)
 {
  pa = pa->next;
 }   //寻找尾指针,此时pa为尾指针
 while(qa->next != Lb)
 {
  qa = qa->next;
 }   //此时qa为尾指针

 pb = pa->next;
 qb = qa->next;
 pa->next = qb->next;
 qa->next = pb;
}


void InsertList(LinkList *L,int i,ElemType e)   //在第i个元素之前插入此元素
{
 LinkList p,q;
 int j = 0;

 p = (*L);
 while((p->next) != (*L) && j < i-1)
 {
  p = p->next;
  ++j;
 }
 if( (p->next) == (*L) || j > i-1)
 {
  exit(0);
 }
 q = (LinkList)malloc(sizeof(LNode));
 q->data = e;
 q->next = p->next;
 p->next = q;
}

 

int main()
{
 LinkList *La,*Lb;
 int n = 5;

La = NULL;
 Lb = NULL;
 La = (LinkList *)malloc(sizeof(LinkList));
 Lb = (LinkList *)malloc(sizeof(LinkList));

 

 InitList(La,n);
 InitList(Lb,n);
   
 Unit(La,*Lb);

 PrintList(*La);

 InsertList(La,1,112);

 PrintList(*La);
 return 0;
}


0 0