关于链表的一个小程序

Posted 醉卧何处

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于链表的一个小程序相关的知识,希望对你有一定的参考价值。

关于链表的一个小程序:

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

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

 

以上是关于关于链表的一个小程序的主要内容,如果未能解决你的问题,请参考以下文章

关于2019夏季小学期收获与感想

左神算法书籍《程序员代码面试指南》——2_07将单向链表按某值划分成左边小中间相等右边大的形式

暑假日报-4

每日日报第四天

有关链表的小技巧,我都给你总结好了

编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织到链表中