二刷链表,纪念一下。
代码实现了以下的功能:
- 链表的创建。
- 链表的输出。
- 判断链表是否为空。
- 插入结点。
- 删除结点。
- 计算链表的长度。
- 排序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct Node
{
int date;//数据域
struct Node * next;//指针域
}NODE;
NODE * creatList()
{
int len;
int i;
int value;
NODE * head = (NODE * )malloc(sizeof(NODE));//创建头结点,head存放其地址。
if(NULL == head)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
NODE * tail = head;//定义尾指针,一直指向最后一个结点。
tail->next = NULL;
printf("请输入您需要生成的链表结点的个数:len = ");
scanf("%d", &len);
for(i = 1; i <= len; i++)
{
printf("请输入第%d个结点的值:\n", i);
scanf("%d", &value);
NODE * p = (NODE * )malloc(sizeof(NODE));
if(NULL == p)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
p->date = value;//给新创建的链表数据域赋值。
tail->next = p;
p->next = NULL;
tail = p;
}
return head;
}
void traverseList(NODE * head)
{
NODE * p = head->next;
while(p != NULL)
{
printf("%5d",p->date);
p = p->next;
}
printf("\n");
return;
}
bool is_empty(NODE * head)
{
if(head->next == NULL)
return true;
else
return false;
}
bool insert(NODE * head, int position, int value)
//在第positi个结点的前面插入一个新的结点,新的结点的数据域为value。
{
int i = 0;
NODE * p = head;
while(NULL != p && i<position-1)
{
p = p->next;
i++;
}
if(i>position-1 || NULL == p)
return false;
//此时p指向第position个结点。
NODE * pVal = (NODE * )malloc(sizeof(NODE));
if(NULL == pVal)
{
printf("动态分配内存失败!\n");
exit(-1);
}
pVal->date = value;
//分配内存,pVal指向新的结点,把value赋值给新的结点的数据域。
NODE * p1 = p->next;//p此时指向第position-1个结点。p1指向第positon个结点。
p->next = pVal;//把新的结点挂在第position-1个结点后面。
pVal->next = p1;//原先链表的第positon个结点挂在新的链表后面。
return true;
}
bool delete(NODE * head, int position, int * pVal)
//删除第position个结点,并把此结点的数据域的值赋值给main函数中的int类型的变量。
{
int i = 0;
NODE * p = head;
while(NULL != p->next && i<position-1)
{
p = p->next;
i++;
}
if(i>position-1 || NULL == p->next)
return false;
NODE * p1 = p->next;//p1指向要删除的结点。
* pVal = p1->date;//把要删除的结点的值赋值给* pVal。
p->next = p->next->next;
free(p1);
p1 = NULL;
return true;
}
int length(NODE * head)
{
int len = 0;
NODE * p = head->next;
while(p != NULL)
{
len++;
p = p->next;
}
return len;
}
void sort(NODE * head)
{
int i, j, t;
int len = length(head);
NODE * p, * q;
for(i = 0, p = head->next; i < len-1; i++, p = p->next)
for(j = i+1,q = p->next; j<len; j++, q = q->next)
{
if(p->date>q->date)
{
t = p->date;
p->date = q->date;
q->date = t;
}
}
return;
}
int main(void)
{
NODE * head = NULL;
int val;
head = creatList();//创建一个非循环单链表。
if(is_empty(head))//判断链表是否为空。
printf("链表为空!\n");
else
printf("链表不为空!\n");
printf("创建链表成功后,链表输出:\n");
traverseList(head);//遍历链表。
printf("排序后,链表输出:\n");
sort(head);
traverseList(head);
printf("链表长度为%d\n",length(head));//输出链表的长度。
insert(head, 4, 33);//把33插入到第三和第四个结点之间。
printf("插入成功后,链表输出:\n");
traverseList(head);
printf("\n");
if(delete(head, 4, &val))//删除第四个结点,并把其数据域的值赋给val。
printf("删除成功,您删除的元素是:%d\n",val);
else
printf("删除失败,您删除的元素不存在!\n");
// printf("删除成功后,链表输出:\n");
// traverseList(head);
return 0;
}
代码运行后。