c语言简单实现非循环单链表
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
//定义链表的节点
typedef struct Node
{
int data; //数据域
struct Node *pNext; //指针域
}NODE, *PNODE;
typedef int bool;
#define true 1;
#define false 0;
PNODE create_list(); //创建一个链表
void show_list(PNODE pHead);
bool is_empty(PNODE pHead);
int length_list(PNODE pHead);
void sort_list(PNODE pHead); //冒泡排序
bool inster_list(PNODE pHead, int pos, int val); //pos从1开始
bool delete_list(PNODE pHead, int pos, int *val);
int main(void)
{
PNODE pHead;
pHead = create_list();
int pos;
int val;
scanf("%d", &pos);
printf(" -------- %d\n",delete_list(pHead, pos, &val));
show_list(pHead);
sort_list(pHead);
show_list(pHead);
return 0;
}
PNODE create_list()
{
int len; //创建链表的长度
int val; //节点的数据
printf("请输入您要创建的链表的长度:");
scanf("%d", &len);
//创建头结点,方便链表的操作
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if ( NULL == pHead )
{
printf("链表创建失败!--动态内存分配失败!");
exit(-1); //结束程序
}
pHead->pNext = NULL;
//存放尾节点
PNODE pTaill = pHead;
//循环添加节点
for (int i = 0; i < len; ++i)
{
//创建节点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if ( NULL == pNew )
{
printf("节点创建失败!--动态内存分配失败!");
exit(-1); //结束程序
}
pNew->pNext = NULL;
printf("请输入您要数据:");
scanf("%d", &val);
pNew->data = val;
//将新创建的节点添加到尾部
//找到尾节点
pTaill->pNext = pNew;
pTaill = pNew;
}
return pHead;
}
//输出list
void show_list(PNODE pHead)
{
//得到首节点
PNODE p = pHead->pNext;
while ( NULL != p )
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n");
return;
}
bool is_empty(PNODE pHead)
{
PNODE p = pHead->pNext;
if (NULL == p)
{
return true;
}else
{
return false;
}
}
int length_list(PNODE pHead)
{
int length = 0;
//得到首节点
PNODE p = pHead->pNext;
while ( NULL != p )
{
++length;
p = p->pNext;
}
return length;
}
void sort_list(PNODE pHead)
{
//链表长度
int len = length_list(pHead);
//最小值永远第一位,冒泡排序
int i, j, t;
PNODE p, q;
//执行的方式与数组相同,但要加上指针移动
for (i = 0, p=pHead->pNext; i < len-1; ++i, p=p->pNext)
{
for (j = i+1, q=p->pNext; j < len; ++j, q=q->pNext)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
}
bool inster_list(PNODE pHead, int pos, int val)
{
//找到pos位置前一个节点
//0(头) 1, 2, 3, 4, 5 ----5个有效节点 pos = 3 val = 10
//0(头) 1, 2, 10, 3, 4, 5
PNODE p = pHead;
int i = 0;
while (NULL != p->pNext && i < pos-1)//NULL != p是为了p超出链表范围,i是控制p始终是pos前一个节点
{
p = p->pNext;
++i;
}
if ( NULL == p->pNext || i > pos-1)
{
return false;
}
//p为pos节点的上一个节点
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if ( NULL == pNew )
{
printf("节点添加失败!--动态内存分配失败!");
return false;
}
pNew->data = val;
pNew->pNext = p->pNext;
p->pNext = pNew;
return true;
}
bool delete_list(PNODE pHead, int pos, int *val)
{
//找到pos位置节点
//0(头) 1, 2, 3, 4, 5 ----5个有效节点 pos = 3
//0(头) 1, 2, 4, 5
PNODE p = pHead;
int i = 0;
while (NULL != p && i < pos-1)//NULL != p是为了控制p节点为pos节点
{
p = p->pNext;
++i;
}
if ( NULL == p || i > pos-1)
{
return false;
}
PNODE q = p->pNext;
p->pNext = p->pNext->pNext;
free(q);
return true;
}