提示:仅做参考!!! 仅做参考!!! 仅做参考!!!
目的:通过C实现单链表的创建_遍历_判断空_获取长度_插入_删除_排序
# include <stdio.h>
# include <malloc.h>
//作者:HuXuehao
//时间:2020-12
typedef struct Node {
int date; //数据域
struct Node * pNext; //指针域
}NODE, * PNODE; //NODE 等价于struct Node; PNODE等价于struct Node * ;
PNODE create_list(void); //创建了单链表
void print_list(PNODE); //遍历单链表
bool isEmpty_list(PNODE); //判断链表是否为空
int getLength_list(PNODE); //得到链表的长度
bool insert_list(PNODE, int, int); //插入
bool delete_list(PNODE, int); //删除
void sort_list(PNODE); //排序
int main(void) {
int opt, targ;
int del;
//创建了单链表
PNODE pHead = NULL;
pHead = create_list();
//遍历单链表
print_list(pHead);
//判断链表是否为空
bool ft = isEmpty_list(pHead);
ft == false? printf("链表不为空!\n\n") : printf("该链表为空!\n\n");
//得到链表的长度
int len = getLength_list(pHead);
printf("该链表的长度为:%d\n\n",len);
//插入
printf("向链表中插入一个数:opt= ");
scanf("%d",&opt);
printf("将其插入到几的后面:targ= ");
scanf("%d",&targ);
if(insert_list(pHead, opt, targ)) {
printf("插入成功!\n新链表为:");
print_list(pHead);
}else {
printf("插入失败\n!");
}
//删除
printf("删除一个节点:del= ");
scanf("%d",&del);
if(delete_list(pHead, del)) {
printf("删除成功!\n新链表为:");
print_list(pHead);
}else {
printf("删除失败!\n");
}
//排序
printf("\n排序后的结果:");
sort_list(pHead);
print_list(pHead);
return 0;
}
//创建链表
PNODE create_list(void) {
int len;
int i;
int val; //存放用户输入的节点的值
//动态分配一个头节点,因为遍历的时候要用到,所以这里必须是动态的
PNODE pHead = (PNODE)malloc(sizeof(PNODE));
if(pHead == NULL) {
printf("内存分配失败,程序终止!\n");
//exit(-1);
}
PNODE pTail = pHead; //生成一个尾节点
pTail->pNext = NULL;
printf("请输入你要生成链表的长度:");
scanf("%d",&len);
for(i=0; i<len; i++) {
printf("\n请输入第%d个节点的值:",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(PNODE)); //生成一个节点
if(pHead == NULL) {
printf("内存分配失败,程序终止!\n");
//exit(-1);
}
//生成一个节点
pNew->date = val; //将值存放到该节点的数据域中
pTail->pNext = pNew; //将该节点的地址存放到头(尾)结点的指针域
pNew->pNext = NULL; //该节点的指针域为空
pTail = pNew; //将尾结点的指针后移
}
return pHead; //返回头结点,我们可以通过头结点找到所有的节点
}
//遍历链表
void print_list(PNODE pHead) {
PNODE p = pHead->pNext; //将链表的第一个节点赋给p
while(true) {
if(p != NULL) { //因为下面有 p = p->pNext; 所以这里只需要判断 p是否为空就可以
printf("%d\t",p->date);
p = p->pNext;
}else {
break;
}
}
printf("\n");
return;
}
//判断链表是否为空
bool isEmpty_list(PNODE pHead) {
if(pHead->pNext == NULL) {
return true;
}else {
return false;
}
}
//得到链表的长度
int getLength_list(PNODE pHead) {
int len = 0;
PNODE p = pHead->pNext;
while(true) {
if(p != NULL){
len++;
p = p->pNext;
}else {
break;
}
}
return len;
}
//插入操作
bool insert_list(PNODE pHead, int opt, int targ) {
PNODE p = pHead->pNext;
while(p != NULL) {
if(p->date == targ) {
PNODE pNew = (PNODE)malloc(sizeof(PNODE)); //生成一个节点
pNew->date = opt;
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}else {
p = p->pNext;
}
}
return false;
}
//删除一个节点
bool delete_list(PNODE pHead, int targ) {
PNODE p = pHead;
while(p->pNext != NULL) {
if(p->pNext->date == targ) {
PNODE pDel = p->pNext;
p->pNext = p->pNext->pNext;
free(pDel);
pDel = NULL;
return true;
}else {
p = p->pNext;
}
}
return false;
}
//排序
void sort_list(PNODE pHead) {
int i, j;
PNODE p, q;
int len = getLength_list(pHead);
int t;
//冒泡法
for(i = 0, p = pHead->pNext; i < len-1; i++, p = p->pNext) {
for(j = 0, q = pHead->pNext; j < len-1-i; j++, q = q->pNext) {
if(q->date > q->pNext->date) {
t = q->date;
q->date = q->pNext->date;
q->pNext->date = t;
}
}
}
return;
}
结果: