单链表的操作(1)

(1) 定义单链表结构,并实现单链表的初始化(建空表),头插法建立单链表,尾插法建立单链表,单链表的清空(已有单链表置为空表),单链表的遍历(输出单链表)。
(2)在题目一的基础上实现如下算法:已知线性表中的元素(整数)以值递增有序排列,并以单链表作为存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),注意mink和maxk是给定的两个参数,它们的值为任意整数。
(3)在题目一的基础上实现如下算法:实现单链表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)

#include<stdio.h>
#include<stdlib.h> 
typedef struct node{
 int data;
 struct node * next;
}node,*linklist;
//单链表的初始化
void initlinklist(linklist *h){
 (*h)=(node*)malloc(sizeof(node));
 (*h)->next=NULL;
} 
//创建单链表
//头插法建立单链表
void cretefromhead(linklist h){  
 int e;
 node *s;
 int flag=1;
 printf("输入表中的元素,输入-100结束!\n");
 while(flag){
  scanf("%d",&e);
  if(e==-100)flag=0;
  else{
   s=(node*)malloc(sizeof(node));
   s->data=e;
   s->next=h->next;
   h->next=s;
  }
 }
}
//尾插法建立单链表 
void createfromtail(linklist h){ 
 int e;
 node *s,*p;
 int flag=1;
 p=h;
 printf("输入表中的元素,输入-100结束!\n");
 while (flag){
  scanf("%d",&e);
  if(e==-100)flag=0;
  else
  {
   s=(node*)malloc(sizeof(node));
   s->data=e;
   p->next=s;
   p=s;
  }
 }
 p->next=NULL;
}
//单链表的查找
//按位置查找
linklist getlinkelem(linklist h,int i){
 node *p;
 p=h->next;
 int k=1;
 while(p!=NULL&&k<i){
  p=p->next;
  k++;
 }
 return p;
} 
//按内容查找
linklist locatelinkelem(linklist h,int x,int y){
 node *p;
 p=h->next;
 while((p!=NULL&&p->data<x)||(p!=NULL&&p->data>y))
 p=p->next;
 return p;
}
//统计链表中元素出现的次数
int tongji(linklist h,int x,int y){
 node*p;int i=0;
 p=h->next;
 while(p!=NULL){
 if((p!=NULL&&p->data>x&&p->data<y)){
 i++;}
 p=p->next; 
} return i;
} 
//插入元素
//按位置插入
int insertlinklist(linklist h,int i,int e){
 node *s,*p;
 p= getlinkelem(h,i);
 if(p==NULL){
 printf("这个位置无法插入"); 
 return 0;}
 else{
  s=(node*)malloc(sizeof(node));
  s->data=e;
  s->next=p->next;
  p->next=s;
  return 0;
 }
} 
//删除元素
//按位置删除
int deletelinklist(linklist h,int i){
 node *s,*p;
 p=getlinkelem(h,i);
 if(p==NULL)return 0;
 s=p->next;
 p->next=s->next;
 free(s);
 return 0;
} 
//按内容删除
int deletelinklists(linklist h,int x,int y){ 
 if(h==NULL){
  printf("链表为空");
  return 0; 
 }
 node *p,*q;
 p=h;
 q=p->next;
 while(q!=NULL){
  if(q->data>x&&q->data<y){
   p->next=q->next;
   free(q);
   q=p->next;
  }
  else{
   p=p->next;
   q=q->next;
  }
 }
 if(h!= NULL && h->data>x&&h->data<y)
    {
        q = h;
        h = q->next;
        free(q);
        return 0;
    }
  return 0;
}
//表的遍历
void outputlinklist(linklist h){
 node *p;
 p=h->next;
 printf("H->");
 while(p!=NULL){
  printf("%d->",p->data);
  p=p->next;
 }
 printf("NULL\n");
} 
//表的逆置
void reverselist(linklist h){
 node *p,*q,*x;
 p=h->next;
 h->next=NULL; 
 while(p!=NULL){
  q=p;
  p=p->next;
  q->next=h->next;
  h->next=q; 
 }
 x=h->next;
 if(x==NULL)
 printf("链表为空");
 else
 printf("H->");
 while(x!=NULL){
  printf("%d->",x->data);
  x=x->next;
 } 
 printf("->NULL\n");
}

下面为主函数:

int main(){
 linklist L;
 char q;
 int t,x,y;
 while(q!='0'){
 printf("请选择你要进行的操作:(退出请输入0;清屏请输入s)\n");
 printf("1.定义单链表并遍历                 2.删除单链表中介于x与y之间的值\n");
 printf("3.将单链表逆置  \n");
 printf("请输入要进行的操作:");
 scanf("%s",&q);
 switch(q){
  case '0':break;
  case '1':initlinklist(&L);
  createfromtail(L); 
         outputlinklist(L); break;
  case '2':initlinklist(&L);
  createfromtail(L);
  printf("原单链表为:");
    outputlinklist(L);
    printf("请输入你需要删除的边界大小:");
    scanf("%d %d",&x,&y);
    deletelinklists(L,x,y);
    printf("删除后的单链表为:"); 
    outputlinklist(L);
     break;
     case '3':initlinklist(&L);
  createfromtail(L);
  printf("原单链表为:");
    outputlinklist(L);
    printf("逆置之后的表为:");
      reverselist(L);
    break;
     case 's':system("cls");break;
     default:printf("选择错误,请重新选择!\n");
     break;
 } } 
 return 0;
} 
  • 新手写的,可能不是最优解,但勉强解决了问题,如果感到对你有所帮助,点个赞吧!!!
    祝你幸福!
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值