单链表基本操作(尾插,头插,删除,查找,修改,打印)

1创建单链表代码

#include<stdio.h>

#include <stdlib.h>

//define a struct 

//定义一个结构体,也就是节点

typedef struct Node {

 int data; // 存储链表数据

 struct Node *next; // 存储结点的地址

}LNode,*LinkList;

2头插法以及尾插法创建代码

//头插法创建单链表(注释的为头插法)

LNode* List_HeadCreate(LNode* L)

{/*L–>next=NULL;如果使用头插法不能省略*/

 int x;

 L = (LNode*)malloc(sizeof(LNode));

 LNode *s,*r=L;

 int z;

do{ printf("写入数据"); 

      scanf("%d",&x);   

                 

  s=(LNode*)malloc(sizeof(LNode));

  /*核心代码*/

  /*s->next = L->next;

        L->next = s; 头插法操作*/

  s->data=x;                           

  r->next=s;                      

  r=s;/尾插法操作

  printf("是否继续录入0/1");

  scanf("%d",&z);

  if(z==0)

  break;

 }while(1);

 r->next=NULL;/*进行尾插时不能省略

 return L;

 }

头插法图解(这里的s指针相当于p);

单链表基本操作(尾插,头插,删除,查找,修改,打印)

 尾插法图解(这里的p指针相当于s)

单链表基本操作(尾插,头插,删除,查找,修改,打印)

 3删除操作(关键在于前驱节点与后驱节点)

 

LNode*List_deletele(LNode*L)//删除操作 

 

  { LNode*node=L;      

        LNode*p;

       printf("写入删除的数据");

       int x;

  scanf("%d",&x);

       do { 

  if( node->next->data==x)

  {p=node->next;

     node->next=node->next->next;

     free(p);

     p=NULL;

     node=node->next;

  }

  else

  {

 node=node->next; }

  

 }while(node->next!=NULL);

  

  return L;}

4查找操作(无非就是遍历)

 LNode*List_find(LNode*L)//查找操作 

 {printf("输入要查找的数据"); 

 int a;

 int b;

 LNode*H;

 H=L;

 scanf("%d",&a);

 do

 {

 if(H->data==a)

 printf("%d",H->data);

 H=H->next;

 } while(H->next!=NULL);

 return L;

 }

 5修改数据(就是遍历加改数据)

LNode*List_changllege(LNode*L)

 { 

 LNode*p=L;

 int x;

 int h;

 printf("输入修改的数据");

 scanf("%d",&x);

 printf("修改为的数据");

 scanf("%d",&h); 

 do{

  if(p->data==x)

  { p->data=h;

  p=p->next;

  }

  else

  { p=p->next;

  }

    } while(p->next!=NULL);

    return L;

   }

6插入数据(利用头插法操作)

 LNode*List_insert(LNode*L)

{ LNode *s;

int b;

    int arr;

do{

     s = (LNode*)malloc(sizeof(LNode));

        printf("写入数据");

  scanf("%d",&arr);

        s->data = arr;//将新增节点存放上数据

        s->next = L->next;//连接s的后继

        L->next = s;//连接s的前驱h

        printf("是否继续插入");

  scanf("%d",&b);

  if(b==0)

  break;}while(1);

return L;

}

7主函数

//主函数,给链表赋值并打印出链表

main(){

  LNode *L = NULL;

    int arr;

 int h=0;

 int select;

 printf("----主菜单----\n"); 

   printf( "--1写入数据--\n");

 printf("--2打印数据--\n");

 printf("--3插入数据--\n");

 printf("--4删除数据--\n");

 printf("--5查找数据--\n");

 printf("--6修改数据--\n");

 printf("--7退出--"); 

do

 {printf("\n写入选项");

 scanf("%d",&select);

 

  {

  if(select==1) L = List_HeadCreate(L,arr,h);

  if(select==2) L=List_printf(L);

  if(select==3) L=List_insert(L);

  if(select==4) L=List_deletele(L);

  if(select==5) L=List_find(L);}

  if(select==6) L=List_changllege(L);

  if(select==7) printf("欢迎下次使用");break;}while(1);

}

7完整代码

#include<stdio.h>

#include <stdlib.h>

//define a struct 

//定义一个结构体,也就是节点

typedef struct Node {

 int data; // 存储链表数据

 struct Node *next; // 存储结点的地址

}LNode,*LinkList;

  

 LNode*List_changllege(LNode*L)

 { 

 LNode*p=L;

 int x;

 int h;

 printf("输入修改的数据");

 scanf("%d",&x);

 printf("修改为的数据");

 scanf("%d",&h); 

 do{

  if(p->data==x)

  { p->data=h;

  p=p->next;

  }

  else

  { p=p->next;

  }

    } while(p->next!=NULL);

    return L;

   }

//头插法创建单链表

LNode* List_HeadCreate(LNode* L,int arr,int h)

{

 int x;

 L = (LNode*)malloc(sizeof(LNode));

 LNode *s,*r=L;

 int z;

 do{ printf("写入数据"); 

      scanf("%d",&x);                     

  s=(LNode*)malloc(sizeof(LNode));

  /*核心代码*/

  /*s->next = L->next;

        L->next = s; 头插法操作*/

  s->data=x;                           

  r->next=s;                      

  r=s;

  printf("是否录入");

  scanf("%d",&z);

  if(z==0)

  break;

 }while(1);

 r->next=NULL;

 return L;

 }

 LNode*List_printf(LNode*L)//打印操作 

 

 { 

 LinkList p;

 p=L->next; 

    printf("链表元素\n");

    while(p!=NULL)

    {

        printf("%d ",p->data);

        p=p->next;

    }

    printf("\n");

 }

 LNode*List_find(LNode*L)//查找操作 

 {printf("输入要查找的数据"); 

 int a;

 int b;

 LNode*H;

 H=L;

 scanf("%d",&a);

 do

 {

 if(H->data==a)

 printf("%d",H->data);

 H=H->next;

 } while(H->next!=NULL);

 return L;

 }

 LNode*List_deletele(LNode*L)//删除操作 

 

  { LNode*node=L;      

        LNode*p;

       printf("写入删除的数据");

       int x;

  scanf("%d",&x);

       do { 

  if( node->next->data==x)

  {p=node->next;

     node->next=node->next->next;

     free(p);

     p=NULL;

     node=node->next;

  }

  else

  {

 node=node->next; }

  

 }while(node->next!=NULL);

  

  return L;}

 LNode*List_insert(LNode*L)

