链表的相关操作

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode * next;


}node,*pnode,*linklist;
pnode create_list(void);//创建一个链表
void traverse_list(pnode phead);//遍历整个链表
bool is_empty(pnode phead);//判断链表是否为空
bool insert_list(pnode,int,int);//在链表中插入一个值
bool delete_list(pnode,int,int *);//删除一个节点
void sort_list(pnode);//对链表进行排序
int length(pnode);//求链表长度
void ldir_sort(pnode l);  //链式直接插入排序
void simpl_sort(pnode L);
pnode maxdata(pnode L);
void main(void)
{   
int i;
pnode phead;
int pos;//插入和删除的位置
int val;//插入的值,和删除返回的值



while(1)
{

printf("创建链表输入   1  \n");
printf("遍历链表输入   2  \n");
printf("插入值输入     3   \n");
printf("删除值输入     4   \n");
printf("排序输入       5   \n");
printf("直接插入排序   6   \n");
scanf("%d",&i);
if(1==i)
{
      phead=create_list();
}
else if(2==i)
{
        traverse_list(phead);
}
else if(3==i)
{   printf("输入插入的位置\n\n");
   scanf("%d",&pos);
printf("输入插入的值\n\n");
scanf("%d",&val);
        insert_list(phead,pos,val);
printf("当前链表为   ");
        traverse_list(phead);
printf("\n\n");
}
else if(4==i)
{
  printf("输入删除的位置\n\n");
   scanf("%d",&pos);


        delete_list(phead,pos,&val);
printf("当前链表为   \n\n");


        traverse_list(phead);
printf("\n\n");
printf("删除的值为%d  \n\n",val);


}
else if(5==i)
{
   sort_list(phead);
printf("当前链表序列为   \n");
traverse_list(phead);
printf("\n\n");


}
else if(6==i)
{
   simpl_sort(phead);
traverse_list(phead);
 
}
else{
  printf("输入有误\n");
}

}






pnode create_list(void)
{int len ;  //链表长度
int val;  //链表输入值
int i;
pnode phead=(pnode)malloc(sizeof(node));
if(NULL==phead)
{
printf("分配失败");
exit(-1);
}
pnode prear=phead;
prear->next=NULL;
printf("输入要创建表的长度  ");
scanf("%d",&len);
for(i=0;i<len;i++)
{printf("请输入第%d个节点的值\n",i+1);
scanf("%d",&val);
pnode p=(pnode)malloc(sizeof(node));
if(NULL==p)
{
printf("分配失败");
exit(-1);
}


p->data=val;
prear->next=p;
p->next=NULL;
prear=p;
}
return phead;


}




void traverse_list(pnode phead)
{  pnode p=phead->next;




if(NULL==phead)
{
printf("遍历失败\n");
exit(-1);
}
printf("当前链表为   ");
while(p!=NULL)
{
printf("%d   ",p->data);
p=p->next;


}


printf("\n");








}




bool is_empty(pnode phead)
{
  if(NULL==phead->next)
  {
  return true;
  }
  else{
  return false;
  }
}




bool insert_list(pnode phead,int pos,int val)  //插入一个值  输入插入的位置和值
{  pnode p=phead;
   pnode q=(pnode)malloc(sizeof(node));
   q->data=val;
   q->next=NULL;
   int i=0;
  
   
    if(pos<0||pos>length(phead)+1)  //对输入位置值进行合法判断
   {
   printf("输入位置非法\n\n\n");
   return false;
  
   }
  while(i<pos-1)
  {
  p=p->next;
  i++;
  
  }
  q->next=p->next;
  p->next=q;
return true;


}




int length(pnode phead)  //返回链表的长度
{
int i=0;
pnode p=phead->next;
while(p!=NULL)
{
p=p->next;
i++;


}
return i;




}


bool delete_list(pnode phead,int pos,int * val) //删除一个结点  输入删除的位置,并返回删除的值
{  pnode p=phead;
   pnode q=p;
  int i=0;
  if(pos<1||pos>length(phead))
  {


 printf("删除位置不合法");
 return false;
 
  }
 while(i<pos-1)
 {
    p=p->next;
i++;
 }
 q=p->next;
 p->next=p->next->next;
 q->next=NULL;
 *val=q->data;
 free(q);


 return true;
}




void sort_list(pnode phead) //对链表进行排序
{  pnode p,q;
    

int i;
int j=0,k=0;
int temp;//暂存值




printf("升序请输入  1\n");
printf("降序请输入   2\n");
scanf("%d",&i);
  if(1==i)
  {
    for(j=0,p=phead->next;j<length(phead)-1;j++,p=p->next)
{
for(k=j+1,q=p->next;k<length(phead);k++,q=q->next)
{
           if(p->data>q->data)
  {
  temp=p->data;
  p->data=q->data;
  q->data=temp;
  }


}
}
  }
 else if(2==i)
 {
   for(j=0,p=phead->next;j<length(phead)-1;j++,p=p->next)
{
for(k=j+1,q=p->next;k<length(phead);k++,q=q->next)
{
           if(p->data<q->data)
  {
  temp=p->data;
  p->data=q->data;
  q->data=temp;
  }


}
}
 }
 else 
 {
 printf("你输入有误 \n\n");
 
 }
}






void ldir_sort(pnode l)  //链式直接插入排序
{
  pnode p=l->next;
  pnode pre,r=p->next;
  p->next=NULL;  //将第一个有效节点断开  使成为只有一个节点的链表
  p=r;
  while(p!=NULL)
  {
 pre=l;
 r=p->next;  // 保证不断链
  }
  while(pre->next!=NULL&&pre->next->data<p->data)
  {
 pre=pre->next;
 p->next=pre->next;
 pre->next=p;
  }
p=r;
}




void simpl_sort(pnode L)
{
 pnode max;
 pnode l=(pnode)malloc(sizeof(node));
 l->next=L->next;
 L->next=NULL;
 while(l->next!=NULL)
 {
max=maxdata(l);
max->next=L->next;
L->next=max;
 }


}


pnode maxdata(pnode L)
{
 pnode max,pre,p;
 while(L->next!=NULL)
 {
p=L->next;
pre=L;
max=p;
while(p->next!=NULL)
{
if(p->next->data>max->data)
{
pre=p;
max=p->next;
         }
p=p->next;
}
pre->next=max->next;
 }
 return max;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值