使用链表完成增(头插、尾插、任意位置插入)删(头删、尾删、任意位置删除)改、查、去重、翻转、排序、求相邻两个节点最大值、将两个有序链表合并并且合并后的链表有序。
头文件
/*===============================================
* 文件名称: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;
}