链表添加/遍历/统计/查找/插入/删除算法实现

#include <stdio.h>
#include <stdlib.h>
        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 = head;
                        return new;
                }

                while(p->next != NULL) {
                        if(p->next->data == data) {
                                new->next = p->next;
                                p->next = new;
                                return head;
                        }

                        p = p->next;
                }
                printf("no this data: %d\n",data);

                return head;
        }
 struct Test* deletNode(struct Test *head,int data)
        {
                struct Test *p = head;
                if(p->data == data) {
                        head = head->next;
                        free(p);
                        return head;
                }

                while(p->next != NULL) {
                        if(p->next->data == data) {
                                //struct Test *tmp = p;
                                p->next = p->next->next;
                                //free(p);
                                return head;
                        }
                        p = p->next;
                }

                return head;
        }

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

        int getLinkTotalNum(struct Test *head)
        {
                struct Test *p=head;
                int cnt = 0;
                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 changeLink(struct Test *head,int data,int newdata)
        {
                while(head != NULL) {
                        if(head->data == data) {
                                head->data = newdata;
                                return 1;
                        }
                        head = head->next;
                }
                return 0;
        }


        int 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;
                                return 1;
                        }

                        p = p->next;
                }

                return 0;
        }
 struct Test* insertFromHead(struct Test *head)
        {
                struct Test *new;
                new = (struct Test *)malloc(sizeof(struct Test));
                printf("input your new node data:\n");
                scanf("%d",&(new->data));
                if(head == NULL) {
                head = new;
                return head;
                } else {
                        new->next = head;
                        head = new;
                }
                return head;
        }
int main()
{

        struct Test *head = NULL;
        head = insertFromHead(head);
        printLink(head);


/*      int i;
        int array[] = {1,2,3,4,5,6};
        for(i=0;i<sizeof(array)/sizeof(array[0]);i++) {
                printf("%d ",array[i]);
        }
        putchar('\n');
        
  //    struct Test t1 = {1,NULL};
        struct Test *p = (struct Test*)malloc(sizeof(struct Test));
        struct Test t2 = {2,NULL};
        struct Test t3 = {3,NULL};
        struct Test t4 = {4,NULL};
        p->data = 1;
//      t1.next = &t2;
        p->next = &t2;
        t2.next = &t3;
        t3.next = &t4;
        
//      head = &t1;   
        
        head = p;
        struct Test new = {100,NULL};
        struct Test new2 = {101,NULL};
        struct Test new3 = {102,NULL};

        
//      printf("%d %d %d %d\n",t1.data,t1.next->data,t1.next->next->data,t1.next->next->next->data);
        printLink(head);
        head = deletNode(head,2);
        printLink(head);
*/
/*      puts("after insert behind:\n");
        insertFromBehind(head,3,&new);
        printLink(&t1);

        head = insertFromfor(head,1,&new2);
        puts("after insert behind:\n");
        printLink(head);
        
        head = insertFromfor(head,1000,&new3);
        puts("after insert behind:\n");
        printLink(head);                */

/*      int ret = getLinkTotalNum(&t1);
        printf("total num = %d\n",ret);
        int ret = searchLink(head,1);
        if(ret == 0) {
                printf("no 1\n");
        } else {
                printf("have 1\n");
        }               */


        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值