链表
个节点离散分布,通过指针相连,每个节点只有一个前驱节点、后续节点,其中首节点没有前驱节点,尾节点没有后续节点。
专业术语:
如果希望通过一个函数来对链表进行处理,至少需要接受链表的那些参数:
只需一个参数:头指针
因为通过投指针可以推算出链表的其他所有参数
程序:
1 创建链表
2 判断链表是否为空
3 链表长度
4 插入删除
5 遍历链表
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node
{
int date;
struct Node *pNext;
}NODE,*PNODE;
PNODE create_list();
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()
{
int val=0;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
pHead = create_list();
//traverse_list(pHead);
/*
if(!is_empty(pHead))
{
sort_list(pHead);
}
else
{
printf("空链表\n");
exit(-1);
}
*/
/*
if(insert_list(pHead,4,22))
printf("插入成功!\n");
else
printf("插入失败!\n");
*/
/*
if(delete_list(pHead, 4, &val))
{
printf("删除成功,删除数为%d\n",val);
}
else
{
printf("删除失败!\n");
}
*/
traverse_list(pHead);
return 0;
}
PNODE create_list()
{
int len,val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (pHead == NULL)
{
printf("分配失败\n");
exit(-1);
}
// pTail 便于对链表的操作
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(PNODE));
if (pNew == NULL)
{
printf("节点分配失败\n");
exit(-1);
}
pNew->date = val;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (p != NULL)
{
printf("%d", p->date);
p = p->pNext;
printf(" ");
}
printf("\n");
}
bool is_empty(PNODE pHead)
{
if(pHead->pNext == NULL)
return true;
else
return false;
}
int length_list(PNODE pHead)
{
PNODE p = pHead->pNext;
int len = 0;
while(p != NULL)
{
++len;
p = p->pNext;
}
return len;
}
void sort_list(PNODE pHead)
{
int temp_val = 0,len = 0;
len = length_list(pHead);
// 如果只有一个直接不用排序
if(len == 1)
return;
PNODE p1 = pHead->pNext;
PNODE p2 = pHead->pNext->pNext;
for(int i=0;i<len-1;i++,p1=p1->pNext,p2=p1->pNext)
{
for(int j=i+1;j<len;j++,p2=p2->pNext)
{
if(p1->date < p2->date)
{
temp_val = p1->date;
p1->date = p2->date;
p2->date = temp_val;
}
}
}
}
bool insert_list(PNODE pHead,int pos ,int val)
{
PNODE p = pHead;
int i=0;
// while 和 if的完美配合
// 不仅检查输入的问题,也找到插入点的位置
//--------------------------
while(p!=NULL && i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1 || p==NULL)
return false;
//--------------------------=
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("分配失败!\n");
exit(-1);
}
pNew->pNext = p->pNext;
p->pNext = pNew;
pNew->date = val;
return true;
}
// 注意这里与插入中的不同
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(p->pNext==NULL || i>pos-1)
{
return false;
}
PNODE q = p->pNext;
*pVal = p->date;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}