链表基本操作

使用链表完成增(头插、尾插、任意位置插入)删(头删、尾删、任意位置删除)改、查、去重、翻转、排序、求相邻两个节点最大值、将两个有序链表合并并且合并后的链表有序。

 头文件

/*===============================================
*   文件名称:linklist.h
*   创 建 者:     
*   创建日期:2023年08月09日
*   描    述:
================================================*/
#ifndef LINKLIST_H
#define LINKLIST_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef int data_t;

typedef struct node{
  data_t data;
  struct node *next;
}listnode,*linklist;

linklist list_create();
int list_tail_insert(linklist H);
int list_head_insert(linklist H);
int list_length(linklist H);
int list_insert(linklist H);
int list_show(linklist H);
int list_head_delete(linklist H);
int list_tail_delete(linklist H);
int list_delete(linklist H);
int list_modify(linklist H);
int list_find(linklist H);
int list_reverse(linklist H);
int list_sort(linklist H);
int list_derepeat(linklist H);
int list_max(linklist H);
int list_free(linklist H);


/*
linklist list_get(linklist H,int pos);
int list_free2(linklist L);
linklist list_merge(linklist H1,linklist H2);
*/



#endif

功能函数

/*===============================================
*   文件名称:linklist.c
*   创 建 者:     
*   创建日期:2023年08月09日
*   描    述:
================================================*/
#include "linklist.h"
//创建
linklist list_create(){
    linklist H=(linklist)malloc(sizeof(listnode));
    if(NULL==H){
          printf("create fail\n");
          return NULL;

    }
        H->data=-1;
        H->next=NULL;
       return H;
}
//尾插
int list_tail_insert(linklist H){
     if(NULL == H){
		puts("入参非法!");
		return -1;
	}
      printf("请输入要插入的5个值\n");
           int a=0;
       linklist q=H;
      for(int i=0;i<5;i++){
       linklist New = list_create();
	if(NULL == New){
		puts("创建新节点失败!");
		return -1;
	}
         scanf("%d",&a);
        New->data = a;
        New->next = NULL;
        while(q->next!=NULL){ 
            q=q->next;
        }
           q->next=New;
           q=New;

}

           return 0;
}
//头插
int list_head_insert(linklist H){
    if(NULL == H){
		puts("入参非法!");
		return -1;
	}
      printf("请输入要插入的5个值\n");
           int a=0;
      for(int i=0;i<5;i++){
  	linklist New = list_create();  
	if(NULL == New){
		puts("创建新节点失败!");
		return -1;
	}
         scanf("%d",&a);
        New->data=a;
        New->next=H->next;
       H->next=New;
      }
       return 0;
}

//求长度
int list_length(linklist H){
         if(NULL == H){
        puts("入参非法!");
        return -1;
    }
    int num =0;
    linklist p=H->next;
    while(p!=NULL){
        num++;
        p=p->next;
    }
    printf("len is %d\n",num);
    return num;
}


//去重

int list_derepeat(linklist H){
  if(NULL == H){
        puts("入参非法!");
        return -1;
    }

	if(NULL == H->next){
		puts("链表为空,无数据可去重!");
		return -1;
	}
	if(NULL == H->next->next){
		puts("链表只有一个数据,无需去重");
		return -1;
    }
    linklist p=H->next;
    list_sort(H);
    while((p!=NULL)&&(p->next!=NULL)){
         if(p->data==(p->next->data)){
           p->next=p->next->next;
         }
         else{
          p=p->next;}
    }

    return 0;
}



//查找值

int list_find(linklist H){
   if(NULL==H)return -1;
   int len = list_length(H);
    printf("input numi\n");
    int a;
   scanf("%d",&a);
   linklist q=H->next;
   int pos=0;
   for(int i=0;i<len;i++){
       if((q->data)==a){
        printf("找到了位置是%d\n",i);
        return 0;
       }

     q=q->next;
   }

   if(q->next==NULL){
     printf("未找到\n");

   }
   return 0;
}



int list_modify(linklist H){
   if(NULL==H)return -1;
   int len = list_length(H);
    printf("input modify num\n");
    int a;
   scanf("%d",&a);
   linklist q=H->next;
   int pos=0;
   for(int i=0;i<len;i++){
       if((q->data)==a){
        printf("找到了位置是%d\n",i);
        printf("您想要修改为\n");
        int mo=0;
        scanf("%d",&mo);
        q->data=mo;
        return 0;
       }

     q=q->next;
   }

   if(q->next==NULL){
     printf("未找到\n");

   }
   return 0;
}

