数据结构——线性表(单链表的增、删、查)

---------单链表---------
逻辑上相邻的数据元素物理存储上不一定相邻,即数据元素离散的分布在存储空间中。元素之间的顺序关系通过指针链接。增删操作只用修改指针即可,不用每次都移动大量的数据元素。 使用链式存储,内存空间利用率大,存储密度低,但每次查找元素都需要从表头开始遍历,失去了随机存取的优点。
★注:为了操作上的方便,通常在链表第一个结点前附加一个头结点,结点内通常不存储任何信息。
-----------定义---------
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode ,*LinkList ;
-------基本操作-------
InitLinkList(&L);//单链表的初始化:带头结点:L->next=NULL; 不带头节点:L=NULL;
Head_CreateLinkList(&L); //头插法创建单链表(常用于元素逆置)
Tail_CreateLinkList(&L);//尾插法
InsertLinkList(&l,i,e);//插入:在位序i出的数据元素后插入数据值为e的数据元素
DeleteLinkList(&L,i);//删除:删除位序i处的结点
GetElement(L,e);//按值查找
LocateElement(L,i)//按位查找
Length(L);//统计长度
Print(L);//输出
---------实现--------

*/
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
	int data;
	struct LNode *next;
} LNode,*LinkList;
bool InitLinkList(LinkList &L) {
	L=(LNode *)malloc(sizeof(LNode));
	L->next=NULL;
	return true;
}
bool  Head_CreateLinkList(LinkList &L) {
	LNode* P;
	int i;
	int e;
	printf("请输入要插入的数据元素个数:");
	scanf("%d",&i);
	printf("请输入要插入的数据:");
	for(int j=0; j<i; j++) {
		scanf("%d",&e);
		P=(LNode *)malloc(sizeof(LNode));
		P->data=e;
		P->next=L->next;
		L->next=P;
	}
	return true;
}
bool  Tail_CreateLinkList(LinkList &L) {
	LNode* P,*r=L;
	int i;
	int e;
	printf("请输入要插入的数据元素个数:");
	scanf("%d",&i);
	printf("请输入要插入的数据:");
	for(int j=0; j<i; j++) {
		scanf("%d",&e);
		P=(LNode *)malloc(sizeof(LNode));
		P->data=e;
		P->next=r->next;
		r->next=P;
		r=P;
	}
	r->next=NULL;
	return true;
}
bool InsertLinkList(LinkList &L) {
	int i,j=0;
	int e;
	printf("你要在第几个位置的元素后插入新的数据元素呢:");
	scanf("%d",&i);
	printf("那你要插入的数据值是多少呢:");
	scanf("%d",&e);
	//查找第i个元素
	LNode *P,*S;
	P=L->next;
	while(P!=NULL&&(++j)!=i) {
		P=P->next;
	}
	//插入
	S=(LNode *)malloc(sizeof(LNode));
	S->data=e;
	S->next=P->next;
	P->next=S;
	return true;
}
bool DeleteLinkList(LinkList &L) {
	int i,j=0;
	printf("你要删除第几个位置的数据元素呢:");
	scanf("%d",&i);
	LNode *P,*S;
	P=L;
	//先找到待删除位置的前一个元素
	while(P->next!=NULL&&(++j)!=i) {
		P=P->next;
	}
	//删除操作
	S=P->next;
	P->next=S->next;
	free(S);
	return true;
}
LNode* GetElement(LinkList L) {
	int k=0;//记录位置
	int e;
	printf("请输入要查找的数据值:");
	scanf("%d",&e);
	LNode *P;
	P=L;
	while(P->next!=NULL&&P->data!=e) {
		k++;
		P=P->next;
	}
	printf("要查找的数据元素在第( %d )个位置上\n",k);
	return P ;
}
LNode* LocateElement(LinkList L) {
	int i,j=0;
	printf("你要查第几个元素值呢:");
	scanf("%d",&i);
	LNode *P;
	P=L->next;
	while(P!=NULL&&(++j)!=i) {
		P=P->next;
	}
	printf("第( %d )个位置上的数据元素值为( %d )",i,P->data);
	return P;

}
LinkList Print(LinkList L) {
	LNode *P;
	P=L->next;
	printf("创建的单链表是: (");
	while(P!=NULL) {
		printf("%4d",P->data);
		P=P->next;
	}
	printf("   )\n");
	return L;
}
int Length(LinkList L) {
	int k=0;
	LNode *P;
	P=L;
	while(P->next!=NULL) {
		P=P->next;
		k++;
	}
	printf("单链表长度是:%4d",k);
	printf("\n");
	return k;
}
int main() {
	LinkList L;//单链表的声明
	InitLinkList(L);
//	Head_CreateLinkList(L);
	Tail_CreateLinkList(L);
	InsertLinkList(L);
	DeleteLinkList(L);
	Print(L);
	Length(L);
	GetElement(L);
	LocateElement(L);
	return 0;
}

运行截图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值