链表的操作(但某些操作的结果有误)

 #include <iostream>
#include <fstream>
#include <cstring>
#include <malloc.h>
#include <conio.h>
using namespace std;

typedef struct student
{
    int data;
    struct student *next;
}node;

node *head;

node *creat()
{
    node *head,*p,*s;
    int x,cycle=1;
    head=(node *)malloc(sizeof(node));
    p=head;
    while(cycle)
    {
        if(scanf("%d",&x)!=EOF)
        {
            s=(node *)malloc(sizeof(node));
            s->data=x;
         //   printf("%d\n",s->data);
            p->next=s;
            p=s;
        }
        else
            cycle=0;
    }
    head=head->next;
    p->next=NULL;
    //printf("%d\n",head->data);
    return head;
}

int length(node *head)
{
    int len=0;
    node *p;
    p=head;
    while(p!=NULL)
    {
        p=p->next;
        len++;
    }
    return len;
}

void print(node *head)
{
    node *p;
    int len=length(head);
    cout<<"have "<<len<<" record"<<endl;
    p=head;
    while(p!=NULL)
    {
        cout<<p->data<<'\t';
        p=p->next;
    }
    cout<<endl;
}

node *del(node *head,int num)
{
    node *p1,*p2;
    p1=head;
    while(num!=p1->data&&p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(num==p1->data)
    {
        if(p1==head)
        {
            head=p1->next;
            free(p1);
        }
        else
            p2->next=p1->next;
        cout<<num<<" delete success!"<<endl;
    }
    else
        cout<<"not fount "<<num<<endl;
    return (head);
}


node *sort(node *head)
{
    node *p,*p2,*p3;
    int n,temp;
    n=length(head);
    if(head==NULL||head->next==NULL)
        return head;
    p=head;
    int i,j;
    for(j=1;j<n;j++)
    {
        p=head;
        for(i=0;i<n-j;i++)
        {
            if(p->data>p->next->data)
            {
                temp=p->data;
                p->data=p->next->data;
                p->next->data=temp;
            }
            p=p->next;
        }
    }
    return head;
}


node *insert(node *head,int num)
{
    node *p0,*p1,*p2;
    p1=head;
    p0=(node *)malloc(sizeof(node));
    p0->data=num;
    p0->next=p1->next;
    p1->next=p0;
    sort(head);
    return head;
}

node *reverse(node *head)
{
    node *p1,*p2,*p3;
    if(head==NULL||head->next==NULL)
        return head;
    p1=head;
    p2=p1->next;
    while(p2!=NULL)
    {
        p3=p2->next;
        p2->next=p1;
        p1=p2;
        p2=p3;
    }
    head->next=NULL;
    head=p1;
    return head;
}

int main()
{
    freopen("ds1.in","r",stdin);
    head=creat();
    print(head);
    sort(head);
    print(head);
    insert(head,3);
    print(head);
    reverse(head);
    print(head);
    return 0;
}


/*
node *insert(node *head,int num)    //在插入首节点前面的时候出错,why?
{
    node *p0,*p1,*p2;
    p1=head;
    p0=(node *)malloc(sizeof(node));
    p0->data=num;
    while(p0->data>p1->data&&p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(p0->data<=p1->data)
    {
        if(head==p1)
        {
            p0->next=p1;
            head=p0;
        //    cout<<head->data<<' '<<length(head)<<endl;
        }
        else
        {
            p2->next=p0;
            p0->next=p1;
        }
    }
    else
    {
        p1->next=p0;
        p0->next=NULL;
    }
    return head;
}
*/

  话说这个程序为什么在reverse以后结果不对?其实那个注释掉的insert函数好像也有一样的原因。

  求高手解答。

posted @ 2013-07-04 15:49  hunterzhang  阅读(170)  评论(0编辑  收藏  举报