版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
运行结果: