线性表链式存储-初始化、插入、删除、查找、读取操作(C语言)

一、单链表抽象数据类型定义:

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

#define  OK     1
#define  ERROR   0

typedef  int  Elemtype;//数据类型重定义 
typedef  int   Status;//状态类型重定义 
typedef struct LNode{
	Elemtype data;   //数据域 
	struct LNode *next;//指针域 
}LNode,*Linklist;

Status LengthList(Linklist *L); //函数声明 

二、单链表的初始化:

/*单链表初始化 ,初始化成功返回1,否则返回0*/ 
Status Init_linklist(Linklist *L)
{
	*L=(Linklist)malloc(sizeof(LNode));//创建头结点 
	if(!(*L))                          //创建失败 
	{
		return ERROR;
	}
	(*L)->next=NULL;                    //将头结点的指针指向为空 
	return OK;
}

三、尾插入构建单链表:

/*创建带头结点的单链表尾插法*/
void Creat_Linklist(Linklist *L,int n)
{
	Linklist p,q;
	int i;
	p = *L;
	for(i=0;i<n;i++)
	{
		printf("请输入链表第%d个元素:",i);
		q=(Linklist)malloc(sizeof(LNode));//创建新的节点 
		scanf("%d",&q->data);
		p->next=q;                      //头结点指针指向新生成的节点 
		p=q;                           //指针指向链尾 
	}
	p->next=NULL;                     //链尾节点的指针指向为空 
}

四、单链表的插入:

/*带头结点的单链表插入,在i个位置前插入e,若成功则返回1,若失败则返回0*/
Status Insert_Linklist(Linklist *L,int i,Elemtype e)
{
	int j=1;
	Linklist p,q;
	p = *L;
	if(i<1||!p->next||i>LengthList(L))                       //插入位置不合理 
	{
		return ERROR;
	}
	while(p&&j<i)                     //找到插入点 
	{
		p=p->next;
		j++;
	}
	q=(Linklist)malloc(sizeof(LNode));//创建插入新节点 
	q->data=e;
	q->next=p->next;
	p->next=q;
	return OK;	
}

五、单链表的删除:

/*带头结点的单链表删除,删除第i个元素,并由e返回其值,删除成功则返回1,否则返回0*/
Status Delete_Linklist(Linklist *L,int i,Elemtype *e) 
{
	int j=1;
	Linklist p,q;
	p = *L;
	if(i<1||!p->next||i>LengthList(L))
	{
		return ERROR;
	}
	while(j<i&&p->next)
	{
		p=p->next;
		j++; 
	}
	
	q=p->next;
	*e=q->data;
	p->next=q->next; 
	free(q);
	return OK;
}

六、单链表的按值查找:

/*单链表按值查找*/
Status Locate_Linklist(Linklist *L,Elemtype e)
{
	int i=1;
	Linklist p,q;
	p = (*L)->next;
    while(p->data!=e&&p)
    {
    	p=p->next;
    	i++;
	}
	if(p->data!=e) return -1;
	else return i;
}

七、单链表的按位读取:

/*单链表按序号查找,用e返回该序号元素的值,否则查找失败*/
Status Get_Linklist(Linklist *L,int i,Elemtype *e) 
{
	int j=1;
	Linklist p,q;
	p = *L;
	if(i<1||!p->next||i>LengthList(L)) 
	{
		return ERROR;
	}
	while(j<=i&&p)
	{
		p=p->next;
		j++;
	}
	if(j-1==i) 
	{
		 *e=p->data;
		 return OK;	
	}
	else  return ERROR;
}

八、单链表表长:

