链表2:删除指定节点、头插法尾插法、插入节点

1. 链表从指定节点后方插入新节点(126.9.6)

  • link1.c
#include <stdio.h>

/*struct Student
{
        char *name;
        int age;
        int (*p)(int age);
        struct Student *next;
};*/

struct Test
{
        int data;
        struct Test *next;
};

void insertFromBehind(struct Test *head,int data,struct Test *new)
{
        struct Test *p=head;
        while(p != NULL){
                if(p->data==data){
                        new->next=p->next;
                        p->next=new;
                }
                p=p->next;
        }
}

void printLink(struct Test *head)
{
        struct Test *point;
        point=head;
        while(point != NULL){
                printf("%d ",point->data);
                point=point->next;
        }
        putchar('\n');
}

int getLinkTotalNodeNum(struct Test *head)
{
        int cnt=0;
        struct Test *p=head;
        while(p != NULL){
                cnt++;
                p=p->next;
        }
        return cnt;
}

int searchLink(struct Test *head,int data)
{
        while(head != NULL){
                if(head->data==data){
                        return 1;
                }
                head=head->next;
        }
        return 0;
}

int main()
{
        int i;
        int array[]={1,2,3};
        for(i=0;i<sizeof(array)/sizeof(array[0]);i++){
                printf("%d ",array[i]);
        }
        putchar('\n');

        struct Test t1={1,NULL};
        struct Test t2={2,NULL};
        struct Test t3={3,NULL};
        struct Test t4={4,NULL};
        struct Test t5={5,NULL};
        struct Test t6={6,NULL};

        t1.next=&t2;
        t2.next=&t3;
        t3.next=&t4;
        t4.next=&t5;
        t5.next=&t6;

        printf("use t1 to print three nums:\n");
//      printf("%d %d %d %d\n",t1.data,t1.next->data,t1.next->next->data,t1.next->next->next->data);
        printLink(&t1);

        struct Test new={100,NULL};
        puts("after insert behind:");
        insertFromBehind(&t1,6,&new);
        printLink(&t1);

        /*int ret=getLinkTotalNodeNum(&t1);
        printf("total num = %d\n",ret);

        ret=searchLink(&t1,2);
        if(ret==1){
                printf("have 2\n");
        }else{
                printf("no 2\n");
        };
      ret=searchLink(&t1,8);
        if(ret==1){
                printf("have 8\n");
        }else{
                printf("no 8\n");
        };*/

        return 0;
}

2. 链表从指定节点前方插入新节点(127.9.7)

  • link1.c
#include <stdio.h>

/*struct Student
{
        char *name;
        int age;
        int (*p)(int age);
        struct Student *next;
};*/

struct Test
{
        int data;
        struct Test *next;
};

struct Test* insertFromFor(struct Test *head,int data,struct Test *new)
{
        struct Test *p=head;
        if(p->data==data){
                new->next=p;
                return new;
        }
        while(p->next != NULL){
                if(p->next->data==data){
                        new->next=p->next;
                        p->next=new;
                        printf("insert ok\n");
                        return head;
                }
                p=p->next;
        }
        printf("no data insert %d\n",data);
        return head;
}

void insertFromBehind(struct Test *head,int data,struct Test *new)
{
        struct Test *p=head;
        while(p != NULL){
                if(p->data==data){
                        new->next=p->next;
                        p->next=new;
                }
                p=p->next;
        }
}

void printLink(struct Test *head)
{
        struct Test *point;
        point=head;
        while(point != NULL){
                printf("%d ",point->data);
                point=point->next;
        }
        putchar('\n');
}

int getLinkTotalNodeNum(struct Test *head)
{
        int cnt=0;
        struct Test *p=head;
        while(p != NULL){
                cnt++;
                p=p->next;
        }
        return cnt;
}

int searchLink(struct Test *head,int data)
{
        while(head != NULL){
                if(head->data==data){
                        return 1;
                }
                head=head->next;
        }
        return 0;
}

int main()
{
        int i;
        int array[]={1,2,3};
        for(i=0;i<sizeof(array)/sizeof(array[0]);i++){
                printf("%d ",array[i]);
        }
        putchar('\n');

        struct Test t1={1,NULL};
        struct Test t2={2,NULL};
        struct Test t3={3,NULL};
        struct Test t4={4,NULL};
        struct Test t5={5,NULL};
        struct Test t6={6,NULL};

        t1.next=&t2;
        t2.next=&t3;
        t3.next=&t4;
        t4.next=&t5;
        t5.next=&t6;

        struct Test *head=&t1;

        printf("use t1 to print three nums:\n");
//      printf("%d %d %d %d\n",t1.data,t1.next->data,t1.next->next->data,t1.next->next->next->data);
        printLink(head);

        struct Test new={100,NULL};
        puts("after insert behind:");
        insertFromBehind(head,6,&new);
        printLink(head);

        struct Test new2={122,NULL};
        head=insertFromFor(head,1,&new2);
        puts("after insert head forward:");
        printLink(head);

        struct Test new3={66,NULL};
        head=insertFromFor(head,2,&new3);
        puts("after insert forward:");
        printLink(head);
        struct Test new4={66,NULL};
        head=insertFromFor(head,20,&new3);
        puts("after insert forward:");
        printLink(head);


        /*int ret=getLinkTotalNodeNum(&t1);
        printf("total num = %d\n",ret);

        ret=searchLink(&t1,2);
        if(ret==1){
                printf("have 2\n");
        }else{
                printf("no 2\n");
        };
        ret=searchLink(&t1,8);
        if(ret==1){
                printf("have 8\n");
        }else{
                printf("no 8\n");
        };*/

        return 0;
}

