纯当练习
链表头结点存储的信息是链表长度
平台VS2015
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct ListNode {
int val;
struct ListNode *next;
};
void createList(struct ListNode* list, int listsSize) {
struct ListNode *listHead = list; //指向头结点的头指针
struct ListNode *tail = listHead->next; //指向最后一个元素的尾指针
struct ListNode *p; //在头指针和尾指针之间活动的指针
struct ListNode *body; //用于创建新的节点
int i = 0;
if (listsSize <= 0)
return;
srand(time(NULL)); //用于创建随机数,我用随机数模拟了输入(懒),见21行和28行
puts("input:data");
body = (struct ListNode *)malloc(sizeof(struct ListNode));
body->next = NULL;
body->val = rand() % 10;
body->next = listHead->next;
listHead->next = body;
tail = body;
while (i<listsSize-1)
{
body = (struct ListNode *)malloc(sizeof(struct ListNode));
body->next = NULL;
body->val = rand() % 10;
if (body->val <= listHead->next->val)
{//如果数据小于第一个节点的数据(也就是头指针的下一个节点),
//就插在头指针及其后一个节点之间
body->next = listHead->next;
listHead->next = body;
}
else if (body->val > tail->val)
{//数据大于尾指针,则放到链表最后
tail->next = body;
tail = tail->next;
}
else
{//在第一个节点和最后一个节点范围之间,则寻找合适的大小位置
p = listHead->next;
while (body->val > p->next->val&&p != tail)
{
p = p->next;
}
body->next = p->next;
p->next = body;
}
i++;
}
list->val = listsSize;
}
void DisplayList(struct ListNode *list)
{
struct ListNode *p = list->next;
int i = 0;
while (i < list->val-1)
{
printf("%d->", p->val);
p = p->next;
i++;
}
printf("%d", p->val);
}
void DestroyList(struct ListNode *list)
{
struct ListNode *p = list->next;
while (p!= NULL)
{
free(list);
list = p;
p = p->next;
}
free(list);
}
int main()
{
struct ListNode *list = (struct ListNode *)malloc(sizeof(struct ListNode));
//默认创建链表长度为5
createList(list, 5);
//打印链表
DisplayList(list);
DestroyList(list);
system("pause");
return 0;
}