#include#include //函数malloc需要的头文件typedef struct student * PNode;typedef struct student //设计链表前最重要的是先想好数据结构{ int data; struct student *next;}Node;PNode create(){ PNode head,p; int x=0; char flag; head=(PNode)malloc(sizeof(Node)); p=head; if(head==NULL) return NULL; printf("请输入节点的值:"); scanf("%d",&x); while(1) { p->data=x; printf("是否继续添加链表:Y/N\n"); scanf(" %c",&flag); //注意,在%c前面有个空格,是为了防止上一个语句的回车符,因为scanf会把回车符当做一个字符,而scanf只接收一个字符 if('N'==flag) break; p->next=(PNode)malloc(sizeof(Node)); //为下一个节点申请地址 p=p->next; printf("请输入节点的值:"); scanf("%d",&x); } p->next=NULL; return head;}void print(PNode link){ PNode head=link; if(head==NULL) return; while(head!=NULL) { printf("%d ",head->data); head=head->next; } printf("\n");}int length(PNode link){ int count=0; PNode head=link; while(head!=NULL) { ++count; head=head->next; } return count;}PNode del(PNode link,int num) //删除分两种情况,一种是删除第一个节点,另外一种是删除中间节点。{ PNode head,p,temp; head=link; if(head->data==num) //删除第一个节点 { head=head->next; return head; } p=head; while(p->next!=NULL) { if(p->next->data==num) //删除第其他节点 { temp=p->next->next; free(p->next); p->next=temp; return head; } p=p->next; } printf("没有这样的节点"); return link;}PNode sort(PNode link){ PNode head=link; PNode p; int i,j,temp; int n=length(link); for(j=1;j data>p->next->data) { temp=p->data; p->data=p->next->data; p->next->data=temp; } p=p->next; } } return head;}PNode reverse(PNode link){ if(link==NULL) return NULL; //注意要判断是否为空 PNode head=link; PNode p,p1,p2; //用p1来反指向p,同时p2不改变,利用p2->next来使指针不断向前,如果p2->next=p1也重指向,就不能利用p2继续前进了。 p=head; //利用1 3 5 7 9画图来写算法 p1=p->next; if(p1==NULL) return p; //如果不判断是否为空,那么如果p1为空,那么p2将会出现段错误 p2=p1->next; p->next=NULL; //处理头结点 p1->next=p; while(p2!=NULL) { p=p1; p1=p2; p2=p2->next; p1->next=p; } return p1;}int searchMid(PNode link) //寻找中间值{ PNode mid,fast;//mid每次移动一个结点,fast每次移动两个结点 mid=link; fast=link; if(mid->next==NULL) //假设只有一个结点 return mid->data; while(fast!=NULL) { mid=mid->next; fast=fast->next->next; } return mid->data;}int main(void){ PNode link; int len;//链表长度 int num;//要删除的值 int mid;//链表的中间值 link=create();//创建链表 printf("打印刚创建的链表\n"); print(link); mid=searchMid(link); printf("中间值是%d\n",mid); link=reverse(link); printf("打印反转后的链表\n"); print(link); link=sort(link); printf("排序好的链表\n"); print(link); printf("请输入要删除的链表的值:"); scanf("%d",&num); link=del(link,num); printf("打印删除后链表的值\n"); print(link); len=length(link); printf("链表的长度为%d\n",len); return 0;}