#include <stdio.h>
#include <stdbool.h>
//定义一个结点
typedef struct Node{
int data;//数据域
struct Node * pNext;//指针域
}NODE, *PNODE;
PNODE createList(void);//创建一个链表
void showList(PNODE pHead);//展示链表
bool isEmptyList(PNODE pHead);//链表是否为空
int getListLenght(PNODE pHead);//获得链表长度
bool insertList(PNODE pHead, int location, int value);//在pHead链表中的location位置插入value
bool deleteList(PNODE pHead, int location, int* pValue);
void sortList(PNODE pHead);
int main(void) {
PNODE pHead = createList();
insertList(pHead, 2, -100);
printf("该链表长度为:%d\n", getListLenght(pHead));
showList(pHead);
int deleteValue = 0;
deleteList(pHead, 3, &deleteValue);
showList(pHead);
printf("该链表长度为:%d\n", getListLenght(pHead));
printf("删除元素的值为:%d\n", deleteValue);
sortList(pHead);
showList(pHead);
}
PNODE createList(void)
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));//pHead是头指针,(PNODE)malloc(sizeof(NODE))为指针指向的头结点
if (pHead == NULL) {
printf("分配空间错误!");
exit(-1);
}
printf("请输入链表长度:");
int length = 0;
scanf("%d",&length);
PNODE pTail = pHead;//创建一个PNODE类型指针pTail,该指针永远指向最后一个结点
pTail->pNext = NULL;
printf("请输入链表结点数据域:");
for (int i = 0; i<length; i++) {
//创建新的结点
PNODE pNode = (PNODE)malloc(sizeof(NODE));
if (pNode == NULL) {
printf("分配空间错误!");
exit(-1);
}
scanf("%d",&(pNode->data));//对新结点的数据域赋值
pNode->pNext = NULL;//新的结点的指针域为NULL;
pTail->pNext = pNode;
pTail = pNode;
}
return pHead;
}
void showList(PNODE pHead)
{
PNODE pNode = pHead;
printf("此链表的数据分别为:");
while (pNode->pNext != NULL) {
printf("%d ", pNode->pNext->data);
pNode = pNode->pNext;
}
printf("\n");
}
//链表是否为空
bool isEmptyList(PNODE pHead)
{
if (NULL == pHead->pNext) {
return true;
}else{
return false;
}
}
//获得链表长度
int getListLenght(PNODE pHead)
{
int length = 0;
PNODE pNode = pHead->pNext;//pNode为首结点
while (NULL != pNode) {
length++;
pNode = pNode->pNext;
}
return length;
}
bool insertList(PNODE pHead, int location, int value)
{
if (isEmptyList(pHead)) {
printf("链表为空\n");
return false;
}
if (location<1 || location > getListLenght(pHead) + 1) {
printf("插入位置不正确\n");
return false;
}
PNODE pNew = (PNODE)malloc(sizeof(NODE));//新的结点
if(NULL == pNew)
{
printf("分配空间失败\n");
exit(-1);
}
PNODE pForwardLocation = pHead;//创建一个指针,指向头结点
for (int i = 1; i<location; i++) {
pForwardLocation = pForwardLocation->pNext;
}
//pForwardLocation永远指向要插入位置的前一个位置的指针
pNew->data = value;
pNew->pNext = pForwardLocation->pNext;
pForwardLocation->pNext = pNew;
return true;
}
bool deleteList(PNODE pHead, int location, int* pValue)
{
if (isEmptyList(pHead)) {
printf("链表为空\n");
return false;
}
if (location<1 || location > getListLenght(pHead)) {
printf("删除位置不正确\n");
return false;
}
PNODE pForwardLocation = pHead;//创建一个指针,指向头结点
for (int i = 1; i<location; i++) {
pForwardLocation = pForwardLocation->pNext;
}
//pForwardLocation永远指向要删除位置的前一个位置的指针
PNODE pDeleteNode = pForwardLocation->pNext;
*pValue = pDeleteNode->data;
pForwardLocation->pNext = pDeleteNode->pNext;
free(pDeleteNode);//需要把要删除的元素释放
return true;
}
void sortList(PNODE pHead)
{
if (isEmptyList(pHead)) {
printf("链表为空\n");
exit(-1);
}
PNODE pLocation = pHead->pNext;//创建一个指针,指向首结点
for (int i = 0; i<getListLenght(pHead) - 1; i++) {
pLocation = pHead->pNext;
for (int j = 0; j<getListLenght(pHead) - 1 - i; j++) {
if (pLocation->pNext != NULL) {
if (pLocation->data > pLocation->pNext->data) {//从小到大排序
int temp = pLocation->data;
pLocation->data = pLocation->pNext->data;
pLocation->pNext->data = temp;
}
pLocation = pLocation->pNext;
}
}
}
}
关于创建链表时的尾部结点理解,画了张图: