单链表的运用单链表原地逆置,刚出炉的代码,已在VS上编译运行成功,代码如下:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define TURE 1
#define ERROR 0
#define FALSE 0
#define OVERFLOW -1
#define LISTINCREMENT 10
#define INIT_LIST_SIZE 100
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
int main()
{
Status INITLIST(LinkList &L);
LinkList CreateLinkList (int n);
void TraverLinkList(LinkList L);
int i,n;
LinkList L;
INITLIST(L);
LinkList p,q;
p=L->next;
q=L->next;
printf("请输入初始链表产度:");
scanf_s("%d",&n);
L=CreateLinkList(n);
printf("\n链表中的元素为:");
TraverLinkList(L);
printf("\n");
printf("现在开始逆置.....\n");
p = L->next;
L->next = NULL;
while (p)
{
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
printf("逆置后链表中的元素为:");
TraverLinkList(L);
printf("\n");
return 0;
}
LinkList CreateLinkList(int n)//创建单链表
{
int length, i, value; //有效结点的长度 value用来存放用户输入的结点的值,创建了一个不存放有效数据的头结点
LinkList L = (LinkList)malloc(sizeof(LNode));
if (NULL == L)
{
printf("内存分配失败,程序退出!\n");
exit(-1);
}
LinkList q = L; //q始终指向尾结点
q->next = NULL; //清空指针域
printf("\n");
for (i = 0; i<n; i++)
{
printf("请输入第%d个结点的值:", i + 1);
scanf_s("%d", &value); printf("\n");
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = value; //向新结点中放入值
q->next = p; //将尾结点指向新结点
p->next = NULL; //将新结点的指针域清空
q = p; //将新结点赋给pTail,使pTail始终指向为尾结点
}
return L;
}
void TraverLinkList(LinkList L)//遍历打印
{
LinkList p = L->next;
while (p)
{
printf("%5d", p->data);
p = p->next;
}
}
Status INITLIST(LinkList &L)//初始化链表
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(OVERFLOW);
L->next = NULL;
return OK;
}