{ LNode *s;

int b;

    int arr;

do{

     s = (LNode*)malloc(sizeof(LNode));

        printf("写入数据");

  scanf("%d",&arr);

        s->data = arr;//将新增节点存放上数据

        s->next = L->next;//连接s的后继

        L->next = s;//连接s的前驱h

        printf("是否继续插入");

  scanf("%d",&b);

  if  (b==0)

  break;}while(1);

return L;

 

}

 

 

//主函数,给链表赋值并打印出链表

main(){

  LNode *L = NULL;

    int arr;

 int h=0;

 int select;

 printf("----主菜单----\n"); 

   printf( "--1写入数据--\n");

 printf("--2打印数据--\n");

 printf("--3插入数据--\n");

 printf("--4删除数据--\n");

 printf("--5查找数据--\n");

 printf("--6修改数据--\n");

 printf("--7退出--"); 

 

 

 do

 {printf("\n写入选项");

 scanf("%d",&select);

 

  {

  if(select==1) L = List_HeadCreate(L,arr,h);

  if(select==2) L=List_printf(L);

  if(select==3) L=List_insert(L);

  if(select==4) L=List_deletele(L);

  if(select==5) L=List_find(L);}

  if(select==6) L=List_changllege(L);

  if(select==7) printf("欢迎下次使用");break;}while(1);

}

运行如下

单链表基本操作(尾插,头插,删除,查找,修改,打印)

 第一次写博客哈,不足多多指教

上一篇:c 语言数据结构系列,单链表的查找和建立操作


下一篇:2021-1-23数据结构总结(1)