后续修改,现在放着以便平时看。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node //构建每个节点的数据类型和指针域,用typedef减少之后的代码量
{
int data;//数据域中的数据是int类型
struct node* pnext;
//指针域存储下一个节点的地址,使用struct node*的具体原因我自己也没太弄明白,
//有兴趣的朋友可以去看郝斌数据结构课思考。
}NODE,*PNODE; //NODE==struct node PNODE==struct node*
//函数声明
PNODE creat_list(void);
void list_traversal(PNODE phead);
bool is_empty(PNODE phead);
int length_list(PNODE phead);
bool insert_list(PNODE phead,int val,int position);
bool delete_list(PNODE phead,int position,int* researve);
void sort_list(PNODE phead,int len);
//主函数
int main()
{
PNODE phead=NULL;
int len,position,val;
int* researve=NULL;
phead = creat_list(); //创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
len=length_list(phead);
if(is_empty(phead))
{
printf("链表为空!\n");
}
else
{
list_traversal(phead);//遍历该单链表中的所有数据
printf("排序后:\n");
sort_list(phead, len);//对链表中的数据大小进行排序
list_traversal(phead);
printf("请输入你想插入数据所放置的链表节点的位置:");
scanf("%d",&position);
printf("请输入你想插入的数据:");
scanf("%d",&val);
printf("%d %d\n",position,val);
insert_list(phead,val,position);
list_traversal(phead);
delete_list(phead,4,researve);
list_traversal(phead);
}
return 0;
}
//函数具体代码
//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
PNODE creat_list(void)
{
int len,i,val;//len表示长度,val代表输入节点的数据
printf("请输入您需要生成的链表节点的个数:len = ");
scanf("%d",&len);//链表长度
PNODE phead = (PNODE)malloc(sizeof(NODE)); //生成头节点
//reserve_last始终指向链表的最后一个节点,避免后面添加新节点在链表的最后面时所有新节点都挂在了头节点后面
PNODE reserve_last = phead;
reserve_last->pnext=NULL;
for(i=0;i<len;i++)
{
//判断是否分配内存成功
if(phead==NULL)
{
printf("分配失败");
exit(-1);
}
printf("请输入第%d个节点的数据:",i+1);
scanf("%d",&val);
//创建要挂在链表结尾的新节点
PNODE pnew = (PNODE)malloc(sizeof(NODE));
//判断是否分配内存成功
if(pnew==NULL)
{
printf("分配失败");
exit(-1);
}
//使得新节点数据域等于val
pnew->data=val;
//使得pnew节点挂在链表的最后一个节点
reserve_last->pnext = pnew;
//令最后一个节点的指针域变为NULL,不指向其他地方了
pnew->pnext=NULL;
//这一步尤其重要,保证了reserve_last始终指向链表最后一个节点
reserve_last = pnew;
}
return phead;
}
//遍历单链表中的所有数据
void list_traversal(PNODE phead)
{
PNODE p=phead->pnext;
while(p!=NULL)
{
//phead是头指针,即phead->pnext为头结点,假设头结点是a,所以phead->pnext->data==a->data
//那么就得到了头结点中的数据。
printf("%d",p->data);
p=p->pnext;//使得phead指针指向下一个节点,以便循环得到下一个节点的数据
printf("\n");
};
printf("遍历结束\n");
return;
}
//判断链表是否为空
bool is_empty(PNODE phead)
{
if(phead->pnext==NULL)
return true;
else
return false;
}
int length_list(PNODE phead)
{
int len=0;
PNODE p=phead->pnext;
//PNODE p=(PNODE)malloc(sizeof(NODE));
//p->pnext=phead->pnext;
while(p!=NULL)
{
len++;
p=p->pnext;
}
printf("链表长度是%d\n",len);
return len;
}
bool insert_list(PNODE phead,int val,int position)
{
int i=0;
PNODE p=phead;
PNODE q=NULL;
PNODE pnew=(PNODE)malloc(sizeof(NODE));
while(p!=NULL&&i<position-1)
{
p=p->pnext;
i++;
};
if(p==NULL||i>position-1)
{
return false;
}
else if(p!=NULL&&i==position-1)
{
pnew->data=val;
q=p->pnext;
p->pnext=pnew;
pnew->pnext=q;
}
return true;
}
bool delete_list(PNODE phead,int position,int* researve)
{
printf("first");
PNODE p=phead;
PNODE q=NULL;
int i=0;
while(p!=NULL&&i<position-1)
{
p=p->pnext;
i++;
printf("second");
};
if(p==NULL||i>position-1)
{
return false;
}
else if(p!=NULL&&i==position-1)
{
q=p->pnext;
*researve=q->data;
free(q);
p->pnext=p->pnext->pnext;
q=NULL;
}
return true;
}
void sort_list(PNODE phead,int len)
{
int i,j,t;
PNODE p=phead;
PNODE q=(PNODE)malloc(sizeof(NODE));
for(i=0;i<len-1;i++)
{
p=p->pnext;
q=p;//为什么q=p->next不行?
for(j=i;j<len;j++)
{
if(p->data > q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
q=q->pnext;
}
}
return;
}