C语言实现链表

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{    
	int data;                   //数据
	struct LNode *next;         //后继节点的指针
}LNode,*LinkList;                   //LinkList是头指针类型,LNode是节点类型
          
void CreateLNode(LinkList *L,int i);        //创建长度为i的链表L
int ListInsert(LinkList *L,int i,int e);    //在位置i上插入e元素
int ListDelete(LinkList *L,int i,int *e);   //在位置i上删除节点并将元素用e传出
int GetElem_LNode(LinkList L,int i,int *e); //获得位置i上的节点用e传出
void MergeList_LNode(LinkList *La,LinkList *Lb,LinkList *Lc); //将La,Lb链表合并用Lc传出

int main()
{    
	LinkList La,Lb,Lc;    
	int num;      //节点储存的数    
	int la,lb,lc;      //链表长度    
	printf("请输入La链表的个数:");    
	scanf("%d",&la);    
	CreateLNode(&La,la);    
	// printf("请输入Lb链表的个数:");    
	// scanf("%d",&lb);    
	// CreateLNode(&Lb,lb);    
	// MergeList_LNode(&La,&Lb,&Lc);            
	printf("La链表中的数为:\n");    
	for (int i = 1; i <= la; i++)    
	{       
		GetElem_LNode(La,i,&num);        
		printf("%d\n",num);    
 	}    
 	// printf("在第三个位置插入3\n");    
	 // ListInsert(&L,3,3);    
	 // for (int i = 1; i <= Len; i++)    
	 // {    
	 //     GetElem_LNode(L,i,&num);    
	 //     printf("%d\n",num);    
	 // }   
	system("pause");    
  	return 0;
  }

void CreateLNode(LinkList *L,int i)   //用尾插法创造一个链表长度为i
{    
	LinkList p,r;                 //p指针用来新增节点,r是尾指针    
	*L=(LinkList)malloc(sizeof(LNode));    
	r=(LinkList)malloc(sizeof(LNode));    
	(*L)->next=NULL;              //初始化头指针
	r=(*L);                       //将尾指针指向头指针
	for (int j = 0; j < i; j++)   
	{          
		p=(LinkList)malloc(sizeof(LNode));  //创建新的节点        
		scanf("%d",&p->data);               //将输入的元素赋值给p->data
		p->next=NULL;                       //令p的后继节点为NULL
		r->next=p;                          //将p节点插入尾部
		r=r->next;                          //尾指针移动到尾部
	} 
}

int ListInsert(LinkList *L,int i,int e)  //再带头节点的线性表L中的第i个位置插入元素e
{    
	LinkList p,s;                               //p指针用来寻找节点位置,s节点用来生成新节点    
	int j=0;    
	p=*L;                                       //p指针指向头节点
	while (p&&j<i-1)                            //p开始寻找i的位置
	{        
		p=p->next;        
		j++;    
	}    
	if (!p||j>i)    
	{        
		return 0;                           //若找不到则返回0    
	}     
	s=(LinkList)malloc(sizeof(LNode));          //生成新的节点
	s->data=e;                                  //将元素e给s节点
	s->next=p->next;                            //让s的后继指针指向p的后记节点
	p->next=s;                                  //将p的后记节点改成s
	return 1;
	}

int ListDelete(LinkList *L,int i,int *e)    //删除第i个元素,并返回值e
{    
	ListDelete p,q;                     //p指针用来寻找位置i前一个元素,q指针用来传出值e         
	int j=0;    
	p=*L;               
	while (p->next&&j<i-1)    
	{        
		p=p->next;        
		j++;    
	}    
	if (!(p->next)||j>i)    
	{        
		return 0;    
	}    
	q=p->next;    
	p->next=p->next->next;    
	*e=q->data;    
	free(q);    
	return 1;
}

int GetElem_LNode(LinkList L,int i,int *e)           //获得位置i上的节点用e传出     
{    
	LinkList p;                //p指针用来寻找
	p=L->next;    
	int j=1;    
	while (p&&j<i)    
	{        
		p=p->next;        
		j++;    
	}    
	if (!p||j<i)    
	{        
		return 0;          //没找到返回0
	}    
	*e=p->data;                //将找到的元素用指针*e传出    
	return 1;                  //找到返回1
}

void MergeList_LNode(LinkList *La,LinkList *Lb,LinkList *Lc)  //将La,Lb链表合并用Lc传出
{    
	LinkList pa,pb,pc;    
	pa=(*La)->next;    
	pb=(*Lb)->next;    
	(*Lc)=pc=(*La);    
	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(*Lb);
}        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值