数据结构——单链表操作(C语言实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nicht_sehen/article/details/82873500
//单链表node
#include"stdio.h"
#include"stdlib.h" 
typedef struct link_node{
	int info;
	struct link_node *next;
}node;

// 初始化
node *init(node *head)
{
    head = (node *)malloc(sizeof(node));   
    head->next = NULL; 
	return head;   
}


//查找第i个节点
node *search(node *head,int i)
{
	int j=1;
	node *p;
	p=head;
	while(j!=i)
	{
		p=p->next;
		j++;
	}
	return p;
}

 
//输出
void print(node *head)
{
	node *p;
	p=head;
	int i=0;
	while(p)
	{
		printf("%d ",p->info);
		p=p->next;
	}
	printf("\n");
}

//后插(在第i个节点后插入值为x的值)
node *insert_h(node *head, int x, int i)
{
		node *p,*q;
		p=(node*)malloc(sizeof(node));
		p->info=x;
		if(i==1)
		{
			p->next=head;
			head=p;
		}
		else
		{
			q=search(head,i);
			p->next=q->next;
			q->next=p;
		}
		return head;
} 

//创建(尾插) 
/*不能直接调用insert_h,p->next未置空,无法跳出循环 */ 
node *create(node *head)
{
    node *q,*p;
	head=init(head);   
                              
    int x,n;  
	printf("请输入链表长度:");
	scanf("%d",&n); 
	printf("请输入各节点值:");                    
    for(int i=1;i<=n;i++)
    {
    	scanf("%d",&x);
        p = (node *)malloc(sizeof(node));   
        p->info= x; 
		if(i==1)
		{
			head=p;
			p->next=NULL;
			q=head;
		} 
		else
		{
			q->next=p;
			q=p;
		}                   
    }
    q->next = NULL;    
	return head;
}



//前插
node *insert_q(node *head, int x, int i)
{
	node *p,*q;
	p=(node*)malloc(sizeof(node));
	p->info=x;
	if(i==1)
	{
		head=p;
	}
	else
	{
		q=search(head,i-1);
		p->next=q->next;
		q->next=p;
	}
	return head;
	
}

//删除值为x的节点
node *del_x(node *head, int x)
{
	node *q,*p;
	p=head;
	while(p&&p->info!=x)
	{
		q=p;
		p=p->next;
	}
	if(p)
	{
		if(!q) head=head->next;
		else
		{
			q->next=p->next;
			free(p);
		}
	}	
	return head;
}

//删除第i个节点
node *del_i(node *head, int i)
{
	node *q,*p;
	q=search(head,i-1);
	p=search(head,i);
	if(i==1)
		head=head->next;
	else
	{
		q->next=p->next;
		free(p);
	}
	return head;
}

//求节点个数
void count(node *head)
{
	int i=0;
	node *p;
	p=head;
	while(p)
	{
		i++;
		p=p->next;
	}
	printf("节点个数为:%d\n",i);
	
 } 

//判断节点值是否有序
int is_order(node *head)
{
	node *p,*q;
	p=head;
	q=head->next;
	int flag1=1,flag2=1;
	while(q)
	{
		if(p->info<q->info)
			flag1=1;
		else
		{
			flag1=0;
			break; 
		} 
		p=p->next;
		q=q->next;
	}
	p=head;
	q=head->next;
	while(q)
	{
		if(p->info>q->info)
			flag2=1;
		else
		{
			flag2=0;
			break; 
		} 
		p=p->next;
		q=q->next;
	}
	if(flag1==1||flag2==1)
	{
		printf("是有序的\n");
		return 1;
	}
	else
	{
		printf("不为有序的\n");
		return 0;
	}
	
} 

//逆转
node *changeover(node *head)
{
	node *p,*q;
	q=NULL;
	while(head)
	{
		p=head->next;
		head->next=q;
		q=head;
		head=p;
	}
	return q;
}

//主函数 
int main()
{
	node *head,*q,*p,*s,*pp,*qq;
	head = init(head);
	head=create(head); 
	print(head);
	
	printf("请输入要前插的值和位置:");
	int a,b;
	scanf("%d%d",&a,&b);
	head=insert_q(head,a,b); 
	print(head);
	
	printf("请输入要后插的值和位置:");
	int c,d;
	scanf("%d%d",&c,&d); 
	head=insert_h(head,c,d);
	print(head);
	
	printf("请输入查找的第m个节点:"); 
	int m;
	scanf("%d",&m);
	s=search(head,m);
	printf("第%d个节点值为:%d\n",m,s->info);
	
	printf("请输入要删除的节点值:");
	int x;
	scanf("%d",&x);
	p=del_x(head,x);
	print(p);
	
	printf("请输入要删除的节点位置:");
	int i;
	scanf("%d",&i);
	q=del_i(head,i);
	print(q); 
	
	int flag;
	flag=is_order(head);

	printf("逆转:");
	qq=changeover(head);	 
	print(qq);
	
	count(qq);
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Nicht_sehen/article/details/82873500