单链表的操作(2)

(1)在单链表数据结构上实现如下算法:已知一个元素值递增有序的单链表L(允许出现值重复的结点),设计算法删除值重复的结点。
(2) 在单链表数据结构上实现如下算法:已知一个带头结点的单链表,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第K个位置上的结点(K为正整数)。若查找到,算法输出该结点的data域的值,并返回。
(3) 在单链表数据结构上实现如下算法:假设有两个元素值递增有序排列的线性表A和B,均以单链表存储,请编写算法,将A,B两个表归并为一个按元素值递减有序排列的线性表单链表C,要求利用原表(即A,B表)的结点空间。
(4) 在单链表数据结构上实现如下算法:编写算法,删除单链表L(L中元素值各不相同)的最大值所对应的结点,并返回改值。

#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;
}
//统计单链表的元素个数
int countlinklist(linklist h){
 int i=0;
 node *p;
 p=h->next;
 if(p==NULL){
  printf("链表为空"); 
 }
 else
 while(p!=NULL){
  i++;
  p=p->next;
 }
 return i;
} 
//查找表中元素最大值,返回这个值
int searchmax(linklist h){
 int max;
 node *p;
 p=h->next;
 max=p->data;
 while(p!=NULL){
  if(p->data>max){
   max=p->data;
  }
  p=p->next;
 }
 return max;
} 
//按位置查找倒数第i个节点 
linklist getlinkelem(linklist h,int i){
 node *p;
 p=h->next;
 int k=1;
 int n=countlinklist(h);
 while(p!=NULL&&k<n-i+1){
  p=p->next;
  k++;
 }
 return p;
} 
//连接两个单链表
void addlinklist(linklist h,linklist f){
 node *p;
 p=h->next;
 while(p->next!=NULL){
 p=p->next;
 }
 p->next=f->next;
  free(f);
}
//删除表中最大值元素
 int deletelinklistmax(linklist h){ 
 int k=searchmax(h);
 node *p,*q;
 p=h;
 q=p->next;
 while(q!=NULL){
  if(q->data==k){
   p->next=q->next;
   free(q);
   q=p->next;
  }
  else{
   p=p->next;
   q=q->next;
  }
 }
  return 0;
}
//删除表中重复元素
void deleterepeat(linklist h){
 node *p,*q,*r;
 p=h->next;
 while(p!=NULL){
  q=p;
  while(q->next!=NULL){
   if(q->next->data==p->data){
    r=q->next;
    q->next=r->next;
    free(r);
   }
   else
   q=q->next;
  }
  p=p->next;
 }
} 
//表的遍历
void outputlinklist(linklist h){
 node *p;
 p=h->next;
 printf("H->");
 while(p!=NULL){
  printf("%d->",p->data);
  p=p->next;
 }
 printf("NULL\n");
} 
int main(){
 linklist L,H;
 char q;
 node *p; int j;
 while(q!='0'){
 printf("请选择你要进行的操作:(退出请输入0;清屏请输入s)\n");
 printf("1.删除链表中重复的元素:                 2.查找倒数第k个位置上的节点\n");
 printf("3.将La,Lb两个链表连接成Lc               4.删除单链表中的最大值\n");
 printf("请输入要进行的操作:");
 scanf("%s",&q);
 switch(q){
  case '0':break;
  case '1':
  initlinklist(&L);
  createfromtail(L);
  printf("创建的L链表为:"); 
  outputlinklist(L);
  deleterepeat(L);
  printf("删除重复的元素后表为:");
   outputlinklist(L); break;
  case '2':
  initlinklist(&L);
  createfromtail(L);
  printf("创建的链表为:"); 
  outputlinklist(L);
  printf("请输入你要查找的倒数第k个节点: ");
  scanf("%d",&j); 
    p=getlinkelem(L,j);
    printf("该节点data域的值为:%d\n",p->data);
   break;
     case '3':
  initlinklist(&L);
  createfromtail(L);
  printf("创建的L链表为:"); 
  outputlinklist(L);
  initlinklist(&H);
  createfromtail(H);
  printf("创建的H链表为:"); 
  outputlinklist(H);
  printf("连接之后为:");
   addlinklist(L,H);
   outputlinklist(L);
    break;
  case '4':
  initlinklist(&L);
  createfromtail(L);
  printf("创建的L链表为:"); 
  outputlinklist(L);
  deletelinklistmax(L);
  printf("删除最大值后的表为:");
  outputlinklist(L); 
  break; 
     case 's':system("cls");break;
     default:printf("选择错误,请重新选择!\n");
     break;
 } } 
 return 0;     
}
  • 新手写的,可能不是最优解,但勉强解决了问题,如果感到对你有所帮助,点个赞吧!!!
    祝你幸福!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值