关于链表的一个小程序

关于链表的一个小程序:

/**************************链表*****************************/
/* 具备功能 */
/* 链表按元素位置插入 */
/* 链表按元素位置删除 */
/* 链表全表遍历 */
/* 链表整表创建(头插法) */
/* 链表整表创建(尾插法) */
/* 链表整表删除 */
/**************************链表*****************************/

#include<stdio.h>
#include<stdlib.h>

typedef struct node //链表存储结构
{
int data;
struct node *next;
}Node;

void LinkedListInitialization(Node **LinkedList); //链表初始化
int LinkedListTraverse(Node *LinkedList); //链表全表遍历
int LinkedListInsert(Node **LinkedList, int position, int data); //链表按元素位置插入
int LinkedListDelete(Node **LinkedList, int position); //链表按元素位置删除
void LinkedListCreateHeadInsertion(Node **LinkedList, int data[], int number); //链表整表创建(头插法)
void LinkedListCreateTailInsertion(Node **LinkedList, int data[], int number); //链表整表创建(尾插法)
void LinkedListDestroy(Node **LinkedList); //链表整表删除
void Welcome(); //菜单栏函数

int main()
{

int i=0;
int response;
int position;
int value;

Node *LinkedList=NULL; //设立头结点

LinkedListInitialization(&LinkedList); //链表初始化

printf("采用前插法,插入和删除传的参数改成了指向指针的指针\n--因为既然链表要变,那么就应该传指向链表指针的指针吧\n\n");
printf("*************************************************************************\n");

Welcome(); //菜单栏函数

while(scanf("%d", &response)==1)
{
switch(response)
{
case 1: printf("请输入要插入的链表位置和数值,用空格键分开(0--当前节点+1): ");
scanf("%d%d", &position, &value);
LinkedListInsert(&LinkedList, position, value); //链表插入, position表示插入位置,value是插入值
printf("\n");
break;

case 2: printf("请输入要删除的链表元素的位置(0--当前节点): ");
scanf("%d", &position);
LinkedListDelete(&LinkedList, position); //链表删除,position表示删除位置
printf("\n");
break;

case 3: printf("遍历链表的结果为: ");
LinkedListTraverse(LinkedList); //链表遍历
printf("\n");
printf("\n");
break;

case 4: return 1;
}

Welcome();
}

LinkedListDestroy(&LinkedList);
if(LinkedList->next==NULL)
printf("test!\n");
/*
Node *LinkedList=NULL; //设立头结点
int number=10;
int data[10]={1,2,3,4,5,6,7,8,9,10};
LinkedListCreateTailInsertion(&LinkedList, data, number);
LinkedListCreateHeadInsertion(&LinkedList, data, number);
LinkedListTraverse(LinkedList);

*/

return 1;
}

/*******************************链表初始化*******************************/

/* 因为实参是一个指针,故形参必须是一个二级指针,才能改变实参指针中的值*/
/* 给头结点分配空间,data域初始化为0, next域赋值NULL */

/*******************************链表初始化*******************************/

void LinkedListInitialization(Node **LinkedList)
{

*LinkedList =(struct node *)malloc(sizeof(Node));
(*LinkedList)->data = 0; //要加括号,->的优先级比*高
(*LinkedList)->next = NULL;

}

/*******************************链表全表遍历*****************************/

/*设定一个指针pointer指向头结点后面第一个元素,开始遍历,直到pointer为空 */

/*******************************链表全表遍历*****************************/

int LinkedListTraverse(Node *LinkedList)
{

Node *p;
p = LinkedList->next;

if(!p)
{
printf("没有数字,请先插入!");
return 1;
}

while(p->next != NULL)
{
printf("%d",p->data);
p = p->next;
}

printf("%d",p->data);
putchar(‘\n‘);

return 1;

}

/*******************************链表插入*****************************/

/* 在position位置进行插入数据data */
/* 使用pointer指针找到position前一个元素位置,而后进行插入操作 */

/*******************************链表插入*****************************/

int LinkedListInsert(Node **LinkedList, int position, int data)
{
int j;
Node * p,*s;
p = *LinkedList;
j = 1;

while(p && j < position) //找到下标position-1,因为有个头节点
{
p = p->next;
j++;
}

if(p== NULL ) //第i个节点不存在
{
printf("此时第i个节点不存在,请位置数值小一点,可以先遍历以下。\n\n");
return 1;
}

s = (struct node *)malloc(sizeof(Node));
s->data = data;
s->next = p->next;
p->next = s;

return 1;
}

/*******************************链表删除*****************************/

/* 在position位置删除结点 */
/* 使用pointer指针找到position前一个元素位置,而后进行删除操作 */

/*******************************链表删除*****************************/

int LinkedListDelete(Node **LinkedList, int position) //这里也是,应该加个*吧?
{

int j;
Node * p,*s;
p = *LinkedList;
j = 1;

while(p && j < position) //找到下标为position-1
{
p = p->next;
j++;

}

if(p==NULL || j!=position ||p->next ==NULL)
{
printf("输入的节点有误,请用1查清楚再输入!\n\n");
return 1;

}

s = p->next;
p->next = p->next->next;
free(s);

return 1;
}

/***************************链表整表创建(头插法)*******************/

/* 新加入的结点总是跟在头结点后边 */

/***************************链表整表创建(头插法)*******************/

void LinkedListCreateHeadInsertion(Node **LinkedList, int data[], int number)
{
Node * s;
int i;

*LinkedList =(struct node *)malloc(sizeof(Node));
(*LinkedList)->next = NULL;
(*LinkedList)->data = 0;

for(i = 0; i < number; i++)
{
s = (struct node *)malloc(sizeof(Node));
s->data = data[i];
s->next =(* LinkedList)->next;
(*LinkedList) ->next = s;
}

}

