数据结构的基础学习之链表的遍历、查找和删除

 链表的遍历

#include<stdio.h>
#include<stdlib.h>
#define N 5

typedef struct node
{
	int data;
	struct node *next;	
}ElemSN;
ElemSN *Createlink(int a[])
{
	ElemSN *h=NULL,*tail,*p;
	for(int i=0;i<N;i++)
	{
		p=(ElemSN *)malloc(sizeof(ElemSN));
		p->data =a[i];
		p->next = NULL;
		if(!h)
		{
			h=tail=p;
		}
		else
		{
		    tail=tail->next=p;
		}  
	 } 
	 return h;
}
void printlink(ElemSN *h)
{
	ElemSN *p;
	for(p=h;p!=NULL;p=p->next)
	{
		printf("%5d",p->data);
	}
}
ElemSN *Tailnode(ElemSN *h)
{
	ElemSN *p;
	for(p=h;p->next;p=p->next);
	return p;
}
int createnode(ElemSN *h)
{
	int a=0;
	ElemSN *p;
	for(p=h;p;a++,p=p->next);
	return a;
}
int countoddnode(ElemSN *h)
{
	ElemSN *p;
	int odd=0;
	for(p=h;p;p=p->next)
	{
		odd+=p->data %2;
	}
	return odd;
}
ElemSN *maxnode(ElemSN *h)
{
	ElemSN *Pmax,*p;
	Pmax=h;
	for(p=h->next;p;p=p->next)
	{
		if(Pmax->data < p->data)
		Pmax=p;
	}
	return Pmax;
}
void pneprintlink(ElemSN *h)
{
	ElemSN *lend=NULL,*p;
	while(lend-h)
	{
		for(p=h;p->next-lend;p=p->next);
		printf("%5d",p->data);
		lend=p;
	}
}

int main(void)
{
	int a[N] ={3,2,5,8,4};
	int count,countodd;
	ElemSN * head=NULL,*ptail,*pmax,*q;
	//创建单向链表
	head = Createlink(a);
	//输出单向链表
	printlink(head);
	//输出尾结点值
	ptail=Tailnode(head); 
	printf("\n尾结点值为:%d\n",ptail->data);
	//输出结点个数
	count=createnode(head);
	printf("结点个数为:%d\n",count); 
	//输出奇数个数
	countodd=countoddnode(head);
	printf("奇数个数:%d\n",countodd);
	//输出最大值
	pmax=maxnode(head);
	printf("max=%d\n",pmax->data); 
	//逆序输出
	pneprintlink(head); 
}

链表的查找和删除

#include<stdio.h>
#include<stdlib.h>
#define N 6

typedef struct node
{
	int data;
	struct node *next;	
}ElemSN;
ElemSN *Createlink(int a[])
{
	ElemSN *h=NULL,*tail,*p;
	for(int i=0;i<N;i++)
	{
		p=(ElemSN *)malloc(sizeof(ElemSN));
		p->data =a[i];
		p->next = NULL;
		if(!h)
		{
			h=tail=p;
		}
		else
		{
		    tail->next=p;
			tail=p;
		}  
	 } 
	 return h;
}
ElemSN * Delsinglenode(ElemSN*h,int key)
{
	ElemSN *p,*q;
	//查找并删除结点
	for(p=h;p&&p->data-key;q=p,p=p->next);
	{
		if(!p)
		{
			printf("not found!\n");
		}
		else
		{
			if(!(p-h))
			{
				h=h->next;
			}
			else
			q->next=p->next;
			free(p);
			p=NULL;
		}
	 } 
	 return h;
}
void printlink(ElemSN *h)
{
	ElemSN *p;
	for(p=h;p!=NULL;p=p->next)
	{
		printf("%5d",p->data);
	}
}
int main(void)
{
	int a[6] ={3,2,5,8,4,7};
	int key;
	ElemSN * head=NULL,*pkey;
	//创建单向链表
	head = Createlink(a);
	//删除单结点
	printf("输入一个数:");
	scanf("%d",&key);
	head=Delsinglenode(head,key);
	//输出链表 
	printlink(head);
}

比较繁琐,适合基础学习,请谅解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值