/*单链表表长*/
Status LengthList(Linklist *L)
{
	int i=0;
	Linklist p,q;
	p = *L;
	if(p->next==NULL) return ERROR;
	while(p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
}

九、单链表的输出函数:

/*单链表输出函数*/
void Display(Linklist *L) 
{
	LNode *p;
	p=(*L)->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

十、主函数:

int main()
{
	int n,num,e,value;
	Linklist L;
	/*单链表的初始化*/
	value=Init_linklist(&L);
	if(value)
	printf("单链表初始化成功!\n");
	else return ERROR;
	printf("请输入单链表的长度:") ;
	scanf("%d",&n); 
	Creat_Linklist(&L,n);
	printf("单链表中各元素的值为:");
	Display(&L);
	
	/*单链表的插入*/
	printf("\n请输入插入的位置:");
	scanf("%d",&n);
	printf("请输入插入的元素:");
	scanf("%d",&num);
	Insert_Linklist(&L,n,num);
	printf("进行插入操作后\n单链表中各元素的值为:");
	Display(&L);
	
	/*单链表的删除操作*/
	printf("\n\n请输入删除的位置:");
	scanf("%d",&n);
	Delete_Linklist(&L,n,&e);
	printf("被删除元素的值为:%d",e);
	printf("\n进行删除操作后\n单链表中各元素的值为:");
	Display(&L);
	
	/*单链表按值查找*/
	printf("\n\n请输入要查找的值e= ");
	scanf("%d",&num);
	value=Locate_Linklist(&L,num);
	if(value>0) printf("该元素在线性表的位序位:%d",value);
	else printf("\n无该值,查找失败!");
	
	/*单链表按位查找*/
	printf("\n\n请输入要查找的位置:");
	scanf("%d",&n);
	value=Get_Linklist(&L,n,&e);
	if(value) printf("单链表中第%d位的值为%d",n,e);
	else printf("\nerror!") ;
	
	return 0; 	
}

十一、运行效果截图:
在这里插入图片描述

  • 38
    点赞
  • 186
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
线性表链存储结构是由若干个节点组成的链表,每个节点包括一个数据域和一个指针域。数据域存储数据,指针域指向下一个节点。以下是基本操作的实现: ### 1. 初始化 ```c #include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; // 初始化链表 LinkList InitList() { LinkList L = (LinkList) malloc(sizeof(LNode)); if (L == NULL) { printf("初始化失败!\n"); exit(-1); } L->next = NULL; return L; } ``` ### 2. 赋值 ```c // 赋值操作 void ListAssign(LinkList L, int i, int e) { // 找到第i个节点 int j = 1; LNode *p = L->next; while (p != NULL && j < i) { p = p->next; j++; } // 如果第i个节点不存在 if (p == NULL || j > i) { printf("赋值失败:不存在第%d个节点!\n", i); return; } // 赋值 p->data = e; } ``` ### 3. 取值 ```c // 取值操作 int ListGetElem(LinkList L, int i) { // 找到第i个节点 int j = 1; LNode *p = L->next; while (p != NULL && j < i) { p = p->next; j++; } // 如果第i个节点不存在 if (p == NULL || j > i) { printf("取值失败:不存在第%d个节点!\n", i); return -1; } // 返回第i个节点的值 return p->data; } ``` ### 4. 插入 ```c // 插入操作 void ListInsert(LinkList L, int i, int e) { // 找到第i-1个节点 int j = 0; LNode *p = L; while (p != NULL && j < i-1) { p = p->next; j++; } // 如果第i-1个节点不存在 if (p == NULL || j > i-1) { printf("插入失败:不存在第%d个节点!\n", i-1); return; } // 创建新节点并插入 LNode *newNode = (LNode*) malloc(sizeof(LNode)); if (newNode == NULL) { printf("插入失败:内存分配错误!\n"); return; } newNode->data = e; newNode->next = p->next; p->next = newNode; } ``` ### 5. 删除 ```c // 删除操作 void ListDelete(LinkList L, int i) { // 找到第i-1个节点 int j = 0; LNode *p = L; while (p != NULL && j < i-1) { p = p->next; j++; } // 如果第i-1个节点不存在 if (p == NULL || j > i-1) { printf("删除失败:不存在第%d个节点!\n", i-1); return; } // 删除第i个节点 LNode *q = p->next; p->next = q->next; free(q); } ``` ### 6. 归并 ```c // 归并操作 LinkList ListMerge(LinkList La, LinkList Lb) { LNode *pa = La->next; LNode *pb = Lb->next; LNode *pc = La; while (pa != NULL && pb != NULL) { if (pa->data <= pb->data) { pc->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa ? pa : pb; free(Lb); return La; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值