/*
//查找地址
linklist list_get(linklist H,int pos){
    if(H==NULL){
   printf("H is NULL\n");
      return NULL;
    }
     if(pos==-1){
        return H
     }
     if(pos<-1){
     printf("pos is invalid\n");
     }

    linklist q=H;
     for(int i=-1;i<pos;i++){
             q=q->next;
             if(q==NULL){
             printf("input error\n");
              return NULL;
             }
     }

         return q;
}
*/
//任意位置插入
int list_insert(linklist H){
       if(NULL==H){
     puts("empty\n");
         return -1; 
    }   
   printf("input local\n");
   int pos;
   scanf("%d",&pos);
    int len=list_length(H);
    
    if((pos<0)||(pos>len-1)){
        printf("%d%d",pos,len);
         printf("input error\n");
         return -1;
     }
       linklist q=H->next;
    for(int i=0;i<pos-1;i++){ 
       q=q->next;
       }
         if(q==NULL){
              return -1;
         }
           linklist New=list_create();
           printf("input num\n");
           int a=0;
         scanf("%d",&a);
             New->data=a;
             New->next=q->next;
             q->next=New;
             return 0;
}

//头删
int list_head_delete(linklist H){
    if(NULL==H){
    printf("empty\n");
     return -1;
    }
     linklist q=H->next;
     H->next=q->next;
     free(q);
     q=NULL;
     return 0;
}


//尾删
int list_tail_delete(linklist H){
  if(NULL==H){                           
     puts("empty\n");                      
         return -1;                        
    }  
  linklist q=H->next;  
    while((q->next->next)!=NULL){
        q=q->next;
    }
    linklist p=q->next;
   q->next=NULL;
     free(p);
     p=NULL;
     return 0;
}  


//删除
int list_delete(linklist H){
    if(NULL==H){
     puts("empty\n");
         return -1; 
    } 
    linklist q=H->next;           
    linklist p;           
    printf("input pos");
    int pos;
    scanf("%d",&pos);
    for(int i=0;i<pos-1;i++){ 
       q=q->next;
       }

    if(NULL==q){
     puts("empty\n");
         return -1;
    }
    if((q->next)==NULL){
    printf("delete pos is invalid\n");
     return -1;
    }
    p=q->next;
    q->next=p->next;
    printf("free:%d\n",p->data);
    free(p);
    p=NULL;
    return 0;
}


//释放 头节点也释放
int list_free(linklist H){
   if(H==NULL){
       return -1;
   }
    linklist q=H; 
     while(H!=NULL){
          q=H; 
         H=H->next;
         free(q);
     }

     puts("");
      return 0;

}
/*
//清空 保留头节点

int list_free2(linklist L){
	if(NULL == *L){
		puts("入参错误,请检查!");
		return -1;
	}
   linklist p=L->next;
   linklist q=p->next;
   while(p!=NULL){
      free(p);
      p=q;
     q=q->next;
   }   
   head->next=NULL;
}
*/
//遍历
int list_show(linklist H){  
    if(NULL==H){
     puts("empty\n");
         return -1;
    }
    if(NULL==(H->next)){
           puts("empty\n");
           return -1;
    }
    linklist q=H->next;
       while(q!=NULL){
          printf("%d",q->data);
            q=q->next;
       }
              puts("");
                return 0;
}

//链表反转
int list_reverse(linklist H){
     if(H==NULL){
     printf("H is NUll\n");
      return -1;
     }
    
   if(H->next==NULL||H->next->next==NULL){
         return 0;//一个节点没必要反转
   }
    linklist p=H->next->next;
    H->next->next=NULL;//将两个链表断开

    linklist q;
     while(p!=NULL){  //为什么不是p->next
     /*    q->next=H->next;        
          H->next=q;
           p=p->next;
           q=p;*/
       q=p;
       p=p->next;

        q->next=H->next;
        H->next=q;

     }  
      /* if(p->next==NULL){
        p->next=H->next;
        H->next=p;
       }
*/

       return 0;
}

