单链表倒序

#include<stdio.h>

#include<stdlib.h>

#include <malloc.h>

/*链表的定义,从头添加数据,从尾添加数据,打印链表,将链表倒序*/

struct student//结构体

{

int id;

char nName[20];

float sc;

 

};

typedef student DATA;//结构体的别名

struct SNode//单链表

{

DATA data;

SNode *pNext;

};

SNode *g_pHead=NULL;//头指针

int Add_List(DATA data)//从头添加数据

{

SNode *p = (SNode *)malloc(sizeof(SNode));//申请空间

p->data = data;

p->pNext = g_pHead;

g_pHead = p;

return 0;

}

int Add_List_p(DATA data)//从尾添加数据

{

SNode *p1 = (SNode *)malloc(sizeof(SNode));

p1->data = data;

p1->pNext = NULL;//尾部NULL

if (g_pHead == NULL)

{

g_pHead = p1;

}

SNode *p = g_pHead;

while (p ->pNext!= NULL)//遍历到尾部

{

p = p->pNext;

}

p->pNext = p1;

return 0;

}

int Prt_List()//打印链表

{

SNode *p = g_pHead;//保护头指针

while (p!=NULL)

{

printf("%d\t", p->data.id);

printf("%s\t", p->data.nName);

printf("%0.1f\t\n", p->data.sc);

p = p->pNext;

}

return 0;

}

SNode * re_List(SNode *L)//倒序

{

SNode *current, *pnext, *prev;

if (L == NULL || L->pNext == NULL)

return L;

current = L->pNext;  // p1指向链表头节点的下一个节点

pnext = current->pNext;

current->pNext = NULL;

while (pnext)

{

prev = pnext->pNext;

pnext->pNext = current;

current = pnext;

pnext = prev;

}

//printf("current = %d,next = %d \n",current->data,current->next->data);

L->pNext = current;  // 将链表头节点指向p1 //

return L;

}

 

/*SNode *p1 = g_pHead->pNext;

SNode *p2 = p1->pNext;

SNode *p3 = p2->pNext;

p1->pNext = NULL;

while (p1->pNext!=NULL)

{

p2->pNext=p1;

p1 = p2;

p2 = p3;

}

g_pHead->pNext = p1;

return g_pHead;

*/

int main()

{

Add_List({ 3,"sb", 30 });

Add_List({ 2 ,"eb", 360 });

Add_List({ 1 ,"sbe", 50 });

Add_List_p({ 4 ,"sb", 30 });

Add_List_p({ 5 ,"eb", 360 });

Add_List_p({ 6 ,"sbe", 50 });

Prt_List();

g_pHead = re_List(g_pHead);

Prt_List();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tawufa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值