数据结构之链表实现增删改查

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>

#define TRUE 1 
#define FALSE 0
#define OK 1 
#define ERROR 0 
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 
#define LISTINCREMENT 10
typedef int Status ;
typedef int ElementType ;

/*
	链表实现的数据结构
	此结构体有两项内容:1.存储值 2.指向下一结点的指针(类型为:LNode)
	LNode 为此结构体的别名,
	*LinkList 表示此结构体类型的指针,这样方面下边使用
*/
typedef struct LNode{
	ElementType data ;
	LNode * next ;
}LNode , *LinkList;


/*-------------创建链表,倒插入-----------------------*/

Status CreateList_ch(LinkList &L,int n){
	int i ;

	//建立带有头结点的单链表
	L = (LinkList)malloc(sizeof(LNode)) ;
	if(!L) exit(OVERFLOW) ;
	L->next = NULL ; //先建立一个带有节点的单链表
	
	for(i=n ;i>0;i--){
		LinkList p=(LinkList) malloc(sizeof(LNode)); //生成新的节点
		scanf("%d",&p->data) ; //输入元素的值
		p->next= L->next ; 
		L->next = p ;
	}
	return OK;
}

/*---------向量表中插入数据------------------------*/
/*
	完成功能:向链表的第i个位置插入e元素
*/
Status Insert_ch(LinkList &L,int i, ElementType e){
	LinkList p =L->next ;
	int j = 0;
	while(p&&j<i-1){ //表示链表不为空且寻找到i-1位置处的指针
		p = p->next ;
		++j ;
	}
	if(!p||j>i-1) return ERROR ;//位置不合法

	LinkList q = (LinkList)malloc(sizeof(LNode)); //创建一个新的节点

	q->data = e ;
	q->next = p->next ;
	p->next = q ;
	
	return OK ;
}

/*------------------删除链表中的指定位置的元素------------------------*/
//并且返回删除元素的值
Status Delete_ch(LinkList &L ,int i,ElementType &e){
	LinkList p =L->next ;
	int j = 0 ;
	while(p&&j<i-1){ //寻找第i个结点,并指向要删除节点的前驱
		p=p->next ;
		++ j ;
	}
	if(!p||j>i-1) return ERROR ;//删除的位置不合法
	LinkList d = p->next ;
	e = d->data ;
	p->next = p->next->next ;//或者使用p->next = d->next 
	free(d);   //释放内存资源
	return OK ;

}

/*---------获取某个位置上的值---------------------*/
Status GetElem(LinkList &L, int i, ElementType &e){

	LinkList p = L->next ; //指向头结点的第一个元素
	int j = 1 ;  
	while(p&&j<i){//当p不为空是,条件j=i时推出循环,p指向获取元素的位置
		p=p->next ;
		++j ;
	}
	if(!p||j>i) return ERROR ; //第i个元素不存在

	e = p->data ;
	return OK ;
}


/*--------------遍历链表--------------------------*/
Status PrintList(LinkList &L){
	LinkList a = L->next ;
	while(a!=NULL){
		printf("%d\t" , a->data);
		a=a->next ;
	}
	return OK ;
}
/*--------------两个有序链表的归并-----------------*/
Status MergeList_ch(LinkList La, LinkList Lb, LinkList &Lc){
	//其中已知La,Lb都是有序的线性表
	LinkList pa = La->next ;
	LinkList pb = Lb->next ;
	LinkList pc = NULL ;
	Lc = pc = La ;//用La的头结点作为Lc的头结点 ,这样能节省一点内存
	
	while(pa&&pb){
		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(pb);
	return OK ;
}

void main(){
	LinkList L ;
	/*---------创建-----------*/
	printf("输入五个数,用空格隔开:\n");
	CreateList_ch(L,5);
	PrintList(L);

    /*---------插入-----------*/
	printf("\n") ;
	Insert_ch(L,3,5) ;
	PrintList(L);
    /*---------删除-----------*/
	printf("\n") ;
	int e ;
	Delete_ch(L,3,e);
	PrintList(L);
	printf("\n") ;
	printf("删除的元素为=%d\n",e);

    /*---------获取i位置上的元素-----------*/
	int d ;
	GetElem(L,1,d);
	printf("获取第一个元素的值为===%d\n",d);

	/*-------------测试归并---------------*/
	LinkList La ,Lb ,Lc;
	CreateList_ch(La,3);
	CreateList_ch(Lb,5);
	MergeList_ch(La,Lb,Lc) ;
	PrintList(Lc);
}
由于水平有限,有错误大家提出来,共同讨论,共同进步
<img src="https://img-blog.csdn.net/20140804163050704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamltb2xhbmdnZTEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值