//排序
int list_sort(linklist H){
   if(NULL==H){
     puts("empty\n");
         return -1;
    }
     if(NULL==(H->next)){
            puts("empty\n");
            return -1;
     }
     int temp=0;
     
   linklist  p=H->next;
linklist q=p->next;
     int n=list_length(H);
       while(p->next->next!=NULL){
           q=p->next;
              while(q->next!=NULL){
             if((p->data)>(q->data)){
                 temp=p->data;
                 p->data=q->data;
                 q->data=temp;
             }
                 q=q->next;
              }

                p=p->next;
       }

             if((p->data)>(q->data)){
                 temp=p->data;
              p->data=q->data;
                 q->data=temp;
             }


}

//求相邻两节点data值之和为最大的第一节点的指针
int list_max(linklist H){
    linklist p,q,r;
    data_t sum;
    if(H==NULL){
   printf("H is NULL\n");
   return -1;
    }
    if(H->next==NULL||H->next->next==NULL||H->next->next==NULL)
    {
         return -1;
    }
     q=H->next;
     p=H->next->next;
   int max=(q->data)+(p->data);
     while(p->next!=NULL){
          p=p->next;
          q=q->next;
     sum=(q->data)+(p->data);
        if(max<sum){
         max=sum;
         r=q;
        }    
    }
      printf("相邻最大值之和为%d\n",max);

     return max;
}

/*
//链表合并 并且合并后的有序
linklist list_merge(linklist H1,linklist H2){
if(H1==NULL){
   printf("H is NULL\n");
   return NULL;
     }
   p=H1->next;
   q=H2->next;
   H1->next=NULL;
   H2->next=NULL;
   r=H1;
   while((p!=NULL)&&(q!=NULL)){ 
       if((q->data)<=(p->data)){
         r->next=q;
          q=q->next;
         r=r->next;
          r->next=NULL;
       }else{
         r->next=p;
         p=p->next;
         r=r->next;
         r->next=NULL;
   }
     if(p==NULL){
     r->next=q;
     }
     else(q=NULL){
     r->next=p;
     }

      return r;
}
*/

主函数

/*===============================================
*   文件名称:test.c
*   创 建 者:     
*   创建日期:2023年08月09日
*   描    述:
================================================*/
#include "linklist.h"



void menu_print(){
puts("---------------------------");
puts("|1  链表插入   2、链表删除|");
puts("|3、链表查找   4、链表修改|");
puts("|5、链表排序   6、链表去重|");
puts("|7、链表翻转   8、链表退出|");
puts("|9、释放链表10、相邻最大值|");
puts("---------------------------");
}


int main(int argc, char *argv[])
{ 
     linklist L=list_create();
  if(NULL == L){
		puts("创建链表失败!");
		return -1;
	}
  int choose = 0;
	int flag = 0;
	while(1){
		menu_print();
		printf("请选择模式-->");
		scanf("%d",&choose);
		switch(choose){
			case 1:
				printf("请选择插入方式:\n");
				printf("1.头部插入 2.尾部插入 3.任意位置插入-->");
				scanf("%d",&flag);
				if(1 == flag){
					list_head_insert(L);
					list_show(L);
				}else if(2 == flag){
					list_tail_insert(L);
					list_show(L);
				}else if(3 == flag){
					list_insert(L);
					list_show(L);
				}else{
					puts("输入有误!");
				}
				break;
            case 2:
				printf("请选择删除方式:\n");
				printf("1.头部删除 2.尾部删除 3.任意位置删除-->");
				scanf("%d",&flag);
				if(1 == flag){
					list_head_delete(L);
					list_show(L);
				}else if(2 == flag){
					list_tail_delete(L);
					list_show(L);
				}else if(3 == flag){
					list_delete(L);
					list_show(L);
				}else{
					puts("输入有误!");
				}
			break;
           
			case 3:
				list_find(L);
				break;
    		case 4:
				list_modify(L);
				list_show(L);
				break;
			case 5:
				list_sort(L);
				list_show(L);
				break;
	 		case 6: 
                list_derepeat(L);
				list_show(L);
				break;
			case 7:
				list_reverse(L);
				list_show(L);
				break;
			case 8:
				break;
			case 9:
				list_free(L);
				break;
           case 10:
                list_max(L);
                break;
             defualt:
				puts("选项输入有误,请检查!");
				break;
		}
		if(8 == choose){
			return 0;
		}
	}

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值