3. 链表删除指定节点(128.9.8)

  • gdb用法
    • gcc test.c -g
    • gdb a.out
    • run
    • q
    • y

在这里插入图片描述

  • link2.c
#include <stdio.h>
#include <stdlib.h>

struct Test
{
        int data;
        struct Test *next;
};

void printLink(struct Test *head)
{
        struct Test *point;
        point=head;
        while(point != NULL){
                printf("%d ",point->data);
                point=point->next;
        }
        putchar('\n');
}

struct Test* deleteNode(struct Test *head,int data)
{
        struct Test *p=head;
        if(p->data==data){
                head=head->next;
                return head;
        }
        while(p->next != NULL){
                if(p->next->data==data){
                        p->next=p->next->next;
                        return head;
                }
                p=p->next;
        }
        return head;
}

int main()
{
        struct Test *head=NULL;
        struct Test t1={1,NULL};
        struct Test t2={2,NULL};
        struct Test t3={3,NULL};
        struct Test t4={4,NULL};
        struct Test t5={5,NULL};
        struct Test t6={6,NULL};

        head=&t1;
        t1.next=&t2;
        t2.next=&t3;
        t3.next=&t4;
        t4.next=&t5;
        t5.next=&t6;

        printLink(head);

        head=deleteNode(head,1);
        printLink(head);
        head=deleteNode(head,3);
        printLink(head);

        return 0;
}

4. 链表动态创建之头插法(129.9.9)

  • link3.c
#include <stdio.h>
#include <stdlib.h>

struct Test
{
        int data;
        struct Test *next;
};

struct Test* insertFromHead(struct Test *head)
{
        struct Test *new;
        while(1){
                new=(struct Test*)malloc(sizeof(struct Test));
                if(new == NULL){
                printf("Memory allocation failed.\n");
                return head;
                }
                printf("input your new node data:\n");
                scanf("%d",&(new->data));
                if(new->data == 0){
                        printf("0 quit\n");
                        return head;
                }
                if(head == NULL){
                        head=new;
                }else{
                        new->next=head;
                        head=new;
                }
        }
        //return head;
}

void printLink(struct Test *head)
{
        struct Test *point;
        point=head;
        while(point != NULL){
                printf("%d ",point->data);
                point=point->next;
        }
        putchar('\n');
}

int main()
{
        /*int i=3;
        struct Test *head=NULL;
        while(i--){
                head=insertFromHead(head);
        }*/
        struct Test *head=NULL;
        head=insertFromHead(head);
        printLink(head);
        return 0;
}

5. 头插法优化补充(130.9.10)

  • link4.c
#include <stdio.h>
#include <stdlib.h>

struct Test
{
        int data;
        struct Test *next;
};

struct Test* insertFromHead(struct Test *head,struct Test *new)
{
        if(head == NULL){
                head=new;
        }else{
                new->next=head;
                head=new;
        }
        return head;
}

struct Test* creatClink(struct Test *head)
{
        struct Test *new;
        while(1){
                new=(struct Test*)malloc(sizeof(struct Test));
                if(new == NULL){
                printf("Memory allocation failed.\n");
                return head;
                }
                printf("input your new node data:\n");
                scanf("%d",&(new->data));
                if(new->data == 0){
                        printf("0 quit\n");
                        free(new);
                        return head;
                }
                head=insertFromHead(head,new);
        }
}
void printLink(struct Test *head)
{
        struct Test *point;
        point=head;
        while(point != NULL){
                printf("%d ",point->data);
                point=point->next;
        }
        putchar('\n');
}

int main()
{
        struct Test *head=NULL;
        head=creatClink(head);
        printLink(head);
        struct Test t1={520,NULL};
        head=insertFromHead(head,&t1);
        printLink(head);

        return 0;
}

6. 尾插法创建链表(131.9.11)

  • link5.c
#include <stdio.h>
#include <stdlib.h>

struct Test
{
        int data;
        struct Test *next;
};

struct Test* insertFromHead(struct Test *head,struct Test *new)
{
        if(head == NULL){
                head=new;
        }else{
                new->next=head;
                head=new;
        }
        return head;
}

struct Test* creatClink(struct Test *head)
{
        struct Test *new;
        while(1){
                new=(struct Test*)malloc(sizeof(struct Test));
                if(new == NULL){
                printf("Memory allocation failed.\n");
                return head;
                }
                printf("input your new node data:\n");
                scanf("%d",&(new->data));
                if(new->data == 0){
                        printf("0 quit\n");
                        free(new);
                        return head;
                }
                head=insertFromHead(head,new);
        }
}

struct Test* insertFromBehind(struct Test *head,struct Test *new)
{
        struct Test *p=head;
        if(p == NULL){
                head=new;
                return head;
        }
        while(p->next != NULL){
                p=p->next;
        }
        p->next=new;

        return head;
}

struct Test* creatClink2(struct Test *head)
{
        struct Test *new;
        while(1){
                new=(struct Test*)malloc(sizeof(struct Test));
                if(new == NULL){
                printf("Memory allocation failed.\n");
                return head;
                }
                printf("input your new node data:\n");
                scanf("%d",&(new->data));
                if(new->data == 0){
                        printf("0 quit\n");
                        free(new);
                        return head;
                }
                head=insertFromBehind(head,new);
        }
}
void printLink(struct Test *head)
{
        struct Test *point;
        point=head;
        while(point != NULL){
                printf("%d ",point->data);
                point=point->next;
        }
        putchar('\n');
}

int main()
{
        struct Test *head=NULL;
        head=creatClink2(head);
        printLink(head);
        struct Test t1={520,NULL};
        head=insertFromHead(head,&t1);
        struct Test t2={250,NULL};
        head=insertFromBehind(head,&t2);

        printLink(head);

        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值