链表的操作(但某些操作的结果有误)
#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函数好像也有一样的原因。
求高手解答。