我看到很多代码都是传递的引用,想着试试自己用纯C语言的用法来试试,虽然遇到些许困难,最后还是成功了,代码如下
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode* next;
}LNode, *LinkList;
void InsertElement(LinkList *list);
void DeleteElement(LinkList *list);
void CreateList_First(LinkList *list);
void CreateList_Last(LinkList *list);
void ShowList(LinkList list);
int main()
{
int method;
LinkList list;
printf("请输入建立链表方法: 1-头插法 2-尾插法");
scanf("%d", &method);
if(method == 1)
{
CreateList_First(&list);
}
else if(method ==2)
{
CreateList_Last(&list);
}
ShowList(list);
DeleteElement(&list);
return 0;
}
void CreateList_First(LinkList *list)
{
*list = NULL;
int length, value;
printf("请输入要创建的链表长度: ");
scanf("%d", &length);
for(int i=1; i<=length; i++)
{
LNode* newNode = (LNode*)malloc(sizeof(LNode*));
printf("请输入要插入的第 %d 个元素的值: ", i);
scanf("%d", &value);
newNode->data = value; //初始化新节点
newNode->next = NULL; //初始化新节点
if(*list == NULL)
{
*list = newNode; //若为空表,则将头指针指向新节点
}
else{
newNode->next = *list;
*list = newNode;
}
}
}
void CreateList_Last(LinkList *list)
{
*list = NULL;
int length, value;
LinkList tail_Ptr = *list;
printf("请输入要创建的链表长度: ");
scanf("%d", &length);
for(int i=1; i<=length; i++)
{
printf("请输入要插入的第 %d 个元素的值: ", i);
scanf("%d", &value);
LNode* newNode = (LNode*)malloc(sizeof(LNode*));//创建新节点
newNode->data = value; //初始化新节点
newNode->next = NULL; //初始化新节点
if(*list == NULL)
{
*list = newNode; //若表为空,则将头指针指向第一个节点
tail_Ptr = newNode; //将尾指针指向最后创建出来的节点
}
else
{
tail_Ptr->next = newNode;
tail_Ptr = tail_Ptr->next;
}
}
}
void DeleteElement(LinkList *list) //删除元素
{
int position;
printf("请问要删除哪个位置的元素?");
scanf("%d", &position);
LNode* locate_Ptr = *list; //定义一个用于查找位置的指针,最开始在表头
if(position == 1)
{
*list = locate_Ptr->next; //若要删除的是第一个元素,则直接将头指针往后移一位即可
free(locate_Ptr); //释放掉定位指针所指向的那一片内存区域
printf("删除成功!下面是更新后的链表\n");
ShowList(*list);
return;
}
for(int i=1; i<position-1; i++)
{
locate_Ptr = locate_Ptr->next; //将定位指针定位到要删除的节点的前一个节点
}
LNode* temp = locate_Ptr->next; //定义一个指针temp,指向要删除的节点
locate_Ptr->next = temp->next;
free(temp);
printf("删除成功!下面是更新后的链表\n");
ShowList(*list);
}
void ShowList(LinkList list)
{
int index = 1;
while(list != NULL)
{
printf("该表第 %d 个元素为: %d\n",index,list->data);
//system("pause");
list = list->next;
index++;
}
}