码迷,mamicode.com
首页 > 其他好文 > 详细

单链表的删除

时间:2018-09-23 15:10:08      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:通过   next   link   修改   NPU   break   循环   can   nod   

删除:

 算法思想

  1. 查找:通过计数方式找到第i-1个结点,并由指针p指向它(因为删除的是第i个结点)
  2. 删除第i个结点并释放结点空间
#include<stdio.h>
#include<stdlib.h>
#define len sizeof(Node)

typedef struct Node
{
    int data;
    struct Node *next;
}Node,*LinkList;

void InitList(LinkList *L)
{
    *L=(LinkList)malloc(len);
    (*L)->next=NULL;
} 

void CreateList(LinkList L)
{
    Node* p;
    int a,flag=1;
    p=L;
    printf("Please enter datas:\n");
    while(flag)
    {
        scanf("%d",&a);
        if(a!=0)
        {
            p=(LinkList)malloc(len);
            p->data=a;
            p->next=L->next;
            L->next=p;
        }
        else
            flag=0;
    }
}

void print(LinkList L)
{
    Node *p;
    printf("you please data is:\n");
    p=L;
    for(p=L->next;p!=NULL;p=p->next)
    {
        printf("%d\n",p->data);
    }
}

void Delist(LinkList L,int i,int *e)
{
    Node *p,*r;
    int k;
    p=L;
    k=0;
    while(p->next!=NULL&&k<i-1)//找被删除的结点的前驱i-1使p指向它,正常跳出循环应是k=i-1 
    {
        p=p->next;
        k++;
    } 
     if(p->next==NULL)//若是因为p->next==NULL跳出循环的,因为p->next为空,所以没有合法的前驱位置,说明i不合法 
     {
         printf("删除结点的位置i不合理!\n");
         return;
     }
     r=p->next;
     p->next=r->next;
     *e=r->data;
     free(r);           //删除的结点要释放存储空间 
     return;
}

void print_1(LinkList L)
{
    Node *p;
    printf("you please data is:\n");
    p=L;
    for(p=L->next;p!=NULL;p=p->next)
    {
        printf("%d\n",p->data);
    }
}

int main()
{
    LinkList L;
    int *e,i;
    InitList(&L);
    CreateList(L);
    print(L);
    
    printf("please enter the node i you want delete:\n");
    scanf("%d",&i);
    Delist(L,i,e);
    print_1(L);
    free(L) ;
    return 0;
}

插入

  算法思想

  1. 查找:在单链表中找到第-1个结点并由指针p指向它
  2. 申请:申请新的结点s,将其数据域置位e
  3. 插入挂链:通过修改指针域将新节点s挂入单链表L

代码实现:

#include<stdio.h>
#include<stdlib.h>
#define len sizeof(Node)
typedef struct Node
{
    int date;
    Node *next;
}Node,*LinkList;

void InitList(LinkList *L)
{
    *L=(LinkList)malloc(len);
    (*L)->next=NULL;
}

