数据结构--耿国华版(课设2)---单链表的遍历、逆置、排序、合并、插入删除

要求:

1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)
2.编写函数,实现遍历单链表
3.编写函数,实现把单向链表中元素逆置
4.编写函数,建立一个非递减有序单链表
5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。
6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序
7.编写函数,实现在非递减有序链表中删除值为x的结点
8.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法

代码:

#include<stdio.h>
#include<stdlib.h>

#pragma warning(disable:4996)

typedef int ElemType;

typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node, *Linklist;

void Createheadlist(Linklist &L) //建立一个带头结点的单链表
{
	Node *p, *s;
	ElemType x;
	L = (Linklist)malloc(sizeof(Node));    //动态空间申请
	L->next = NULL;
	p = L;
	printf("请输入你的数据元素:>\n");
	scanf("%d", &x);
	while (x != 0)
	{
		s = (Linklist)malloc(sizeof(Node));
		s->data = x;
		s->next = NULL;
		p->next = s;
		p = s;
		scanf("%d", &x);
	}
	printf("带有头节点的单链表建立成功!\n");
	printf("\n");
	printf("\n");
}
void printlist(Linklist L)       //遍历单链表(输出)
{
	Node *p;
	p = L;
	while (p->next != NULL)
	{
		p = p->next;
		printf("%d", p->data);
		printf("\t");
	}
	printf("\n");
}
void reverse(Linklist &L)         //逆置单链表
{
	Node *p, *s;
	p = L->next;
	L->next = NULL;
	while (p) {
		s = p;
		p = p->next;
		s->next = L->next;
		L->next = s;
	}
}
void Insertelement(Linklist &L, ElemType x)   //在非递减有序单链表中插入一个元素使链表仍然有序
{
	Node *p, *s;
	s = (Linklist)malloc(sizeof(Node));
	s->data = x;
	p = L;
	while (p->next && p->next->data <= x)
		p = p->next;
	s->next = p->next;
	p->next = s;
}
void Createundecrease(Linklist &L)     //建立一个非递减有序单链表
{
	ElemType y;
	L = (Linklist)malloc(sizeof(Node));
	L->next = NULL;
	printf("输入以0结束的整型数据:\n");
	scanf("%d", &y);
	while (y) {
		Insertelement(L, y);
		scanf("%d", &y);
	}
}
Linklist combine(Linklist LA, Linklist LB)
//将递增有序的单链表LA和LB合并成一个递增有序的单链表LC
{
	Node *pa, *pb;
	Node *r;
	Linklist LC;
	pa = LA->next;
	pb = LB->next;
	LC = LA;
	LC->next = NULL;
	r = LC;
	while (pa != NULL && pb != NULL)
	{
		if (pa->data <= pb->data)
		{
			r->next = pa;
			r = pa;
			pa = pa->next;
		}
		else
		{
			r->next = pb;
			r = pb;
			pb = pb->next;
		}
	}
	if (pa)                  //若表LA未完,将表LA中后续元素链到新表LC表尾
		r->next = pa;
	else                     //否则将表LB中后续元素链到新表LC表尾
		r->next = pb;
	free(LB);
	return(LC);
}
void Deletelement(Linklist &L, ElemType x)    //在非递减有序链表中删除值为x的结点
{
	Node *p, *q;
	p = L;
	q = L->next;
	while (q && q->data != x) {
		p = q;
		q = q->next;
	}
	if (!q)
		printf("\n not deleted");
	else { p->next = q->next; free(q); }
}
int main()
{
	Linklist L1, L2, L3;
	Node *p;
	L1 = (Node*)malloc(sizeof(Node));
	L1->next = NULL;
	ElemType x;
	int select;
	printf("################################################################################\n");
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("################                  单链表的操作                ##################\n");
	printf("################             1.建立单链表,以0结束            ##################\n");
	printf("################             2.遍历单链表                     ##################\n");
	printf("################             3.把单向链表中元素逆置           ##################\n");
	printf("################             4.建立一个非递减有序单链表       ##################\n");
	printf("################   5.建立两个非递减有序单链表,然后合并成一个非递减链表   ######\n");
	printf("################   6.在非递减有序单链表中插入一个元素仍然有序  #################\n");
	printf("################   7.在非递减有序链表中删除指定的元素          #################\n");
	printf("################             0.退出程序                        #################\n");
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	printf("################################################################################\n");
	while (true) {
		printf("Please Enter your select: >");
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Createheadlist(L1); 
			break;
		case 2:
			printf("你所建立的单链表是:\n");
			printlist(L1); 
			printf("\n");
			break;
		case 3:
			printf("逆置后的单链表为:\n");
			reverse(L1);
			printlist(L1); 
			printf("\n");
			break;
		case 4:
			Createundecrease(L1);
			printlist(L1);
			printf("\n");
			break;
		case 5:
			Createundecrease(L1);
			printf("单链表 A 中元素为:\n");
			p = L1->next;
			while (p != NULL)
			{
				printf("%d", p->data);
				p = p->next;
			}
			printf("\n");
			L2 = (Node*)malloc(sizeof(Node));
			L2->next = NULL;
			Createundecrease(L2);
			printf("单链表 B 中元素为:\n");
			p = L2->next;
			while (p != NULL)
			{
				printf("%d", p->data);
				p = p->next;
			}
			printf("\n");
			L3 = combine(L1, L2);
			printf("单链表 C 中元素为:\n");
			p = L3->next;
			while (p != NULL)
			{
				printf("%d", p->data);
				p = p->next;
			}
			printf("\n");
			break;
		case 6:Createundecrease(L1);
			printlist(L1);
			printf("请输入你想要插入的元素 x :");
			scanf("%d", &x);
			Insertelement(L1, x);
			printlist(L1); 
			printf("\n");
			break;
		case 7:Createundecrease(L1);
			printlist(L1);
			printf("请输入你想要删除的元素 x :");
			scanf("%d", &x);
			Deletelement(L1, x);
			printlist(L1); 
			printf("\n");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:printf("Select error! Please Enter your select again: >"); 
			printf("\n");
			break;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值