链式表的非递减数列合并

/*包括头文件*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
/*宏定义和单链表类型定义*/
#define ListSize 100
typedef int DataType;
typedef struct Node
{
    DataType data;
    struct Node *next;
}ListNode,*LinkList;
void MergeList(LinkList A,LinkList B,LinkList *C);	/*将单链表A和B的元素合并到C中的函数声明*/
void InitList(LinkList *head)
/*将单链表初始化为空。动态生成一个头结点,并将头结点的指

针域置为空。*/
{
	if((*head=(LinkList)malloc(sizeof(ListNode)))

==NULL)		/*为头结点分配一个存储空间*/
		exit(-1);
	(*head)->next=NULL;

/*将单链表的头结点指针域置为空*/
}
int ListEmpty(LinkList head)
/*推断单链表是否为空,就是通过推断头结点的指针域是否为空

*/
{
    if(head->next==NULL)			/*推断

单链表头结点的指针域是否为空*/
        return 1;

/*当单链表为空时,返回1。否则返回0*/
    else
        return 0;
}
ListNode *Get(LinkList head,int i)
/*查找单链表中第i个结点。查找成功返回该结点的指针表示成

功;否则返回NULL表示失败。

*/ { ListNode *p; int j; if(ListEmpty(head)) /*在查找第i个元素之前。 推断链表是否为空*/ return NULL; if(i<1) /*在查找第i个元 素之前。推断该序号是否合法*/ return NULL; j=0; p=head; while(p->next!=NULL&&j<i) { p=p->next; j++; } if(j==i) return p; /*找到第i个结点 ,返回指针p*/ else return NULL ;/*假设没有找到第i个元 素,返回NULL*/ } ListNode *LocateElem(LinkList head,DataType e) /*查找线性表中元素值为e的元素,查找成功将相应元素的结点 指针返回。否则返回NULL表示失败。

*/ { ListNode *p; p=head->next; /*指针p指向第一个结点*/ while(p) { if(p->data!=e) /*找到与e相等的元素,返 回该序号*/ p=p->next; else break; } return p; } int LocatePos(LinkList head,DataType e) /*查找线性表中元素值为e的元素,查找成功将相应元素的序号 返回,否则返回0表示失败。*/ { ListNode *p; int i; if(ListEmpty(head)) /*在查找第i个元 素之前。推断链表是否为空*/ return 0; p=head->next; /*指针p指向第一 个结点*/ i=1; while(p) { if(p->data==e) /*找到与e相等的 元素,返回该序号*/ return i; else { p=p->next; i++; } } if(!p) /*假设 没有找到与e相等的元素,返回0。表示失败*/ return 0; } int InsertList(LinkList head,int i,DataType e) /*在单链表中第i个位置插入一个结点。结点的元素值为e。插入 成功返回1,失败返回0*/ { ListNode *p,*pre; /*定义指向第i个元素的前 驱结点指针pre。指针p指向新生成的结点*/ int j; pre=head; /*指针p指向头结 点*/ j=0; while(pre->next!=NULL&&j<i-1)/*找到第i-1个结点 。即第i个结点的前驱结点*/ { pre=pre->next; j++; } if(!pre) /*假设没找到,说明插入位置错误*/ { printf("插入位置错"); return 0; } /*新生成一个结点,并将e赋值给该结点的数据域*/ if((p=(ListNode*)malloc(sizeof(ListNode)))==NULL) exit(-1); p->data=e; /*插入结点操作*/ p->next=pre->next; pre->next=p; return 1; } int DeleteList(LinkList head,int i,DataType *e) /*删除单链表中的第i个位置的结点。

删除成功返回1,失败返回 0*/ { ListNode *pre,*p; int j; pre=head; j=0; while(pre->next!=NULL&&pre->next->next!=NULL&&j<i-1)/*推断是否找到前驱结点*/ { pre=pre->next; j++; } if(j!=i-1) /*假设没找到要 删除的结点位置,说明删除位置错误*/ { printf("删除位置错误"); return 0; } /*指针p指向单链表中的第i个结点。并将该结点的数据 域值赋值给e*/ p=pre->next; *e=p->data; /*将前驱结点的指针域指向要删除结点的下一个结点, 也就是将p指向的结点与单链表断开*/ pre->next=p->next; free(p); /*释放p指向的结 点*/ return 1; } int ListLength(LinkList head) { ListNode *p; int count=0; p=head; while(p->next!=NULL) { p=p->next; count++; } return count; } void DestroyList(LinkList head) { ListNode *p,*q; p=head; while(p!=NULL) { q=p; p=p->next; free(q); } } void main() { int i; DataType a[]={6,7,9,14,37,45,65,67}; DataType b[]={3,7,11,34,45,89}; LinkList A,B,C; /*声明单链表A和B*/ ListNode *p; InitList(&A); /*初始化单链表A*/ InitList(&B); /*初始化单链表B*/ for(i=1;i<=sizeof(a)/sizeof(a[0]);i++) /*将数组a中元素插入到单链表A中*/ { if(InsertList(A,i,a[i-1])==0) { printf("位置不合法"); return; } } for(i=1;i<=sizeof(b)/sizeof(b[0]);i++) /*将数组b中元素插入单链表B中*/ { if(InsertList(B,i,b[i-1])==0) { printf("位置不合法"); return; } } printf("单链表A中的元素有%d个: ",ListLength(A)); for(i=1;i<=ListLength(A);i++) /*输出单链表A中的每一个元素*/ { p=Get(A,i); /*返回单链表A中的每一个结点的指针*/ if(p) printf("%4d",p->data); /*输出单链表A中的每一个元素*/ } printf(" "); printf("单链表B中的元素有%d个: ",ListLength(B)); for(i=1;i<=ListLength(B);i++) { p=Get(B,i); /*返回单链表B中的每一个每一个结点的指针*/ if(p) printf("%4d",p->data); /*输出单链表B中的每一个元素*/ } printf(" "); MergeList(A,B,&C); /*将单链表A和B中的元素合并到C中*/ printf("将单链表A和B的元素合并到C中后,C中的元素有%d个: ",ListLength(C)); for(i=1;i<=ListLength(C);i++) { p=Get(C,i); /*返回单链表C中每一个结点的指针*/ if(p) printf("%4d",p->data); /*显示输出C中全部元素*/ } printf(" "); getch(); } void MergeList(LinkList A,LinkList B,LinkList *C) /*单链表A和B中的元素非递减排列,将单链表A和B中的元素合并到C中。C中的元素仍依照非递减排列*/ { ListNode *pa,*pb,*pc;/*定义指向单链表A,B,C的指针*/ pa=A->next; pb=B->next; *C=A; /*将单链表A的头结点作为C的头结点*/ (*C)->next=NULL; pc=*C; /*依次将链表A和B中较小的元素存入链表C中*/ while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; /*假设A中的元素小于或等于B中的元素,将A中的元素的结点作为C的结点*/ pc=pa; pa=pa->next; } else { pc->next=pb; /*假设A中的元素大于B中的元素。将B中的元素的结点作为C的结点*/ pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; /*将剩余的结点插入C中*/ free(B); /*释放B的头结点*/ }


原文地址:https://www.cnblogs.com/yangykaifa/p/6719059.html