线性表——单链表

又来了,写的不好请多多见谅,提出您宝贵的意见必定虚心接受,正在一点点进步。加油!!!

                                                              第二篇    单链表的增、删、改、查                                  

typedef struct Lnode{   //和顺序表相同首先定义数据结构一个数据元素和一个指针
   int data;
   struct Lnode *next;
 }Lnode,*Linklist;

遇到的问题:在插入和删除操作中,循环while中的控制条件有所不同,插入操作可插入的位置有n+1个而删除操作的位置有n个所以在删除操作中控制条件是while(p->next&&n<i-1)

int Insertlist(Linklist &L,Linklist s,int i){      //插入
     Linklist p;
     int n;
     p=L;n=0;
     while(p&&n<i-1){    //条件有所不同
        p=p->next;
        n++;
    }
    if(!p||n>i-1)
        return ERROR;
    else {
         s->next=p->next;
         p->next=s;
         printf("插入成功\n");
    }
}
int Deletelist(Linklist &L,int i){    //删除
     Linklist p,q;
     int n;
     p=L;n=0;
     while(p->next&&n<i-1){    //条件有所不同
        p=p->next;
        n++;
    }
    if(!(p->next)||n>i-1)
       return ERROR;
    else
        q=p->next;
        p->next=p->next->next;
    free(q);
    printf("删除成功\n");
}

整体代码C语言实现,如下

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef struct Lnode{
   int data;
   struct Lnode *next;
 }Lnode,*Linklist;

void Creatlist(Linklist &L,int n){   
    int i;
    Linklist p,r;
    L=(Linklist)malloc(sizeof(Lnode));
    L->next=NULL;
    r=L;
    for(i=0;i<n;i++){         //尾插法
        p=(Linklist)malloc(sizeof(Lnode));
        scanf("%d",&p->data);
        r->next=p;
        r=p;
        p->next=NULL;
     }
     printf("创建成功\n");
}
int Insertlist(Linklist &L,Linklist s,int i){
     Linklist p;
     int n;
     p=L;n=0;
     while(p&&n<i-1){
        p=p->next;
        n++;
    }
    if(!p||n>i-1)
        return ERROR;
    else {
         s->next=p->next;
         p->next=s;
         printf("插入成功\n");
    }
}
int Deletelist(Linklist &L,int i){
     Linklist p,q;
     int n;
     p=L;n=0;
     while(p->next&&n<i-1){
        p=p->next;
        n++;
    }
    if(!(p->next)||n>i-1)
       return ERROR;
    else
        q=p->next;
        p->next=p->next->next;
    free(q);
    printf("删除成功\n");
}
void Findlist(Linklist &L,int i){   //输入所要查找的元素返回该位置
      Linklist p;
      int n=1;
      p=L->next;
      while(p){
        if((p->data)==i)
            printf("该数据元素位置为%d\n",n);
        p=p->next;
        n++;
      }
      if(!p)
        printf("不存在\n");
}
void Updatelist(Linklist &L,int i,int e){
    Linklist p;
    p=L->next;
    while(p){
        if(p->data==i)
              p->data=e;
        p=p->next;
    }
}
void Printlist(Linklist &L){
    Linklist p;
    p=L->next;
    while(p){
       printf("%d\t",p->data);
       p=p->next;
    }
    printf("\n");

}
void menu(){
    printf("1.初始化创建单链表\n");
    printf("2.插入\n");
    printf("3.删除\n");
    printf("4.查找\n");
    printf("5.更改\n");
    printf("6.遍历输出\n");
    printf("0.退出\n");
}
int main(){
    Linklist L,s;
    int i,n;
    menu();
    while(scanf("%d",&i)){
       switch(i){
           case 1:
               printf("请输入所要创建单链表的大小:");
               scanf("%d",&n);
               Creatlist(L,n);
               break;
           case 2:
                printf("请输入所要插入的位置:");
                scanf("%d",&n);
                printf("请输入所要插入结点的数据元素:");
                s=(Linklist)malloc(sizeof(Lnode));
                scanf("%d",&s->data);
                Insertlist(L,s,n);
                break;
           case 3:
                printf("请输入所要删除结点的位置:");
                scanf("%d",&n);
                Deletelist(L,n);
                break;
           case 4:
                printf("输入所要查找的数据元素:");
                scanf("%d",&n);
                Findlist(L,n);
                break;
           case 5:
               printf("输入所要更改的数据元素:");
               scanf("%d",&i);
               printf("更改为:");
               scanf("%d",&n);
               Updatelist(L,i,n);
               break;
           case 6:
               Printlist(L);break;
           case 0:
               exit(1);
      }

}
    return 0;
}
总结:在初步学习链表的相关知识时动手敲代码与用笔在纸上笔画相结合会有事半功倍的效果,一步步的走明白当前指针的指向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值