码迷,mamicode.com
首页 > 编程语言 > 详细

链表(排序和删除)

时间:2015-03-11 21:19:43      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef struct link
{
    int num;
    struct link *next;
}IA;
IA *Create();
IA *Insert (IA *head, IA *p);
void Print(IA *head);
int main()
{
    IA * head = NULL;
    int num;
    head = Create();
    scanf("%d",num);
    Delete(head, num);
    return 0;
}
IA *Create()
{
    IA *head = NULL, *p;
    int num;
    while(~scanf("%d",&num)&&num >= 0){
            p = (IA*)malloc(sizeof(IA));
            p -> num = num;
            head = Insert(head,p);
    }
    Print(head);
    return head;
}
IA *Insert(IA *head,IA *p)
{
    IA *ptr, *ptr1, *ptr2;
    ptr = p;
    ptr1 = head;//ptr表示插入的,ptr1表示头文件,ptr2过渡
    if(head == NULL){
            head = p;
           p -> next = NULL;
    }//第一个数直接放入
    else
    {
        while( ptr-> num > ptr1 -> num && ptr1 -> next!=NULL)
        {
            ptr2 = ptr1;//ptr2保存头指针
            ptr1 = ptr1 -> next;//如果p的大小大于头指针那么头指针一直下去
        }
        if(ptr -> num <= ptr1 -> num){
                if(ptr1 == head)   //头指针没移动,说明插在左边
                    head = ptr;    //头指针就是p
                else   ptr2 ->next = ptr;//如果头指针移动了那么头指针的下一个就是p
                ptr -> next = ptr1;//结束后p的下一个就是原来头指针
                 }
        else {//最后一个数
                ptr1 ->next = ptr;
                ptr -> next = NULL;
        }
     }
        return head;
    }
    void Print(IA *head)
    {
        IA *p;
        if( head == NULL)
            return ;
        for( p = head; p != NULL; p = p -> next)
        printf("%d ",p -> num);
    printf("\n\n");
}
VOID *Delete(IA *head, int num)
{
    IA *ptr1, *ptr2;
    if(head == NULL)
        return ;
    while(head -> num == num){   //如果最小的数就是num那么第一个开始就替换
            ptr1 = head;
            head = head -> next;
            free(ptr1);
    }
    ptr1 = head;//ptr1记录当前指针,ptr2记录下一个指针
    ptr2 = head -> next;
    while(ptr2 != NULL){ //一直执行到最后
            if(ptr2 -> num == num){//如果下一个指针的值就是num那么ptr1的下一个就是ptr2的下一,把ptr2覆盖了
                    ptr1 -> next = ptr2 -> next;
                   free(ptr2);
            }
            else ptr1 = ptr2 -> next;//否则的话接下去遍历
            ptr2 = ptr1 -> next;
    }
    Print(head);
}
View Code

虽然注释了但还是写不出来,得慢慢磨orz

链表(排序和删除)

标签:

原文地址:http://www.cnblogs.com/zero-begin/p/4330834.html

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