/*Change the world by PROGRAM让编程改变世界*/
/*这个小程序是用来创建一个单链表,可以指定开始创建的节点数量*/
/*一共有四个函数,用来创建链表,遍历链表,删除节点,倒置链表*/
/*Creat by Bingogo*/
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList, *p_LNode;
// 函数声明部分 //
p_LNode CreateLinkList();
void DeleteNode(p_LNode head, ElemType key);
void TraverseLinkList(p_LNode head);
p_LNode ReverseLinkList(p_LNode head);
// 开始 //
int main(){
/* 创建链表 */
printf("Create:element element ... 11111111(sign to end)\n");
p_LNode head = (p_LNode)malloc(sizeof(LNode));
if(!(head->next = CreateLinkList())){ // 若创建失败或不创建
getchar();
getchar();
printf("Program will be stopped.");
return 0;
}
printf("Create successfully.\n");
printf("The elements in the linklist you created is: ");
TraverseLinkList(head);
/* 倒置链表 */
// 记录最后一个结点位置
printf("Reverse the linklist.\n");
p_LNode node = head;
while(node->next) node = node->next;
// 开始倒置
if(!(head->next && head->next->next)) // 若链表为空或者只有一个链表
printf("Not nessesary to reverse.\n");
else {
ReverseLinkList(head->next);
head->next = node;
printf("After reversing: ");
TraverseLinkList(head);
}
/* 删除元素 */
printf("Input the key element that you want to delete.\n");
ElemType key;
scanf("%d", &key);
DeleteNode(head, key);
printf("After delete: ");
TraverseLinkList(head);
getchar();
getchar();
return 0;
}
// 函数定义部分 //
/*
*******************创建单链表(递归)************************
*/
p_LNode CreateLinkList(){
// 输入元素创建单链表 //
ElemType e;
scanf("%d", &e);
if(11111111 != e){
p_LNode node = (p_LNode)malloc(sizeof(LNode));
node->data = e;
node->next = CreateLinkList();
return node;
}
return NULL;
}
/*
********************遍历单链表*****************************
*/
void TraverseLinkList(p_LNode head){
while(head->next){
// 遍历操作 //
printf("%d ", head->next->data);
head = head->next;
}
printf("\n");
}
/*
***********************删除元素****************************
*/
void DeleteNode(p_LNode head, ElemType key){
while(head->next){
if(key == head->next->data){
p_LNode node = head->next;
head->next = node->next;
free(node);
}
head = head->next;
}
}
/*
************************倒置(递归)*************************
*/
p_LNode ReverseLinkList(p_LNode preNode){
if(preNode->next->next) // 只适用两个以上结点的单链表
ReverseLinkList(preNode->next);
preNode->next->next = preNode;
preNode->next = NULL;
}
C语言创建单链表
最新推荐文章于 2024-08-11 09:14:53 发布