如何用尾插法实现单链表的逆置

如题所述

第1个回答  2013-07-30
根据你的题目 我大致写了个,注释里有详解:

#include <stdio.h>
#include <malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}List;
List *create()//创建
{
int i=0;
List *head,*p,*q;
p=q=(List *)malloc(sizeof(List));
scanf("%d",&p->data);
while(p->data!=0)
{
i++;
if(i==1)head=p;
else q->next=p;
q=p;
p=(List *)malloc(sizeof(List));
scanf("%d",&p->data);
}
q->next=NULL;
return head;
}
List *nx(List *head)//尾插法逆序
{
List *p,*q,*k;
p=q=head;
while(p->next!=NULL)p=p->next;//p为原链表末结点
while(q!=p)
{
k=q->next;//q为当前首结点,k为当前第二结点
q->next=p->next;
p->next=q;//将当前首节点q尾插到P之后,直到P为首结点
q=k;
}
head=p;
return head;
}
void print(List *head)//列出
{
List *p;
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
main()
{
List *head;
printf("请输入结点数据,输入0结束\n");
head=create();
printf("原链表为:\n");
print(head);
printf("\n");
head=nx(head);//尾插法逆序
printf("尾插法逆序后的链表:\n");
print(head);
getch();
}
第2个回答  2013-12-03
你的好像只是把尾节点变为了首节点,其它节点的链接顺序没有变化,没有实现逆置,你觉得呢?
第3个回答  2013-07-30
爱学习的好孩子啊。。

如何用尾插法实现单链表的逆置
head=create();printf("原链表为:\\n");print(head);printf("\\n");head=nx(head);\/\/尾插法逆序 printf("尾插法逆序后的链表:\\n");print(head);getch();}

C语言中,头指针head,和head->next分别是什么?
很简单,head=p是把p的地址直接赋给head,而p=head->next是把head中的指针域即下一个节点的地址赋给head,你记住一点,next中存放的是下一个节点的地址,->是访问next的符号 “if(h->next==NULL) h->next=p=q;\/\/如果这里是h=p=q,两种情况建完以后有什么区别??? ”对于这个问题,h->ne...

有一个线性表(a1,a2,...,an),采用带头结点的单链表L存储.设计一算法将...
\/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) *\/ \/* 操作结果:用e返回L中第i个数据元素的值 *\/ Status GetElem(LinkList L,int i,ElemType *e){ int j;LinkList p; \/* 声明一结点p *\/ p = L->next; \/* 让p指向链表L的第一个结点 *\/ j = 1; \/* j为计数...

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找_百 ...
int data;\/\/链表数据 struct LNode* next;\/\/链表指针 }LNode,*LinkList;\/*头插法-建立单链表*\/ LinkList HeadCreate(LinkList la){ int num;la=(LinkList)malloc(sizeof(LNode));\/\/建立头结点 la->next=NULL;scanf("%d",&num);while(num!=10){ LNode *p=(LinkList)malloc(sizeof(...

c语言数据结构单链表的初始化 插入 销毁 元素的取出 删除 操作 求详细C...
\/\/单链表测长 void length(Node *head){ Node *p = head->pstnext;int j=0;while(NULL != p){ p = p->pstnext;j++;} printf("%d\\r\\n", j);} \/\/链表按值查找 void research_Date(Node *head, int date){ Node *p;int n=1;p = head->pstnext;while(NULL != p && date...

相似回答