「数据结构」带头节点的单链表的基本操作

「数据结构」带头节点的单链表的基本操作

以下是带头节点的单链表的基本操作,以待日后查阅。

代码展示

#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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章