线性表的链式存储的插入与删除操作

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Dear_Jia/article/details/78731950
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
	ElemType data;//存储数据元素的数据域
	struct LNode *next;//指向下一个节点的指针域 
}LNode,*LinkList;//为结构体重命名且定义一个指向结构体变量的指针
void CreatList_L(LinkList &L,int n)//逆序输入n个元素的值,建立带头结点的单链表L
{
	LNode *p;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;//先建立一个头结点
	for(int i=n;i>0;i--)
	{
		p=(LinkList)malloc(sizeof(LNode));//生成新结点
		scanf("%d",&p->data);//输入元素值
		p->next=L->next;
		L->next=p;//插入到表头 
	} 
 } 
Status GetElem_L(LinkList L,int i,ElemType &e)//用e返回表中第i的元素的值,L为单链表的头指针
{
	LNode *p;int j; 
	p=L->next;//初始化,p指向第一个结点
	j=1;//j为计数器
	while(p&&j<i)//顺指针向后查找,直到p指向第i个元素或p为空
	{
		p=p->next;;
		++j;
	}
	if(!p||j>i) return ERROR;//第i个元素不存在
	e=p->data;//取第i个元素
	return OK; 
}
Status ListInsert_L(LinkList &L,int i,ElemType e)//在带头结点的单链表中的第i个位置之前插入一个元素e
{
	LNode *p=L,*s;int j=0;
	while(p&&j<i-1)
	{
		p=p->next;
		j++;
	}//寻找第i-1个结点
	if(!p||j>i-1) return ERROR;//i小于1或者大于表长加1
	s=(LinkList)malloc(sizeof(LNode));//生成新结点
	s->data=e;
	s->next=p->next;
	p->next=s;//插入L中 
	return OK; 
} 
Status ListDelete_L(LinkList &L,int i,ElemType &e)//删除第i个结点,并用e返回其值
{
	LNode *p=L,*q;int j=0;
	while(p->next&&j<i-1)
	{
		p=p->next;
		j++;
	}//寻找第i个结点,并令p指向其前驱 
	if(!(p->next)||j>i-1) return ERROR;//删除位置不合理
	q=p->next;p->next=q->next;
	e=p->data;free(q);//删除并释放结点
	return OK; 
}
void print(LinkList L,int n)
{
	LNode *p=L;
	for(int i=0;i<n;i++)
	{
		printf("%d ",p->next->data);
		p=p->next;
	}
	printf("\n");
}
int L_length(LinkList L)
{
	int length=0;
	LNode *p=L;
	while(p->next)
	{
		length++;
		p=p->next;
	}
	return length;
}
int main()
{
	int n;
	ElemType e;
	LinkList L;
	scanf("%d",&n);
	printf("建立一个长度为%d的单链表,输入单链表中的元素:\n",n);
	CreatList_L(L,n);
	printf("输出插入元素后单链表的值:\n");
	print(L,L_length(L));
	printf("在单链表的第3个元素之前插入81:\n");
	ListInsert_L(L,3,81);
	print(L,L_length(L));
	ListDelete_L(L,4,e);
	printf("删除单链表的第4个元素后单链表为:\n");
	print(L,L_length(L));
	return 0;
 } 

展开阅读全文

没有更多推荐了,返回首页