数据结构学习之路(二)单链表的简单实现

若有写的不妥的地方,留言或在通过文章下方邮箱联系我即可,万分感谢。

我是在mac系统下调试的代码,需要include的包可能会与其他系统略有不同。

# include <stdio.h>
# include <stdlib.h>

typedef struct MyNode{
	int data;
	struct MyNode * pNext;
}*PNODE, NODE;

PNODE create_list(void);
void showList(PNODE);
bool isEmpty(PNODE);
int length(PNODE);
bool insert(PNODE, int, int);
bool delete_list(PNODE, int, int *);
void sort(PNODE);

int main(void)
{
	PNODE pHead = create_list();
	showList(pHead);

	if (isEmpty(pHead))
		printf("%s\n", "链表为空!");
	else
		printf("%s\n", "链表不为空!");

	sort(pHead);
	showList(pHead);

	insert(pHead, 5, 100);
	showList(pHead);

	int val;
	delete_list(pHead, 5, &val);
	showList(pHead);
	printf("%d\n", val);

	return 0;
}

PNODE create_list(void){
	int len;
	int i;
	int val;

	printf("%s ", "请输入您要生成的链表节点的个数:");
	scanf("%d", &len);

	PNODE pHead = (PNODE)malloc(sizeof(NODE));

	if(pHead==NULL){
		printf("%s\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("%s\n", "内存分配失败!");
			exit(-1);
		}

		pTail->pNext = pNew;
		pNew->data = val;
		pNew->pNext = NULL;
		pTail=pNew;
	}
	
	return pHead;
}

void showList(PNODE pHead){
	PNODE p = pHead->pNext;
	while (p!=NULL){
		printf("%d  ", p->data);
		p = p->pNext;
	}
	printf("\n");
}

bool isEmpty(PNODE pHead){
	if (pHead->pNext==NULL)
		return true;
	return false;
}

int length(PNODE pHead){
	int len = 0;
	PNODE p = pHead->pNext;
	while(p!=NULL){
		p = p->pNext;
		len++;
	}
	return len;
}

bool insert(PNODE pHead, int index, int val){
	PNODE p = pHead;
	int i=0;
	while(i<index&&p!=NULL){
		p = p->pNext;
		i++;
	}

	if (p==NULL)
		return false;

	PNODE pNew = (PNODE)malloc(sizeof(NODE));

	if (pNew==NULL){
		printf("%s\n", "动态内存分配失败!");
		exit(-1);
	}

	pNew->data = val;

	pNew->pNext=p->pNext;
	p->pNext = pNew;

	return true;
}

/**/
bool delete_list(PNODE pHead, int index, int * val){
	PNODE p = pHead;
	int i = 0;
	while(i<index && p!=NULL){
		p = p->pNext;
		i++;
	}

	if (p==NULL)
		return false;

	PNODE q = p->pNext;
	*val = q->data;
	p->pNext = q->pNext;
	free(q);
	return true;
}

void sort(PNODE pHead){
	PNODE p, q;
	for(p = pHead->pNext; p->pNext != NULL; p=p->pNext){
		for(q=p->pNext; q != NULL; q=q->pNext){
			if (p->data > q->data){
				p->data = p->data + q->data;
				q->data = p->data - q->data;
				p->data = p->data - q->data;
			}
		}
	}
}

email: 17126252@bjtu.edu.cn


版权声明:博客编写不易,转载时请注明出处,万分感谢 !

https://blog.csdn.net/zyy_2018/article/details/79733562



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值