/***************************链表整表创建(尾插法)*******************/

/* 设立一个尾指针tail,tail总是指向链表的末尾。新加入的结点链接到tail
的末尾,同时更新tail指针,使其指向新加入的结点(链表的末尾) */

/***************************链表整表创建(尾插法)*******************/

void LinkedListCreateTailInsertion(Node **LinkedList, int data[], int number)
{
Node * s,*r;
int i;

*LinkedList =(struct node *)malloc(sizeof(Node));
(*LinkedList)->next = NULL;
(*LinkedList)->data = 0;

r = *LinkedList;
for(i = 0; i < number; i++)
{
s = (struct node *)malloc(sizeof(Node));
s->data = data[i];
r->next = s;
r = s;
}

r->next = NULL;

}

/***************************链表整表删除*******************/

/* 设置p,q两个指针, q指向p的下一个元素。释放p指向的结点后,
把q的值赋给p, 同时q更新为下一个元素 */

/***************************链表整表删除*******************/

void LinkedListDestroy(Node **LinkedList)
{
Node *p,*q;
p =(*LinkedList)->next;

while(p->next !=NULL)
{
q = p;
p = p->next;
free(q);
}

(*LinkedList)->next = NULL;

}

/*******************菜单栏函数***********************/

void Welcome()
{
printf("欢迎光临链表!请按1,2,3,4选择对应功能:\n");
printf("1. 链表按元素位置插入:\n");
printf("2. 链表按元素位置删除:\n");
printf("3. 链表全表遍历:\n");
printf("4. 退出:\n\n");
}

时间: 2024-10-21 16:02:49

关于链表的一个小程序的相关文章

原创观点:还在认为企业或个人只能申请一个小程序吗?

今天第一次体验了整个小程序注册流程,使用的是我自己的这个简单的教程(个人无appid如何进行申请开发者权限,简单操作步骤),教程虽然是我的,我自己却没有真的实践过,真是误人子弟,自己也不一定能知道:今天亲自测试了一下:首先走完邮箱验证: 验证完毕后,开始进入信息登录,这里,有一些关键信息,是本文观点的主要支撑: 请输入管理员的身份证号码,一个身份证号码只能注册5个小程序. 然后填写完毕后,到了第二个关键点: 为了验证你的身份,请用绑定了管理员本人银行卡的微信扫描二维码. 这个点,透露了两个信息,

先做一个“小程序”——关于微信应用号的六大猜想

先做一个“小程序”——关于微信应用号的六大猜想 9月 21 日,苦等了9个多月的时间,应用号终于与我们见面了,命名为「小程序」. 01 为什么推出小程序? 考虑到小程序对整个APP市场的影响,毫无疑问会对现有的APP生态带来一定的冲击.但是,之所以推出小程序,最直接的原因可能是为了构建和扩充微信生态链,让微信更具开放性. 如我们所知,目前微信公众号分为三类: • 服务号,连接人和商品,目前很多电商企业,以及在微信端提供产品和服务的企业都用服务号. • 订阅号,微信官方的定位是阅读,连接人和资讯的

Python 练习册,每天一个小程序

Python 练习册,每天一个小程序 说明: Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也适用 不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 点此链接,会看到每个题目的代码, 欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) 本文本文由@史江歌([email protected] QQ:499065469)根据互联网资料收集整理而成,感谢互联网,感谢各位的分享.鸣谢!本文会不断更新. Talk is chea

Python练习册,每天一个小程序

Python练习册,每天一个小程序 精选评论关注该公众号可参与评论 写评论 加载中 以上评论由公众帐号筛选后显示 Python练习册,每天一个小程序 提交 我的评论 已评论 Python练习册,每天一个小程序 2014-12-15 程序猿 说明: ●Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也试用 ●不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 ●欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) ●访问链接h

一个小程序能够反映的能力

程序员小郑刚步入岗位,但是在公司编码过程中没有受到专业的编码规范的培训,编写出来的程序虽然能够完成指定的功能但是比较不统一,偶尔会别出心裁的设计出自己的简化方法.老王这是从事了软件编码十多年了,现在都快到不惑的年龄了,在软件行业摸爬滚打十多年从事过多个行业,接触过不同公司的编码的规范,在软件代码编写中有独到的认识. 有一天有一个小功能的改动,由于这是一个非常重要的基础系统的功能变动,所以即便是一个小的功能变动公司上上下下都投入了非常高的重视程度.这天老王找到小郑告诉了需要修改这个系统并详细的描述

Python 练习冊,每天一个小程序

Python 练习冊,每天一个小程序 说明: Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 欢迎大家 Pull Request 出题目.贴代码(Gist.Blog皆可):-) Talk is cheap. Show me the code.--Linus Torvalds 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字.类似于微

mono for Android 环境配置(环境搭建+破解方法+运行一个小程序)

一.准备工作:下载相关软件工具,为搭建环境做准备. 哎!百度网盘无法分享,根据名称下载. 二.首先安装 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008 这里选择安装jdk6,网上看到一篇文章说jdk7及以上,mono还没有支持,但是那篇文字一年前写的,目前 支不支持,不清楚.这里保险起见,安装jdk6,mono是支持的.    注意环境变量的配置,这里不详细描述.主要配置java_home,path,class_path. 三.安装mono-2.1

c++学习笔记---02---从一个小程序说起

从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大家一起动手! 参考: #include <stdio.h> int addArray( int array[], int n ); int main() { int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int size = sizeof(data) /

c++学习笔记---03---从一个小程序说起2

从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入结束.程序自动对所有的整数进行求和并打印出结果. C语言版本: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main() 5 { 6 int i; 7 int sum = 0; 8 char ch; 9 10 printf(&