链表操作(全)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct Node{
	int data;
	struct Node * pNext;
}NODE,*PNODE;//相当于struct Node NODE,struct Node *PNODE;

//函数声明
PNODE create_list(void);//创建链表
void traverse_list(PNODE pHead);//打印链表
bool is_empty(PNODE pHead);//判断链表是否为空
int length_list(PNODE pHead);//返回链表的长度
void sort_list(PNODE pHead);//对链表进行排序
bool insert_list(PNODE,int,int);//在链表的一个位置山插入一个数据
bool insert_list2(PNODE pHead,int pos,int val);
bool delete_list(PNODE pHead,int pos,int *pVal);//删除pos位置上的节点,删除的节点的值通过pVal指针带回

int main(){
	PNODE pHead = NULL;
	pHead = create_list();//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
	traverse_list(pHead);//打印链表
	//printf("链表的长度为:%d\n",length_list(pHead));
	sort_list(pHead);//对链表进行排序
	traverse_list(pHead);//打印链表
	if(insert_list2(pHead,1,21)){//在链表3的位置上出入一个节点,节点的数据是10
		printf("插入成功\n");
	}else {
		printf("插入失败\n");
	}
	traverse_list(pHead);//打印链表
	int pVal;
	if(delete_list(pHead,4,&pVal)){
		printf("删除成功,删除的值为%d\n",pVal);
	}else{
		printf("删除失败\n");
	}
	traverse_list(pHead);
	return 0;
}

bool delete_list(PNODE pHead,int pos,int *pVal){
	int i=0;
	PNODE p = pHead;
	while(p->pNext!=NULL&&i<pos-1){
		p=p->pNext;
		i++;
	}
	if(i>pos-1||p->pNext==NULL){
		return false;
	}
	
	PNODE q=p->pNext;//q为pos位置的节点,p为pos位置的前一个节点
	*pVal=q->data;//将要删除节点的值 赋给pVal所指向的变量
	p->pNext=q->pNext;
	 
	free(q);
	//free一个指针后要将指针置为null,free只是释放了指针所指向的内存空间,但是指针变量本身原来的值还存在
	q=NULL;
	return true;
}

//在pHead所指向链表的第pos节点的前面插入一个新的节点,给节点的值是val,假定pos的值从1开始
bool insert_list(PNODE pHead,int pos,int val){
	PNODE p,q;//p是要插入的节点,q是要插入节点的前一个节点
	int i;
	p=(PNODE)malloc(sizeof(NODE));
	q=pHead;
	if(p==NULL||pos<1||pos>length_list(pHead)){
		return false;
	}
	for(i=1;i<pos;i++){
		q=q->pNext;
	}
	p->data=val;
	p->pNext=q->pNext;
	q->pNext = p;
	
	return true;
}

//郝斌老师插入算法(不需要对链表求长度)
bool insert_list2(PNODE pHead,int pos,int val){
	int i=0;
	PNODE p = pHead;
	while(p!=NULL && i<pos-1){
		p=p->pNext;
		i++;
	}
	if(i>pos-1||p==NULL){//i>pos-1是排除0和负数的情况
		return false;
	}
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(pNew==NULL){
		printf("动态内存分配失败\n");
		exit(-1);
	}
	pNew->data=val;
	pNew->pNext=p->pNext;
	p->pNext=pNew;
	return true;
}

//对链表进行排序
void sort_list(PNODE pHead){
	PNODE p1 = pHead->pNext;
	PNODE p2=p1;
	p2=p2->pNext;
	int temp;
	int i,j;
	//冒泡排序
	while(p1->pNext!=NULL){
		while(p2!=NULL){
			if(p1->data>p2->data){
				temp=p1->data;
				p1->data=p2->data;
				p2->data=temp;
			}
			p2=p2->pNext;
		}
		p1=p1->pNext;
		p2=p1->pNext;
	}
}

//返回链表的长度
int length_list(PNODE pHead){
	int cnt=0;
	PNODE p = pHead->pNext;
	while(p!=NULL){
		cnt++;
		p=p->pNext;
	}
	return cnt;
}

//判断链表是否为空
bool is_empty(PNODE pHead){
	//通过头结点判断链表是否为空
	//注意:链表为空,头结点也存在
	if(pHead->pNext==NULL){
		return true;
	}else{
		return false;
	}
}
//创建链表
PNODE create_list(void){
	int len;//链表长度
	int i;
	int val;
	printf("请输入您要生成链表节点的个数:len = ");
	scanf("%d",&len);
	
	//创建一个头结点,链表为空,头结点也存在
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(pHead==NULL){
		printf("内存分配失败,程序终止\n");
		exit(-1);
	}
	
	//创建一个尾节点,尾节点始终指向空
	PNODE pTail = pHead;
	pTail->pNext = NULL;
	
	
	for(i=0;i<len;i++){
		printf("请输入第%d个节点的值:",i+1);
		scanf("%d",&val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(pNew==NULL){
			printf("内存分配失败,程序终止\n");
			exit(-1);
		}
		pNew->data=val;
		pTail->pNext=pNew;
		pNew->pNext=NULL;
		pTail=pNew;
	}
	return pHead;
}
//遍历链表
void traverse_list(PNODE pHead){
	PNODE p = pHead->pNext;
	if(pHead->pNext==NULL){
		printf("链表长度为0\n");
	}
	while(p!=NULL){
		printf("%d,",p->data);
		p=p->pNext;
	}
	printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值