数据结构——线性表之链表(郝斌老师!)

#include<bits/stdc++.h>
using namespace std;

typedef struct node{
	int data;		//数据域
	struct node *pnext; 
}NODE,*PNODE;
 
PNODE create_list(void);			//创建一个链表 
void traverse_list(PNODE phead);	//遍历
bool is_empty(PNODE phead);			
int length_list(PNODE phead);
bool insert_list(PNODE,int,int);	// 
bool delete_list(PNODE,int,int *);
void sort_list(PNODE); 

int main(){
	PNODE phead = NULL;
	
	phead=create_list();
	traverse_list(phead);
	
	if(is_empty(phead)){
		printf("链表为空!\n");
	}
	else{
		printf("链表不空!\n");
	}
	
	printf("排序后:\n");
	sort_list(phead);
	traverse_list(phead);
	
	printf("在第6个插入一个数3:\n");
	if(insert_list(phead,3,6)){
		printf("插入成功!");
	}
	else{
		printf("插入失败!");
	}
	traverse_list(phead);
	
	int val;
	delete_list(phead,3,&val);
	traverse_list(phead);
	printf("您所删除的第三个数字是:%d\n",val);
	return 0;
}

PNODE create_list(void){
	int len;		//用来存放有效结点的个数
	int val;		//用来临时存放用户输入的结点的值
	
	//分配一个不存放有效数据的头结点 
	PNODE phead=(PNODE)malloc(sizeof(NODE)); 
	if(phead==NULL){
		printf("分配失败,程序终止!");
		exit(-1); 
	}
	PNODE ptail = phead;
	ptail->pnext=NULL;
	
	printf("len=");
	scanf("%d",&len);
	
	for(int i=0;i<len;i++){
		printf("请输入第%d个结点的值:",i+1);
		scanf("%d",&val);
		
		PNODE pnew=(PNODE)malloc(sizeof(NODE));
		if(pnew==NULL){
			printf("分配失败,程序终止!");
			exit(-1); 
		}
		
		pnew->data=val;
		ptail->pnext=pnew;
		pnew->pnext=NULL;
		ptail=pnew;
	}
	
	return phead;
}


void traverse_list(PNODE phead){
	PNODE p=phead->pnext;
	while(p!=NULL){
		printf("%d ",p->data);
		p=p->pnext;
	}
	printf("\n");
	return;
}

int length_list(PNODE phead){

	PNODE p=phead->pnext; 
	int len=0;
	
	while(p!=NULL){
		len++;
		p=p->pnext;
	}
	
	return len;

}

bool is_empty(PNODE phead){
	return (phead->pnext==NULL);
}
	
bool insert_list(PNODE phead,int val,int pos){
	//第一步确定pos是否正确 
	int i=0; 
	PNODE p=phead;
	
	//如果运行结果p!=NULL,i=pos-1表示pos的位置是正确的 
	while(p!=NULL && i<pos-1){ 
		p=p->pnext;
		i++;
	}
	
	if(i>pos-1 || p==NULL){
	/*	判断pos-1用来确保pos是一个正整数!
		p==NULL pos的值过大	
	
	*/
		return false;
	}
	
	//第二步malloc一个新结点
	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;
}

bool delete_list(PNODE phead,int pos,int *pval){
	//第一步确定pos是否正确 
	int i=0; 
	PNODE p=phead;
	
	//如果运行结果p!=NULL,i=pos-1表示pos的位置是正确的 
	while(p!=NULL && i<pos-1){ 
		p=p->pnext;
		i++;
	}
	
	if(i>pos-1 || p==NULL){
	/*	判断pos-1用来确保pos是一个正整数!
		p==NULL pos的值过大	
	
	*/
		return false;
	}
	
	PNODE pnew = p->pnext;
	*pval = p->pnext->data;
	
	p->pnext=pnew->pnext;
	free(pnew);
	
	pnew=NULL;
	
	
	return true;
}

void sort_list(PNODE phead){
	PNODE p,q;
	int i,j,t;
	int len=length_list(phead);
	
	for(i=0,p=phead->pnext;i<len-1;i++,p=p->pnext){
		PNODE k=p;
		for(j=i+1,q=p->pnext;j<len;j++,q=q->pnext){
			if(p->data>q->data){
				k=q;
			}
		}
		if(k!=p){
				t=p->data;
				p->data=k->data;
				k->data=t;
		}
	}

	return;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值