线形表的链表实现(c语言)

#include
typedef int ElemType;
typedef struct LNode
{
 ElemType data;
 struct LNode *next;
}LNode,*LinkList;
void createLinkList(LinkList *L,int n);  //逆向建立单链表
void createLinkListZ(LinkList *L,int n);
void traverseLinkList(LNode L);
int getElem(LNode L,int i,LinkList *e);
int listInsert(LinkList *L,int i,ElemType e);
int listDelete(LinkList *L,int i,ElemType *e);
void mergeLinkList(LinkList *La,LinkList *Lb,LinkList *Lc);

void main()
{
 LinkList L,L1,L3;
 //ElemType e;

 createLinkListZ(&L,5);
 traverseLinkList(*L);
 printf("/n");
 
 createLinkListZ(&L1,5);
 traverseLinkList(*L1);
 mergeLinkList(&L,&L1,&L3);
 traverseLinkList(*L3);
/* listDelete(&L,3,&e);
 traverseLinkList(*L);
 createLinkList(&L,0);
 listInsert(&L,3,3);
 traverseLinkList(*L);
 */
}
void createLinkList(LinkList *L,int n)
{
 LinkList p,q;
 int i; 
 q=(*L)=(LinkList)malloc(sizeof(LNode));
 (*L)->next=NULL;
 for(i=n;i>0;i--)
 {
  p=(LinkList)malloc(sizeof(LNode));
  scanf("%d",&p->data);
  p->next=q->next;
  q->next=p;
 }
}
void createLinkListZ(LinkList *L,int n)
{
 LinkList p,q;
 int i;
 q=(*L)=(LinkList)malloc(sizeof(LNode));
 (*L)->next=NULL;
 for(i=n;i>0;i--)
 {
  p=(LinkList)malloc(sizeof(LNode));
  scanf("%d",&p->data);
  q->next=p;
  q=p;
 }
 q->next=NULL;
 
}
void traverseLinkList(LNode L)
{
 LinkList p;
 int i=0;
 p=L.next;
 while(p)
 {
  printf("%d ",p->data);
  p=p->next;
  i++;
  if(0==i%5)
  {
   printf("/n");
  }
 }
}
int getElem(LNode L,int i,LinkList *e)
{
 LinkList p;
 int j=1;
 p=L.next;
 while(j {
  p=p->next;
  j++;
 }
 if(j>i || !p)
 {
  printf("postion is error!!!/n");
  return 1;
 }
 *e=p;
 return 0;
}
int listInsert(LinkList *L,int i,ElemType e)
{
 LinkList q,p;
 if((*L)==NULL)
 {
  return 2;
 }
 q=(LinkList)malloc(sizeof(LNode));
 q->data=e;
 if(1==i)
 {
  q->next=(*L)->next;
  (*L)->next=q;
 }
 else if(getElem((**L),i-1,&p)==0)
 { 
  q->next=p->next;
  p->next=q;
  return 0;
 }
 return 1;
}
int listDelete(LinkList *L,int i,ElemType *e)
{
 LinkList p,q; 
 if(1==i)
 {
  q=(*L)->next;
  (*L)->next=q->next;
  *e=q->data;
  free(q);
  return 0;
 }
 else if(getElem((**L),i-1,&p)==0)
 {
  q=p->next;
  p->next=q->next;
  *e=q->data;
  free(q);
  return 0;
 }
 return 1;
}
void mergeLinkList(LinkList *La,LinkList *Lb,LinkList *Lc)
{
 LinkList pa,pb,pc;
 pa=(*La)->next;
 pb=(*Lb)->next;
 (*Lc)=pc=(*La);
 while(pa && pb)
 {
  if(pa->data<=pb->data)
  {
   pc->next=pa;
   pc=pa;
   pa=pa->next;
  }
  else
  {
   pc->next=pb;
   pc=pb;
   pb=pb->next;
  }
 }
 pc->next=pa?pa:pb;
 free(*Lb);
}

你可能感兴趣的:(数据结构)