自己写的链表的基本结构和其他功能

来源:互联网 发布:连云港天马网络 编辑:程序博客网 时间:2024/06/05 08:06
#include "stdafx.h"#include<malloc.h>typedef struct Node   //链表的结构体{int data;struct Node* next;}NODE,*PNODE;PNODE create(int );   //创建链表void print(PNODE  );   //打印输出链表int getMid(PNODE );    //得到链表的初值PNODE ReverseList(PNODE );  //反转链表int main(int argc, char* argv[]){int mid;PNODE L=NULL;L=create(5);print(L);mid= getMid(L) ;printf("中间节点的值是:%d\n",mid);L= ReverseList(L);print(L);return 0;}PNODE create(int n){PNODE head,pnew,ptail;int i;pnew=(PNODE)malloc(sizeof(NODE));   //头结点pnew->data=0;     //我这里指定头结点不放数据内容pnew->next=NULL;head=ptail=pnew;for(i=1;i<=n;i++){pnew=(PNODE)malloc(sizeof(NODE));    //创建你要的节点printf("请输入第%d个节点的数据:",i);scanf("%d",&pnew->data);ptail->next=pnew;ptail=pnew;}ptail->next=NULL;return head;}void print(PNODE head ){PNODE p=head;   //定义链表指针,指向链表头p=p->next;       //因为头结点不是你创建的,所以要指向第一个你创建的节点while(p!=NULL){printf("%d\n",p->data);p=p->next;}}int getMid(PNODE head)  //指定一个快指针(一次移动两位)和一个慢指针(一次移动一位),直到快的指向空{      if(head == NULL)          return -1;            PNODE ptrOneStep = head->next;      PNODE ptrTwoStep = head->next;            while(ptrTwoStep != NULL && ptrTwoStep->next != NULL)      {          ptrOneStep = ptrOneStep->next;          ptrTwoStep = ptrTwoStep->next->next;      }           return ptrOneStep->data;  }  PNODE ReverseList(PNODE head)     //链表逆序  http://blog.csdn.net/niuer09/article/details/5961004{      if(head->next == NULL || head->next->next == NULL)        {         return head;   /*链表为空或只有一个元素则直接返回*/      }        PNODE t = NULL;     PNODE p = head->next;    PNODE q = head->next->next;      while(q != NULL)      {                t = q->next;        q->next = p;        p = q;        q = t;      }        /*此时q指向原始链表最后一个元素,也是逆转后的链表的表头元素*/      head->next->next = NULL;  /*设置链表尾*/      head->next = p;           /*调整链表头*/      return head;  } 

0 0