数据结构期末考试考了这个大题,我认为比较容易混淆,所以把自己的理解分享给大家,如有错误,感谢大家纠正。
逆序单链表的建立
链表节点的连接方式如图:
其建立结点间连接的方式类似与向链表中插入元素,只不过插入元素的位置永远在头节点与第一个节点之间。
正序单链表的建立
链表节点的连接方式如图:
加创建的头节点外,另创建两个新节点
将p节点位置与head位置相同,从p节点开始延申链表,但仍保留初单链表head的位置,以便之后遍历。
连接一个节点后,将p位置赋为所增加q结点的位置,在将更新q节点
进行进一步连接,如此往复,正序单链表的连接就完毕了。
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode,*LinkList;
void CreateList(LinkList &head,int n); //逆位序
void CreateList2(LinkList &head,int n); //正位序
void TraveList(LinkList &head); //链表的遍历
void CreateList(LinkList &head,int n) {
int i;
LinkList p;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
printf("请输入%d个数值\n",n);
for(i=1; i<=n; i++) {
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=head->next;
head->next=p;
}
}
void CreateList2(LinkList &head,int n) {
int i;
LinkList p,q;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
p=q=(LinkList)malloc(sizeof(LNode));
p=head;
printf("请输入%d个数值\n",n);
for(i=1; i<=n; i++) {
scanf("%d",&q->data);
p->next=q;
p=q;
q=(LinkList)malloc(sizeof(LNode));
}
p->next=NULL;
}
void TraveList(LinkList &head) {
LinkList p=head->next;
while(p) {
printf("%2d",p->data);
p=p->next;
}
printf("\n");
}
int main() {
LinkList head,head2;
int n,n2;
printf("请输入逆序输入的单链表中元素的数量:");
scanf("%d",&n);
CreateList(head,n);
printf("逆序输入的元素为:");
TraveList(head);
printf("\n请输入正序输入的单链表中元素的数量:");
scanf("%d",&n2);
CreateList2(head2,n2);
printf("正序输入的元素为:");
TraveList(head2);
return 0;
}
head即为单链表的头节点。