链式表的非递减数列合并

/*包含头文件*/
#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个:\n",ListLength(A));
	for(i=1;i<=ListLength(A);i++)	/*输出单链表A中的每个元素*/
	{
		p=Get(A,i);					/*返回单链表A中的每个结点的指针*/
		if(p)
			printf("%4d",p->data);	/*输出单链表A中的每个元素*/
	}
	printf("\n");
	printf("单链表B中的元素有%d个:\n",ListLength(B));
	for(i=1;i<=ListLength(B);i++)
	{
		p=Get(B,i);					/*返回单链表B中的每个每个结点的指针*/
		if(p)
			printf("%4d",p->data);	/*输出单链表B中的每个元素*/
	}
	printf("\n");
	MergeList(A,B,&C);					/*将单链表A和B中的元素合并到C中*/
	printf("将单链表A和B的元素合并到C中后,C中的元素有%d个:\n",ListLength(C));
	for(i=1;i<=ListLength(C);i++)
	{
		p=Get(C,i);					/*返回单链表C中每个结点的指针*/
		if(p)
			printf("%4d",p->data);	/*显示输出C中所有元素*/
	}
	printf("\n");
	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的头结点*/
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 10:45:26

链式表的非递减数列合并的相关文章

顺序表的非递减数列合并

#include<stdio.h> /*包含输入输出头文件*/ #define ListSize 100 typedef int DataType; typedef struct { DataType list[ListSize]; int length; }SeqList; void InitList(SeqList *L) /*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/ { L->length=0; /*把线性表的长度置为0*/ } int ListEmpt

4-3 求链式表的表长 (10分)

本题要求实现一个函数,求链式表的表长. 函数接口定义: int Length( List L ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数Length要返回链式表的长度. 裁判测试程序样例: #include <stdio.h> #include <stdl

pta-数据结构与算法题目集(中文)--4-4 链式表的按序号查找

本题要求实现一个函数,找到并返回链式表的第K个元素. 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数FindKth要返回链式表的第K个元素.如果该元素不存在,则返回ERROR. 裁判

4-4 链式表的按序号查找 (10分)

本题要求实现一个函数,找到并返回链式表的第K个元素. 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数FindKth要返回链式表的第K个元素.如果该元素不存在,则返回ERROR. 裁判

c语言实现数据结构中的链式表

以下是我用c语言实现数据结构中的链式表   #pragma once;    #ifndef _STDLIB_H    #include <stdlib.h>    #endif    #ifndef _ELEMTYPE_H    typedef int ElemType;                                                    #endif        #ifndef _SORTTYPE_H    typedef int SortType;  

数据结构 链式表

数据结构课作业之链式表. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 6 struct Node 7 { 8 char name[30]; 9 char telp[30]; 10 Node * next; 11 }; 12 13 class Stulist 14 { 15 public : 16 Stulist (); 17 ~Stulis

6-3 求链式表的表长

6-3 求链式表的表长(10 分) 本题要求实现一个函数,求链式表的表长. 函数接口定义: int Length( List L ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数Length要返回链式表的长度. 裁判测试程序样例: #include <stdio.h>

6-4 链式表的按序号查找

6-4 链式表的按序号查找(10 分) 本题要求实现一个函数,找到并返回链式表的第K个元素. 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数FindKth要返回链式表的第K个元素.如

6-4 链式表的按序号查找(10 分)

6-4 链式表的按序号查找(10 分) 本题要求实现一个函数,找到并返回链式表的第K个元素. 函数接口定义: ElementType FindKth( List L, int K ); 其中List结构定义如下: typedef struct LNode *PtrToLNode; struct LNode { ElementType Data; PtrToLNode Next; }; typedef PtrToLNode List; L是给定单链表,函数FindKth要返回链式表的第K个元素.如