#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
}NODE, *pNODE;
pNODE create_Linklist(void);
void show_Linklistshow_Linklist(pNODE pHead);
int isEmpty_Linklist(pNODE pHead);
int getLength_Linklist(pNODE pHead);
int insert_Linklist(pNODE pHead, int pos, int data);
int delete_Linklist(pNODE pHead, int pos);
void free_Linklist(pNODE *ppHead);
pNODE create_Linklist(void)
{
int i, length, data;
pNODE p_new = NULL, pTail = NULL;
pNODE pHead = (pNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
pHead->data = 0;
pHead->pNext = NULL;
pTail = pHead;
printf("请输入要创建链表的长度:");
scanf("%d", &length);
for (i=0; i<length; i++)
{
p_new = (pNODE)malloc(sizeof(NODE));
if (NULL == p_new)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
printf("请输入第%d个节点的值:", i+1);
scanf("%d", &data);
p_new->data = data;
p_new->pNext = NULL;
pTail->pNext = p_new;
pTail = p_new;
}
return pHead;
}
void show_Linklist(pNODE pHead)
{
pNODE pt = pHead->pNext;
printf("打印链表:");
while (pt)
{
printf("%d ", pt->data);
pt = pt->pNext;
}
putchar('\n');
}
int isEmpty_Linklist(pNODE pHead)
{
if (pHead->pNext == NULL)
return 1;
else
return 0;
}
int getLength_Linklist(pNODE pHead)
{
int length = 0;
pNODE pt = pHead->pNext;
while (pt)
{
length++;
pt = pt->pNext;
}
return length;
}
int insert_Linklist(pNODE pHead, int pos, int data)
{
pNODE pt = NULL, p_new = NULL;
if (pos > 0 && pos < getLength_Linklist(pHead) + 2)
{
p_new = (pNODE)malloc(sizeof(NODE));
if (NULL == p_new)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
p_new->data = data;
while (1)
{
pos--;
if (0 == pos)
break;
pHead = pHead->pNext;
}
pt = pHead->pNext;
pHead->pNext = p_new;
p_new->pNext = pt;
return 1;
}
else
return 0;
}
int delete_Linklist(pNODE pHead, int pos)
{
pNODE pt = NULL;
if (pos > 0 && pos < getLength_Linklist(pHead) + 1)
{
while (1)
{
pos--;
if (0 == pos)
break;
pHead = pHead->pNext;
}
pt = pHead->pNext->pNext;
free(pHead->pNext);
pHead->pNext = pt;
return 1;
}
else
return 0;
}
void free_Linklist(pNODE *ppHead)
{
pNODE pt = NULL;
while (*ppHead != NULL)
{
pt = (*ppHead)->pNext;
free(*ppHead);
*ppHead = pt;
}
}
int main(void)
{
int flag = 0, length = 0;
int position = 0, value = 0;
pNODE head = NULL;
head = create_Linklist();
flag = isEmpty_Linklist(head);
if (flag)
printf("单向链表为空!\n");
else
{
length = getLength_Linklist(head);
printf("单向链表的长度为:%d\n", length);
show_Linklist(head);
}
printf("请输入要插入节点的位置和元素值(两个数用空格隔开):");
scanf("%d %d", &position, &value);
flag = insert_Linklist(head, position, value);
if (flag)
{
printf("插入节点成功!\n");
show_Linklist(head);
}
else
printf("插入节点失败!\n");
flag = isEmpty_Linklist(head);
if (flag)
printf("单向链表为空,不能进行删除操作!\n");
else
{
printf("请输入要删除节点的位置:");
scanf("%d", &position);
flag = delete_Linklist(head, position);
if (flag)
{
printf("删除节点成功!\n");
show_Linklist(head);
}
else
printf("删除节点失败!\n");
}
free_Linklist(&head);
if (NULL == head)
printf("已成功删除单向链表,释放内存完成!\n");
else
printf("删除单向链表失败,释放内存未完成!\n");
return 0;
}