#include <stdio.h>
#include <stdlib.h> typedef struct linklist
{
unsigned int count;
struct linklist *next;
}linklist; linklist* CreatLinklist(int len)
{
linklist *head = NULL, *pre = NULL;
head = (linklist*)malloc(sizeof(linklist));//头指针。
pre = (linklist*)malloc(sizeof(linklist)); //pre-previous, 前一个;相对于head来说是后一个。
printf("Please input the data:\n");
scanf("%u", &pre->count);
head->next = pre; //head的后一个是pre。
pre->next = NULL; //pre的next是NULL。 for (int i = ; i < len; i++)
{
linklist* tmp = (linklist*)malloc(sizeof(linklist));
scanf("%u", &tmp->count);
pre->next = tmp; //新加的节点放在pre后。
tmp->next = NULL; //新加节点的next是NULL。
pre = tmp; //新加的节点变成pre,等待下一个tmp。
}
return head;
} int Outputlinklist(linklist *head)
{
printf("#### Output linklist.\n");
if (head != NULL)
{
while (head->next != NULL)
{
printf("%u\n", head->next->count);
head = head->next;
}
}
} int Lenlinklist(linklist *head)
{
int len = ;
if (NULL == head->next)
return len;
len++;
linklist *p = NULL;
p = head->next;
while(p->next != NULL)
{
len++;
p = p->next;
}
return len;
} int InsertLinklist(linklist *head, int index)
{
int len = ;
len = Lenlinklist(head);
printf("the length of linklist:%d, the insert index:%d\n", len, index);
if (index < || index > len)
return -;
int cur_index = ;
linklist *p = NULL;
p = head->next;
while(cur_index < index)
{
p = p->next;
cur_index++;
}
linklist *node = (linklist*)malloc(sizeof(linklist));
printf("Please input the new node data:\n");
scanf("%u", &node->count);
node->next = p->next;
p->next = node;
return ;
} int DeleteNode(linklist *head, int index)
{
int len = ;
len = Lenlinklist(head); if((index < ) || (index > len))
return -; int cur_index = ;
linklist *p = NULL;
linklist *q = NULL;
p = head->next;
while(cur_index < index)
{
p = p->next;
cur_index++;
}
q = p->next;
p->next = q->next;
free(q);
q = NULL;
} linklist *Reverselinklist(linklist *head)
{
linklist *p=NULL, *pre=NULL, *pnext=NULL; p = head->next;
while(p!=NULL)
{
pnext = p->next;
if(pnext == NULL)
head->next = p;
p->next = pre;
pre = p;
p = pnext;
}
return head;
} int main(void)
{
linklist *mylist = NULL; printf("#### Creat linklist.\n");
mylist = CreatLinklist();
Outputlinklist(mylist); printf("#### Insert new node.\n");
InsertLinklist(mylist, );
Outputlinklist(mylist); printf("#### Delete exist node.\n");
DeleteNode(mylist, );
Outputlinklist(mylist); printf("#### Reverse Linklist.\n");
Reverselinklist(mylist);
Outputlinklist(mylist); printf("Handle complete!");
}

1.线性表的链式存储和顺序存储的比较。

常见的数组就是线性表的顺序存储,各个结点之间被分配连续的物理内存,因此在查找上直接可以使用下标,速度很快,但是对于插入和删除操作需要在操作点之后执行移动操作,较为麻烦,并且数组在之前需要分配内存的大小,也就是需要我们知道结点的数量,这样就有一定的限制。
链表就是线性表的链式存储,各个结点之间在物理内存中是随机分配的,在查找时需要逐个遍历,但是在插入和删除操作时仅仅是局部性的指针切换,并且链表只有创建结点和删除结点时才会对内存进行操作,事先不需要知道结点数量。

2.单向链表属于线性表链式存储中最简单的一类,常见的操作包括:创建、删除、查找、插入、反序等。

最新文章

  1. 解决mysql too many connections的问题
  2. left join 多个表关联时,将表值置换
  3. AC日记——红与黑 codevs 2806
  4. C语言中的经典例题用javascript怎么解?(一)
  5. android动态调试samli代码(转)
  6. Java_一些特殊的关键字详(?)解
  7. svnadmin:error while loading shared libraries: libaprutil-1.so.0:cannot open shared object file: No such file or directory
  8. Project Euler 101 :Optimum polynomial 最优多项式
  9. SQLite使用教程9 Select 语句
  10. ###Canny边缘检测算子
  11. asp.net取HTML控件值
  12. VS2010使用附加进程的方式调试IIS中的页面介绍
  13. 【网络流量最大流量】poj3281Dining
  14. 一、ASP.NET Routing路由(深入解析路由系统架构原理)
  15. 认识cookie与session的区别与应用
  16. Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量
  17. day 27 异常处理
  18. 5月21 回话控制SESSION COOKIE
  19. java面向对象基础(三):对象转型和多态
  20. JavaScript 扩展运算符

热门文章

  1. [c][c++]按位操作
  2. kbengine学习2 创建项目
  3. python 读写TXT,安装pandas模块。
  4. TStringList 常用方法与属性
  5. Vue.js的后端数据支持:使用Express建立app, 并使用MongoDB数据库。
  6. Vue.js示例:文本编辑器。使用_.debounce()反抖动函数
  7. 第一阶段——站立会议总结DAY02
  8. Mac OS下安装和配置MongoDB
  9. poj-2689-素数区间筛
  10. JS实现下拉单的二级联动