c语言 链表 小程序,关于链表的一个小程序

关于链表的一个小程序:

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

/* 具备功能 */

/* 链表按元素位置插入 */

/* 链表按元素位置删除 */

/* 链表全表遍历 */

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

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

/* 链表整表删除 */

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

#include

#include

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值