单链表的基本操作

要求:

1.  定义单链表的存储结构;
2.  单链表的基本操作
(1)初始化单链表(无参和有参);
(2)求单链表长度;
(3)按位置查找;
(4)按值查找;
(5)在位置i插入一个数据元素;
(6)删除位置i的数据元素;
(7)遍历单链表;
(8)合并链表
(9)销毁单链表

代码:

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode {
	int data;//数据域
	struct Lnode* next;//指针域 
}Lnode, * LinkList;
//链表的初始化 
void initiList(LinkList L) {
	L = (LinkList)malloc(sizeof(LinkList));
	L->next = NULL;
	return;
}

void destroyList(LinkList L) {
	LinkList p;
	while (L) {
		p = L;
		L = L->next;
		free(p);
	}
}
void emptyList(LinkList L) {
	LinkList p, q;
	p = L->next;
	while (p) {
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}
//求表长
int getLength(LinkList L) {
	LinkList p = L->next;
	int count = 0;
	while (p) {
		count++;
		p = p->next;
	}
	return count;
}
//按位置查找
int getIloc(LinkList L, int i) {
	LinkList p = L;
	int k = 0;
	while (k < i && p) {
		k++;
		p = p->next;
	}
	if (!p || i < k)
		return 0;
	else
		return p->data;
}
//按元素查找
int getElem(LinkList L, int e) {
	int count = 0;
	LinkList p = L;
	while (p->data != e && p) {
		p = p->next;
		count++;
	}
	if (!p)
		return 0;
	else
		return count;
}
//按位置插入
int inPut(LinkList L, int i, int e) {
	int k = 0;//k表示到第几个位置 
	LinkList q, p = L;
	while (k < i - 1 && p) {
		k++;
		p = p->next;
	}
	if (!p || k > i - 1) {
		printf("\n插入失败!");
		return 0;
	}
	else {
		q = (LinkList)malloc(sizeof(Lnode));
		q->data = e;
		q->next = p->next;
		p->next = q;
		printf("\n插入成功!");
		return 1;
	}
}
//按值查找
void deIloc(LinkList L, int i, int* e) {
	int cnt = 0;
	LinkList p = L;
	while (p && cnt < i - 1) {
		p = p->next;
		cnt++;
	}
	if (!p || cnt > i - 1) {
		printf("\n删除失败!");
	}
	else {
		LinkList q = p->next;
		p->next = q->next;
		*e = q->data;
		free(q);
		printf("\n删除成功!");
	}
}
void createListH(LinkList L, int n) {
	int i;
	LinkList s;
	for (i = 0; i < n; i++) {
		s = (LinkList)malloc(sizeof(Lnode));
		scanf("%d", &s->data);
		s->next = L->next;
		L->next = s;
	}
}
void createListR(LinkList L, int n) {
	LinkList s, r;
	r = L;
	int i;
	printf("\n请输入%d个整数", n);
	for (i = 0; i < n; i++) {
		s = (LinkList)malloc(sizeof(Lnode));
		scanf("%5d", &s->data);
		s->next = NULL;
		r->next = s;
		r = s;
	}
	printf("\n建立单链表成功!");
}
//显示当前链表
void listPrint(LinkList L) {
	LinkList p;
	p = L->next;
	printf("\n");
	while (p) {
		printf("%5d", p->data);
		p = p->next;
	}
}
LinkList ConnectLinkList(LinkList& L, LinkList& L2) {
	Lnode* head = new Lnode;
	Lnode* p1 = L->next;			//扫描指针p1指向第一个链表
	Lnode* p2 = L2->next;			//扫描指针p2指向第二个链表
	Lnode* pre = head;		//记录前驱结点
	while (p1 != NULL && p2 != NULL) {
		if (p1->data <= p2->data) {            //按降序进行连接
			pre->next = p1;
			p1 = p1->next;
		}
		else {
			pre->next = p2;
			p2 = p2->next;
		}
		pre = pre->next;
	} 
	pre->next = p1 == NULL ? p2 : p1;
	return head;
}

void  MenuLine()
{   /*显示菜单子函数*/
	
	printf("\n =================================================");
	printf("\n|               1——建立                        |");
	printf("\n|               2——插入                        |");
	printf("\n|               3——删除                        |");
	printf("\n|               4——按位置查找                  |");
	printf("\n|               5——按元素值查找                |");
	printf("\n|               6——求表长                      |");
	printf("\n|               7——显示当前链表                |");
	printf("\n|               8——合并两个链表                |");
	printf("\n|               9——合并链表的显示结果          |");
	printf("\n|               0——返回                        |");
	printf("\n =================================================");
	printf("\n请输入菜单号(0-9):");
}
int main() {
	LinkList L;
	L = (LinkList)malloc(sizeof(Lnode));
	initiList(L);

	LinkList L2; 
	L2 = (LinkList)malloc(sizeof(Lnode));
	initiList(L2);

	int c, length, i, e;
	int t;
	printf("===============单链表初始化成功==================!\n");
	char a, ch1 = 'a';
	while (ch1 == 'a') {
		MenuLine();
		scanf("%d", &c);
		switch (c) {
		case 1:
			printf("\n请输入所需链表长度:");
			scanf("%d", &length);
			createListR(L, length);
			listPrint(L);

			break;
		case 2:
			printf("\n请输入您要插入的位置");
			scanf("%d", &i);
			printf("\n请输入您要插入的值");
			scanf("%d", &e);
			//i是位置,e是值
			inPut(L, i, e);
			listPrint(L);

			
			break;
		case 3:
			printf("\n请输入您要删除的位置");
			scanf("%d", &i);
			deIloc(L, i, &t);
			listPrint(L);
			break;
		case 4:
			printf("\n请输入您需要的位置:");
			scanf("%d", &i);
			getIloc(L, i);
			printf("\n第%d位上的值为%d", i, getIloc(L, i));
			break;
		case 5:
			printf("\n请输入您要查找的元素值");
			scanf("%d", &e);
			printf("\n您所查找的元素值%d在第%d位", e, getElem(L, e));
			break;
		case 6:
			printf("\n表长为%d", getLength(L));
			break;
		case 7:
			listPrint(L);
			listPrint(L2);
			ConnectLinkList(L, L2);
			break;
		case 8:
			printf("\n请输入所需链表长度:");
			scanf("%d", &length);
			createListR(L, length);
			listPrint(L);
			printf("\n请输入第二个所需链表长度:");
			scanf("%d", &length);
			createListR(L2, length);
			listPrint(L2);
			break;
		case 9:
			
			LinkList L3;
			L3=ConnectLinkList(L, L2);
			listPrint(L3);
			break;
		case 0:
			ch1 = 'g';
			break;
		default:
			printf("\n输入有误,请重新输入");
			break;
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值