#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;
}
自己写的链表的基本结构和其他功能
最新推荐文章于 2022-07-11 10:08:52 发布