void CreateList(LinkList L)
{
    int b,flag=1;
    Node *r,*s;
    r=L;
    printf("please input datas and input 0 over:\n");
    while(flag)
    {
        scanf("%d",&b);
        if(b!=0)
        {
            s=(LinkList)malloc(len);
            s->date=b;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }
}

void print(LinkList L)
{
    Node* p=L;
    printf("you input datas is:\n");
    for(p=L->next;p!=NULL;p=p->next)
       printf("%-2d\n",p->date);
}

void InsList(LinkList L,int i,int e)
{//带头结点的单链表L中第i个位置插入值为e的新结点 
    Node *p,*s;
    int k;
    if(i<=0)
    {
        printf("插入失败!\n");
         return ;
    }
    p=L;
    k=0;
    while(p!=NULL&&k<i-1)//从头开始找第i-1个结点 
    {
        p=p->next;
        k++;
    }
    if(p==NULL)//当p为空且还未找到i-1时,说明位置不合法 
    {
        printf("插入的位置不合理!\n");
        return ;
    }
    s=(LinkList)malloc(sizeof(len));
    s->date=e;
    s->next=p->next;
    p->next=s;
    printf("插入成功!\n");
    return ;
}

void print_1(LinkList L)
{
    Node* p=L;
    printf("you input datas is:\n");
    for(p=L->next;p!=NULL;p=p->next)
       printf("%-2d\n",p->date);
}
int main()
{
    LinkList L;
    int i,e;
    InitList(&L);
    CreateList(L);
    print(L);
    printf("在第i个位置插入数值为e的结点:\n");
    printf("please enter i and e:\n");
    scanf("%d%d",&i,&e);
    InsList(L,i,e);
    printf("插入后的新链表为:\n");
    print_1(L);
    free(L) ;
    return 0;
}

 查找

  1.按序号查找

     算法思想

        要查找带头结点的单链表中第i个结点,则需要从单链表的头指针L出发,从头结点L->nexrt顺着链域扫描,用指针p指向当前扫描的结点,j做计数器,累积当前扫描的结点数(初始值为0),j==ii时,指针p指向的就是要找到第i个结点

#include<stdio.h>
#include<stdlib.h>
#define len sizeof(Node)

typedef struct Node
{
    int date;
    Node *next;
}Node,*LinkList;

void InitList(LinkList *L)
{
    *L=(LinkList)malloc(len);
    (*L)->next=NULL;
}

void CreateList(LinkList L)
{
    int b,flag=1;
    Node *r,*s;
    r=L;
    printf("please input datas and input 0 over:\n");
    while(flag)
    {    
        scanf("%d",&b);
        if(b!=0)
        {
            s=(LinkList)malloc(len);
            s->date=b;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }
}

void print(LinkList L)
{
    printf("you input datas is:\n");
    Node* p=L;
    for(p=L->next;p!=NULL;p=p->next)
       printf("%-2d\n",p->date);
}

Node *Get(LinkList L,int i)
{
    int j;
    Node *p;
    if(i<0)
      return NULL;
    p=L,j=0;                    //从头结点开始查找 ,头结点是第0个结点 
    while((p->next!=NULL)&&(j<i))
    {
        p=p->next;
        j++;
    }
    if(i==j)
       return p;
    else
      return NULL;
}

int main()
{
    int i;
    LinkList L,s;
    InitList(&L);
    CreateList(L);
    print(L);
  
    printf("please enter the node i want you find:\n");
    scanf("%d",&i);
    s=Get(L,i);
    if(s!=NULL)
      printf("找到了第%d个结点,数值为%d\n",i,s->date);
    
    free(L) ;
    return 0;
}

    2.按值查找

        算法思想

          从单链表的头指针指向的结点出发,顺链将结点的值与给定的值e作比较,返回查找结果

#include<stdio.h>
#include<stdlib.h>
#define len sizeof(Node)
typedef struct Node
{
    int date;
    Node *next;
}Node,*LinkList;

void InitList(LinkList *L)
{
    *L=(LinkList)malloc(len);
    (*L)->next=NULL;
}

void CreateList(LinkList L)
{
    int b,flag=1;
    Node *r,*s;
    r=L;
    printf("please input datas and input 0 over:\n");

    while(flag)
    {
        scanf("%d",&b);
        if(b!=0)
        {
            s=(LinkList)malloc(len);
            s->date=b;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }
}

void print(LinkList L)
{
    Node* p=L;
    printf("you input datas is:\n");
    for(p=L->next;p!=NULL;p=p->next)
       printf("%-2d\n",p->date);
}

Node *Locate(LinkList L,int key)
{
    Node *p;
    p=L->next;
    while(p!=NULL)
    {
        if(p->date!=key)
            p=p->next;
        else
            break;
     } 
     return p;
}

int main()
{
    int key;
    LinkList L,s;
    InitList(&L);
    CreateList(L);
    print(L);
    
    printf("Enter the value you want to find:\n");
    scanf("%d",&key);
    s=Locate(L,key);
    if(s!=NULL)
        printf("找到了!*^*\n") ;
    free(L) ;
    
    return 0;
}

求单链表的长度

   算法思想

        从“头”开始“数”(p=L->next),用指针依次指向各个节点,并附设计数器j计数,一直“数”到最后一个结点(p->next==NULL),得到长度

#include<stdio.h>
#include<stdlib.h>
#define len sizeof(Node)
typedef struct Node
{
    int date;
    Node *next;
}Node,*LinkList;
void InitList(LinkList *L)
{
    *L=(LinkList)malloc(len);
    (*L)->next=NULL;
}
void CreateList(LinkList L)
{
    int b,flag=1;
    Node *r,*s;
    r=L;
    printf("please input datas and input 0 over:\n");
    while(flag)
    {    
        scanf("%d",&b);
        if(b!=0)
        {
            s=(LinkList)malloc(len);
            s->date=b;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;
        }
    }
}

void print(LinkList L)
{
    printf("you input datas is:\n");
    Node* p=L;
    for(p=L->next;p!=NULL;p=p->next)
       printf("%-2d\n",p->date);
}

Node *Get(LinkList L,int i)
{
    int j;
    Node *p;
    if(i<0)
      return NULL;
    p=L,j=0;                    //从头结点开始查找 ,头结点是第0个结点 
    while((p->next!=NULL)&&(j<i))
    {
        p=p->next;
        j++;
    }
    if(i==j)
       return p;
    else
      return NULL;
}

int Listlength(LinkList L)
{
    int i=0;//保存链表的长度 
    Node *p;
    p=L->next;
    while(p!=NULL)
    {
        i++;
        p=p->next;
    }
    return i;
}

int main()
{
    int length;
    LinkList L,s;
    InitList(&L);
    CreateList(L);
    print(L);
    
    length=Listlength(L);
    printf("Listlength is %d",length);
    free(L);
    return 0;
}

 

单链表的删除

标签:通过   next   link   修改   NPU   break   循环   can   nod   

原文地址:https://www.cnblogs.com/tianzeng/p/9692535.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!