博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于链表的一个小程序
阅读量:5075 次
发布时间:2019-06-12

本文共 5577 字,大约阅读时间需要 18 分钟。

关于链表的一个小程序:

/**************************链表*****************************/

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

#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");
}

 

转载于:https://www.cnblogs.com/zxj-262410/p/6691268.html

你可能感兴趣的文章
jsp:attribute
查看>>
在静态页面html中跳转传值
查看>>
0基础学java_逻辑变量 逻辑表达式 和条件句
查看>>
0基础学java_Java类集之LinkedList
查看>>
单元测试
查看>>
Windows & Ubuntu Vscode 配置c++环境
查看>>
ubuntu12.10安装NCL问题
查看>>
bootstrap fileinput-上传回调
查看>>
Android -- 在一个Activity开启另一个Activity 并 获取他的返回值。
查看>>
【Java】线程池的作用
查看>>
后端接收不到AngularJs中$http.post发送的数据的问题
查看>>
查看python,selenium版本号
查看>>
js 时间 Fri Dec 12 2014 08:00:00 GMT+0800
查看>>
图片加载前的占位高度预设纯CSS实现(自适应屏幕的高宽比)——CSS黑魔法
查看>>
UI设计素材
查看>>
[转]SQL Server 高性能写入的一些总结
查看>>
页面跳转及数据传输的作业
查看>>
什么是接口?
查看>>
python 类、函数的引用
查看>>
android Activity 生命周期
查看>>