单链表的基本操作

一、单链表的存储结构

typedef struct Node
{
	ElemType data;
	struct Node* next;
}Node,*LinkList;

说明:LinkList 与Node * 是等价的
例如 LinkList L 意思是 L为单链表的头指针
例如Node *p 意思是 p是指向单链表中节点的指针变量

二、单链表的基本运算

1.初始化单链表

InitList(LinkList *L)
{
	*L=(LinkList)malloc(sizeof(Node));  //建立头结点
	(*L)->next=NULL;                       //建立空的单链表L
}

说明:L是指向单链表头结点的指针
*L相当于主程序中待初始化的头指针变量

2.头插法建立单链表

//用末尾插法建立单链表

 void CreateFromHea(LinkList L)
 {
 Node *s;
 int flag=1;
 char c;
 while(flag)
 {
 	c=getchar(); 
	 if(c!='$')
	 {
	  s=(Node*)malloc(sizeof(Node));
	  s->data=c;
	  s->next=L->next;
	  L->next=s;
     }
     else flag=0;	 
 }
 } 

3.用尾插法建立单链表

//用末尾插法建立单链表

void CreateFromTail(LinkList L)
 {
 Node *r,*s;
 int flag=1;
 r=L;
 while(flag)
 {
 	c=getchar(); 
	 if(c!='$')
	 {
	  s=(Node *)malloc(sizeof(Node));
	  s->data=c;
	  r->next=s;
	  r=s;
     }
     else 
     {
     	flag=0;
     	r->next=NULL;  //将最后一个节点的next链域设成空,表示链表的结束 
	 }
 }
 } 

三、在单链表中查找
1.在单链表L查找第i个节点

Node* Get(LinkList L,int i)
{
	int j;
	Node *p;
	if(i<=0)  return(NULL);
	p=L;j=0;
	while((p->next!=NULL)&&(j<i))
	{
		p=p->next;
		j++;
	}
	if(i==j) return p;
	else return(NULL);
}

2.在单链表中查找 值为key的节点

Node* Locate(LinkList L,ElemType key)
{
	Node *p;
	p=L->next;
	while(p!=NULL)
	if(p->data!=key)
	p=p->next;
	else break;
	return p;
}

3.求单链表的长度操作

 int ListLength(LinkList L)
    {
    	Node *p;
    	p=L->next;
    	j=0;
    	while(p!=NULL)
    	{
    		p=p->next;
    		j++;
    	}
    	return j;
    }

4.单链表的插入操作

void InsList(LinkLit L,int i,ElemType e)
{
	Node *pre,*s;
	int k;
	if(i<=0)  return ERROR;
	pre=L; k=0;
	while(pre!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}//查找i-1个节点 
	if(pre==NULL)
	{
	printf("插入位置不合理");
	return ERROR; 
    }
    s=(Node*)malloc(sizeof(Node));
    s->data=e;
    s->next=pre->next;
    pre->next=s;
    return OK;
}

5.单链表的删除

int DelList(LinkList L,int i,ElemType *e)
{
	Node *pre,*r;
	int k;
	pre=L; k=0;
	while(pre->next!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}//查找第i-1个节点 
	if(pre->next==NULL)
	{
		printf("删除节点位置不合理");
		return ERROR; 
	 } 
	r=pre->next;
	pre->next=r->next;//修改指针,删除节点r 
	*e=r->data;
	free(r);
	return OK;	
}

6.单链表的合并操作

LinkList merge(LinkList LA,LinkList LB)
{
	Node *pa,*pb;
	LinkList LC;
	pa=LA->next;
	pb=LB->next;
	LC=LA;
	LC->next=NULL;
	r=LC;
	while(pa!=NULL&&pb!=NULL)
	{
		if(pa->data=pb->data)
		{r->next=pa;r=pa;pa=pa->next}
		else
		{r-next=pb;r=pb;pb=pb->next}
	 } 
	if(pa)
	r-next=pa;
	else
	r-next=pb;	 
		 free(LB);
	return LC;	 	
}

今日所想:用一年学会说话,却用一辈子学会沉默。
沉默的看这个世界,无论好坏,与世无争。
只愿沉默啊,保持内心的单纯与平静。
纵万般无奈也要不放在眼里,才是内心的安宁。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值