数据结构--链式存储的两个有序表合并的纯C语言实现。

#include<stdlib.h>
#include<stdio.h>
typedef int Status;   //Status是函数的类型,其值是函数结果状态代码,如OK等
#define OK 1
#define ERROR 0
 

typedef struct Node{     //定义
  int a;
  struct Node*next;     //这里struct也应该添加.
}Node;
typedef struct Node *LinkList;   //把变LinkList声明为一个指向Node类型的指针
Status InitList(LinkList *L){    //头节点创建
  (*L)=(LinkList)malloc(sizeof(Node)); //L=(LinkList*)malloc(sizeof(Node));为什么不能这样写??保证级别相同?为什么用Node无法识别呢
  if(!(*L)) //地址为空时 存储分配失败 //
        { 
            return ERROR;
        } 
  (*L)->next=NULL;  
  return OK;
}

 Status ListInsert(LinkList*a,int i,int e)
 {//在i-1,i中插入元素,就是在第I个位置插入。
     LinkList p,c;
	 int j=1;                               //注意不是0!!!! 
	 p=*a;
	 c=NULL; //p与p->next都为指针变量,;不能忘记//
	 if(j<0||j>i) ret
	 while(j<i) {p=p->next;j++;} urn ERROR ;  //一次执行完的判断
     c=(LinkList)malloc(sizeof(Node));
	 c->a=e;
     c->next=p->next;      //空指针域的继承与修改
	 p->next=c;
	 return OK;
 }

 Status GetElem(LinkList a,int i,int*e)
 {                               //读取指定位置的节点
	 LinkList p;                 //声明一节点p
	 int j=1 ;                   //j为计数器
	 p=a->next;                  //p指向首元节点。
	 while(j<i){p=p->next;j++;}  //p指向首元节点。
	 if(j<1||j>i) return ERROR;
     *e = p->a;                  //e=&p->a;写法错误当定义的是NODE *p时候??如果加括号呢
	 return OK;
 }
 Status TraverseList(LinkList a)
 {//遍历链表并且输出每个节点
	 
	 Node*p;   //Node*p与LinkList p
	 p=a->next;
	 printf("遍历结果是\n");
	 while(p)
	 {
       printf("%d ",p->a);
	   p=p->next;
	 }
	 printf("\n");
	 return OK;
	 
 }
void MergeList(LinkList*L1,LinkList*L2,LinkList*L3)
 {
	 LinkList pa,pb,pc;
	 pa=NULL; 
	 pb=NULL;
	 pc=NULL;
	 pa=(*L1)->next;
	 pb=(*L2)->next;
	 (*L3)=(*L1);   //
	 pc=(*L3);
	 while(pa&&pb)
	 {
		 if((pa->a)<=(pb->a))
		 {
			 pc->next=pa;
			 pc=pa;        //指针变量pa,pc往前走
			 pa=pa->next;
		 }
		 else
		 {
			 pc->next=pb;
			 pc=pb;        
			 pb=pb->next;
		 }
	 }
	 pc->next=pa?pa:pb;
	 free(*L2);         //释放Lb的头节点
     //TraverseList(*L3);  //TraverseList(pc)也无法实现
    
 }
void main()
{
	LinkList l1,l2,l3;
	int b,e,j;
	j=1;

    InitList(&l1);
	printf("请插入个数\n");
	scanf("%d",&b);
    printf("请输入");
	for(;j<=b;j++)
	{   scanf("%d",&e);
		ListInsert(&l1,j,e);
	}
//	TraverseList(l1);

	InitList(&l2);
	printf("请插入个数\n");
	scanf("%d",&b);
	j=1;
    printf("请输入\n");
	for(;j<=b;j++)
	{   scanf("%d",&e);
		ListInsert(&l2,j,e);
	}
//	TraverseList(l2);
    MergeList(&l1,&l2,&l3);
	TraverseList(l3);
。。。。。。。。。。。。海滩超人。。。。。。。。。。。。

}

哈哈,虽然过程遇到些困难,但是写出来还是挺开心的。注释里的问题,欢迎指正,另外我问答里有顺序实现,没有错误警告但是无法得出结果的代码,欢迎大佬指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值