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

#include <stdlib.h>
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<i && p)
 {
  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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值