List and Applications

链表的增删改查及应用

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode* List;
struct LNode {
	int Data;
	List Next;
};
List MakeEmpty()//建立空表
{
	List Ptrl;
	Ptrl = (List)malloc(sizeof(struct LNode));
	Ptrl->Next = NULL;
	return Ptrl;
}
List FindKth(int k, List Ptrl)//按序号查找
{
	List p = Ptrl;
	int i = 1;
	while (p->Next != NULL && i < k) {
		p = p->Next;
		i++;
	}
	if (i == k)return p;
	else return NULL;
}
List Find(int x, List Ptrl)//按值查找
{
	List p = Ptrl;
	while (p != NULL && p->Data != x) {
		p = p->Next;

	}
	return p;
}
List Insert(int x, int i, List Ptrl) {
	List p, s;
	if (i == 1) {
		s = (List)malloc(sizeof(struct LNode));
		s->Data = x;
		s->Next = Ptrl;
		return s;
	}
	p = FindKth(i - 1, Ptrl);
	if (p == NULL) {
		printf("It is wrong!");
		return NULL;
	}
	else {
		s = (List)malloc(sizeof(struct LNode));
		s->Data = x;
		s->Next = p->Next;
		p->Next = s;
		return Ptrl;
	}
}
List Delete(int i, List Ptrl) {
	List p, s;
	if (i == 1) {
		s = Ptrl;
		if (Ptrl != NULL)Ptrl = Ptrl->Next;
		else return NULL;
		free(s);
		return Ptrl;
	}
	p = FindKth(i - 1, Ptrl);
	if (p == NULL) {
		printf("第 % d个结点不存在", i - 1);
		return NULL;
	}
	else if (p->Next == NULL) {
		printf("第 % d个结点不存在", i);
		return NULL;
	}
	else {
		s = p->Next;
		p->Next = s->Next;
		free(s);
		return Ptrl;

	}



}
int main() {
	//freopen("E:/c++/input.txt", "r", stdin);
	//freopen("E:/c++/output.txt", "w", stdout);
	int m;
	int cs = 0;
	while (scanf("%d", &m)) {

	List myList1,myList2,p,q,  myList3;
	int count1 = 1, count2 = 1, n;
	myList3 = (List)malloc(sizeof(struct LNode));/*定义链表头结点,并分配空间*/
	myList3->Next = NULL;
	myList1 = (List)malloc(sizeof(struct LNode));
	myList2 = (List)malloc(sizeof(struct LNode));
	p = (List)malloc(sizeof(struct LNode));
	q = (List)malloc(sizeof(struct LNode));
	myList1->Next = NULL;
	myList2->Next = NULL;
	cs++;
	if (m == -1)break;
	while (m > 0)/*链表1输入数据*/
	{
		int y;
		scanf("%d", &y);
		count1++;
		Insert(y, count1, myList1);
		m--;
	}
	scanf("%d", &n);
	while (n > 0)/*链表2输入数据*/
	{
		int y;
		scanf("%d", &y);
		count2++;
		Insert(y, count2, myList2);
		n--;
	}
	myList1 = myList1->Next;
	myList2 = myList2->Next;
	while (myList1 != NULL && myList2 != NULL)/*将排序好的链表1和2 的数据导入链表3*/
	{
		if (myList1->Data <= myList2->Data)
		{
			p = myList1->Next;

			myList1->Next = myList3->Next;
			myList3->Next = myList1;

			myList1 = p;
		}
		else
		{
			q = myList2->Next;

			myList2->Next = myList3->Next;
			myList3->Next = myList2;

			myList2 = q;
		}
	}
	if (myList1 != NULL)/*如果有链表1或2的数据不为空,将剩下的数据导入链表3中*/
	{
		p = myList1;
		while (p != NULL)
		{
			q = p->Next;
			p->Next = myList3->Next;
			myList3->Next = p;
			p = q;
		}
	}
	if (myList2 != NULL)
	{
		q = myList2;
		while (q != NULL)
		{
			p = q->Next;
			q->Next = myList3->Next;
			myList3->Next = q;
			q = p;
		}
	}
	int i, gcd = 0;

		for (int i = 0; i < count1+count2 - 2; ++i)
			for (p = myList3->Next; p->Next != NULL; p = p->Next) /*对链表3进行排序*/
			{
				if (p->Data > p->Next->Data)
				{
					gcd = p->Data;
					p->Data = p->Next->Data;
					p->Next->Data = gcd;
				}
			}
		p = myList3->Next;

		printf("Case%d:%d\n", cs, count1 + count2  - 2);
		while (p)
		{
			printf("%d", p->Data);
			printf(" ");
			p = p->Next;
		}
		printf("\n");
		cs++;
		free(myList1);
		free(myList2);
		free(myList3);
	}
	//fclose(stdin);//关闭重定向输入
	//fclose(stdout);//关闭重定向输出 
	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值