线性表的链式(链表)表示与实现----单向链表

本例为纯C语言实现,所用编译器为C编译器,非C++编译器 
线性表的链式(链表)表示与实现 
单向链表 

 

//	本例为纯C语言实现,所用编译器为C编译器,非C++编译器 
//	线性表的链式(链表)表示与实现 
//	单向链表 

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

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

LinkList createLinkListNode( LinkList L, int n );
int getLinkListElem( LinkList L, int i, int* e ); 
int insertLinkListNode( LinkList L, int i, int e ); 
int deleteLinkListNode( LinkList L, int i, int* e); 
LinkList mergeLinkList(LinkList La, LinkList Lb, LinkList Lc); 

int main(){
	int ee;
	int* e = &ee; 
	LinkList La,Lb,Lc,p;
	printf("请输入链表La各元素的值: \n");  
	if(La=createLinkListNode(La,3)){ 
		getLinkListElem(La,2,e); 
		printf("第2个元素为: %d\n",*e); 
	}
	printf("\n"); 
	
	if(insertLinkListNode(La,2,22)){
		p = La->next;
		printf("插入第2个元素后的链表La为: \n"); 
		while(p){
			printf("%d ",p->data);
			p = p->next; 
		} 
		printf("\n"); 
	}
	printf("\n"); 
	
	if(deleteLinkListNode(La,2,e)){
		printf("第2个元素为: %d\n",*e); 
		p = La->next;
		printf("删除第2个元素后的链表La为: \n"); 
		while(p){
			printf("%d ",p->data);
			p = p->next; 
		} 
		printf("\n"); 
		deleteLinkListNode(La,5,e); 
	} 
	printf("\n"); 
	
	printf("请输入链表Lb各元素的值: \n"); 
	Lb = createLinkListNode(Lb,4);
	if(Lb){
		p = Lb->next;
		printf("链表Lb为: \n"); 
		while(p){
			printf("%d ",p->data);
			p = p->next; 
		} 
		printf("\n");
	}
	Lc = mergeLinkList(La, Lb, Lc);
	p = Lc->next;
	printf("La和Lb合并后的链表Lc为: \n"); 
	while(p){
		printf("%d ",p->data);
		p = p->next; 
	} 
	printf("\n"); 
	
	return 0;
}

LinkList createLinkListNode( LinkList L, int n ){
	//	顺序输入n个元素的值, 建立带表头节点的线性表L
	//	节点创建成功返回线性表L的地址, 失败返回NULL 
	int i; 
	LinkList p,q; 
	//	创建头结点 
	L = (LinkList)malloc(sizeof(LNode));
	if(!L){
		printf("创建头结点失败!\n"); 
		return NULL; 
	} 
	L->next = NULL; 
	//	输入n个元素的值
	q = L; 
	for( i=1; i<=n; i++ ){
		p = (LinkList)malloc(sizeof(LNode));	//	建立一个新的节点
		if(!p){
			printf("创建新节点失败!\n"); 
			return NULL;   
		}
		printf("请输入第%d个元素的值: \n",i); 
		scanf("%d",&p->data);	//	输入元素的值 
		/*	逆序输入建立链表 
		p->next = L->next;
		L->next = p;
		*/
		//	顺序输入建立链表 
		p->next = q->next;
		q->next = p;
		q = p;	
	} 
	
	return L; 
}

int getLinkListElem( LinkList L, int i, int* e ){
	//	获取链表中第i个元素的值
	int j=1;	//	while循环所用 
	LinkList p;
	p = L->next; 	//	指针p指向第一个节点
	while(p && j<i){
		p = p->next;
		j++; 
	} 
	if( !p || j>i ){ 
		printf("第%d个元素不存在!\n", i); 
		return 0; 
	} 
	*e = p->data;	//	将第i个元素赋值给指针e所指向的地址 
	
	return 1;
}

int insertLinkListNode( LinkList L, int i, int e ){
	//	在带头结点的链表的第i个结点之前插入元素e 
	int j=1; 
	LinkList s,p;
	p = L; 
	while( p && j<i ){ 
		p = p->next;
		j++; 
	}
	if( !p || j>i ){ 
		printf("插入结点位置错误!\n"); 
		return 0; 
	} 
	s = (LinkList)malloc( sizeof(LNode) ); 
	if( !s ){
		printf("插入结点时创建新节点失败!\n");
		return 0; 
	} 
	s->data = e;
	s->next = p->next; 
	p->next = s; 
	
	return 1; 
} 

int deleteLinkListNode( LinkList L, int i, int* e){
	//	在带头结点的链表中删除第i个元素, 将其赋值给e所指向的地址 
	int j=1;
	LinkList q,p = L;
	while( p->next && j<i ){
		p = p->next;
		j++;
	} 
	if( !(p->next) || j>i ){
		printf("未找到第%d个结点!\n",i); 
		return 0; 
	} 
	q = p->next; 
	*e = q->data; 
	p->next = p->next->next;
	free(q); 
	 
	return 1; 
} 

LinkList mergeLinkList(LinkList La, LinkList Lb, LinkList Lc){
	//	链表La和Lb皆为非递减排列 
	//	按非递减排列合并链表La和Lb, 得到新的线性表Lc
	LinkList pa,pb,pc;
	pa = La->next;	 
	pb = Lb->next;
	pc = Lc = La;
	//	合并链表 
	while( pa && pb ){
		if( pa->data<pb->data ){
			pc->next = pa;
			pa = pa->next;
			pc = pc->next; 
		}
		else{
			pc->next = pb;
			pb = pb->next;
			pc = pc->next; 
		} 
	}
	pc->next = pa?pa:pb;
	free(Lb);
	return Lc; 
} 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值