#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//定义链表
typedef struct Node{
int data;
struct Node *Next;
}*Linklist;
//函数声明
Linklist Create_Linklist(void); //创建链表
void Traverse_Linklist(Linklist pHead); //遍历链表
bool is_empty(Linklist pHead); //判断链表是否为空
int Length_Linklist(Linklist pHead); //链表长度
void Sort_Linklist(Linklist pHead); //链表排序
bool Insert(Linklist pHead, int pos, int value); //将value插入到链表的第pos个节点之前
bool Delete(Linklist pHead, int pos, int *value); //删除第pos个节点,并将pos节点值赋给value
int main(void)
{
Linklist pHead;
int length;
int pos, value;
//创建链表并输出链表节点值
pHead = Create_Linklist();
Traverse_Linklist(pHead);
//判断链表是否为空
if(is_empty(pHead)){
printf("链表为空!\n");
}
//求链表长度
length = Length_Linklist(pHead);
printf("链表的长度为:%d\n", length);
//对链表中节点进行排序
Sort_Linklist(pHead);
Traverse_Linklist(pHead);
//在链表中插入新节点
printf("请输入在第几个节点之前插入:");
scanf("%d", &pos);
printf("请输入要插入的节点值:");
scanf("%d", &value);
Insert(pHead, pos, value);
Traverse_Linklist(pHead);
Sort_Linklist(pHead);
Traverse_Linklist(pHead);
//删除链表中某个节点
printf("请输入要删除第几个节点:");
scanf("%d", &pos);
Delete(pHead, pos, &value);
printf("删除的节点值是:%d\n", value);
Traverse_Linklist(pHead);
return 0;
}
Linklist Create_Linklist(void)
{
Linklist pHead, pTail, pNew;
int count, i, value;
pHead = (Linklist)malloc(sizeof(Linklist));
if(pHead == NULL){
printf("申请动态内存失败!\n");
exit(-1);
}
pTail = pHead;
pTail->Next = NULL;
printf("请输入要创建链表的节点个数:");
scanf("%d", &count);
for(i = 0; i < count; i++){
printf("请输入第%d个节点的值:", i+1);
scanf("%d", &value);
pNew = (Linklist)malloc(sizeof(Linklist));
if(pNew == NULL){
printf("申请动态内存失败!\n");
exit(-1);
}
pNew->data = value;
pTail->Next = pNew;
pTail = pNew;
}
pTail->Next = NULL;
return pHead;
}
void Traverse_Linklist(Linklist pHead)
{
Linklist p = pHead->Next;
while(p != NULL){
printf("%d ", p->data);
p = p->Next;
}
printf("\n");
return;
}
bool is_empty(Linklist pHead)
{
if(pHead->Next == NULL){
return true;
}else{
return false;
}
}
int Length_Linklist(Linklist pHead)
{
Linklist p = pHead->Next;
int length = 0;
while(p){
length++;
p = p->Next;
}
return length;
}
void Sort_Linklist(Linklist pHead)
{
Linklist p, q;
int length = Length_Linklist(pHead);
int i, j, t;
for(i = 0, p = pHead->Next; i < length-1; i++, p = p->Next){
for(j = i+1, q = p->Next; j < length; j++, q = q->Next){
if(p->data > q->data){
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}
bool Insert(Linklist pHead, int pos, int value)
{
Linklist p = pHead, pNew;
int i = 0;
while(p && (i < pos - 1)){
i++;
p = p->Next;
}
if((p == NULL) && (i > pos - 1)){
return false;
}
pNew = (Linklist)malloc(sizeof(Linklist));
if(pNew == NULL){
printf("申请动态空间失败!\n");
exit(-1);
}
pNew->data = value;
pNew->Next = p->Next;
p->Next = pNew;
return true;
}
bool Delete(Linklist pHead, int pos, int *value)
{
Linklist p = pHead, q = NULL;
int i = 0;
while((p->Next != NULL) && (i < pos - 1)){
i++;
p = p->Next;
}
if((p->Next == NULL) || (i > pos - 1)){
return false;
}
q = p->Next;
*value = q->data;
p->Next = p->Next->Next;
free(q);
return true;
}