「数据结构」带头节点的单链表的基本操作
以下是带头节点的单链表的基本操作,以待日后查阅。
代码展示
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
创建(方法不同)
逆位序输入
Status CreateList_L(LinkList &L, int n){
// 逆位序输入:输入1,2,3 ==> 输出3,2,1
LNode *p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=n; i>0; --i){
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
顺序输入
Status CreateList_L(LinkList &L, int n){
// 顺序输入
LNode *q;
LNode *p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
q=L;
for(int i=0; i<n; ++i){
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=p;
}
q->next=NULL;
}
输出
Status PrintList_L(LinkList &L){
LNode *p = L->next;
while(p != NULL){
printf("%d ", p->data);
p=p->next;
}
printf("\n");
}
就地逆置
/**
①将原来的头结点拆下来,作为新的逆置链表的头结点
②将原来链表的各个节点,依次拆卸下来,然后按照头插法,插入到逆置链表当中
③循环,直到原来的链表为空即可。
**/
Status ReverseList_L(LinkList &L){
LNode *p, *q;
p=L->next;// ①将原来的头结点拆下来,作为新的逆置链表的头结点
L->next=NULL;
// 将原来链表的各个节点,依次拆卸下来,然后按照头插法,插入到逆置链表当中
// 循环,直到原来的链表为空即可。
while(p){
q=p->next;
p->next=L->next;
L->next=p;// 向前插入
p=q;// 便于while循环去验证有没有做到头
}
}
主函数
int main(){
LinkList L;
int n;
printf("Length:");
scanf("%d",&n);
CreateList_L(L, n);
PrintList_L(L);
ReverseList_L(L);
PrintList_L(L);
}