很久没有看C语言了
突然想到了链表逆置就写一个看看
//
// main.c
// list
//
// Created by xiaoxiaobing on 13-12-16.
// Copyright (c) 2013年 xiaoxiaobing All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
}Node;
//创建链表
Node *CreatList(void)
{
int val, i, n;
Node *phead, *p, *q;
phead = NULL;
printf("请输入您要建立的链表长度:\n");
scanf("%d", &n);
printf("请输入您要输入的数据:\n");
for(i=0; i<n; i++)
{
scanf("%d", &val);
p = (Node *)malloc(sizeof(Node));
p->data = val;
//头结点刚开始的时候是空的
if(NULL == phead)
q = phead = p;
else
q->next = p;
q = p;
}
// 最后一个节点指向空
p->next = NULL;
return phead;
}
//链表的逆置
Node *ReverseList(Node *phead)
{
Node *p, *q, *r;
p = phead;
q=r=NULL;
while(p)
{
//记录p后边的节点
q = p->next;
//让p的next指向p的上一个节点
p->next = r;
//r和p都向后移动一位
r = p;
p = q;
}
return r;
}
//输出链表
void ShowList(Node *phead)
{
Node *p;
p = phead;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main(void)
{
Node *phead;
phead = CreatList();
printf("链表逆置前的数据:\n");
ShowList(phead);
phead = ReverseList(phead);
printf("链表逆置后的数据:\n");
ShowList(phead);
return 0;
}
当然上边的稍微好懂一点 下边有一个更简单的,直接传地址就行了,只是稍微难理解一点,和上边的对照一下应该不难理解的
//
// main.c
// list
//
// Created by xiaoxiaobing on 13-12-16.
// Copyright (c) 2013年 xiaoxiaobing All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
}Node;
//创建链表
Node *CreatList(void)
{
int val, i, n;
Node *phead, *p, *q;
phead = NULL;
printf("请输入您要建立的链表长度:\n");
scanf("%d", &n);
printf("请输入您要输入的数据:\n");
for(i=0; i<n; i++)
{
scanf("%d", &val);
p = (Node *)malloc(sizeof(Node));
p->data = val;
//头结点刚开始的时候是空的
if(NULL == phead)
q = phead = p;
else
q->next = p;
q = p;
}
// 最后一个节点指向空
p->next = NULL;
return phead;
}
//链表的逆置 这里没有返回值 直接把头指针的地址给改了
void ReverseList(Node **phead)
{
Node *p, *q, *r;
p = *phead;
q=r=NULL;
while(p)
{
//记录p后边的节点
q = p->next;
//让p的next指向p的上一个节点
p->next = r;
//r和p都向后移动一位
r = p;
p = q;
}
(*phead) = r;
}
//输出链表
void ShowList(Node *phead)
{
Node *p;
p = phead;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main(void)
{
Node *phead;
phead = CreatList();
printf("链表逆置前的数据:\n");
ShowList(phead);
//把链表的头指针的地址传过去
ReverseList(&phead);
printf("链表逆置后的数据:\n");
ShowList(phead);
return 0;
}
本文介绍了使用C语言实现链表逆置的方法,包括链表的创建、逆置及显示等核心步骤,并提供了两种不同的逆置实现方式。
3354





