第一次写,大一,主要是当做笔记了,也经常在csdn上学习 也希望能到有需要的人吧。
也看了很多链表方面的知识和代码了 自己尝试写了一下。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
int data ;
struct Node *next;
}Node, *Linklist;
/*创建链表*/
Linklist Create_Linklist(int n,int a[])
{
Linklist head=(Linklist)malloc(sizeof(Node));//头节点
if (head == NULL)
{
printf("申请空间失败");
}
else {
head->next = NULL;//头节点指针域置空,因为链表结束就是最后一个节点的指针域为空,所以头节点指针域置空就和非空表统一起来了
Linklist p = head;//头指针指向头节点
//head是头结点指针,也就是头结点的地址,头指针指向头结点,也就是头指针保存了头结点的地址。
很明显看到p等于head,那为什么不直接用head呢?
下面你会发现,创建链表时你会发现p一直指向新创建的节点,也就是表尾,而我们的表头位置需要记录下来,所以就让p等于head,head记录表头位置,p做工作指针,随着链表的创建一直在移动 然后返回表头。
Linklist node;//节点指针
if (n > 0)
{
for (int i = 1; i <= n; i++)
{
node = (Linklist)malloc(sizeof(Node));
if (node)
{
node->data = a[i - 1];
p->next = node;
p = node;
}
else
{
printf("申请空间失败");
}
}
}
p->next = NULL;//前面说过链表的结束是最后一个节点指针域为空,所以这里不要忘了把最后一个节点指针域置空。
return(head);//返回头结点,也就是我们前面记录的表头位置
}
}
/*打印链表*/
void Print_Linklist(Linklist L)
{
Linklist head = L;
if(head==NULL||head->next==NULL)//头指针为空或头指针所指节点的下一个地址为空,即首元节点为空,也就是说,链表不存在或链表为空
{
printf("链表为空");
}
else
{
while (head->next)
{
printf("链表元素为%d ", head->next->data);
head = head->next;
}
printf(" ");
}
}
/*查找元素--按照位置*/
/*查找第i个元素*/
void Search_elem_location(Linklist L, int i)
{
Linklist head = L;
if(head==NULL||head->next==NULL)
{
printf("链表为空");
}
else
{
for (int j = 1; j <= i; j++)
{
head = head->next;
}
printf("该元素为:%d", head->data);
printf(" ");
}
}
/*这个函数好像没什么意义,当时随手写的我也忘了对错了……尴尬*/
// /*查找元素--按照数值*/
// /*查找特定数值的元素,并返回位置*/
// void Search_elem_data(Linklist L,int elem,int l)
// {
// Linklist head = L;
// if(head==NULL||head->next==NULL)
// {
// printf("链表为空");
// }
// while(head->next)
// {
//
// head=head->next;
// if(head->next->data!=elem)
// {
// printf("找到了该元素,该元素是第%d个",l);
// }
//
// }
// printf("没有该元素");
// }
/*修改数据*/
/*修改链表上第i个位置的数据*/
void Replace_Linklist(Linklist L,int i,int elem)
{
Linklist head = L;
for(int j=1;j<=i;j++)
{
head=head->next;
}
head->data=elem;
}
/*删除数据*/
void Delete_Linklist(Linklist L,int i)
{
Linklist head = L;
if(head==NULL||head->next==NULL)
{
printf("链表为空");
}
else
{
for(int j=1;j<=i;j++)
{
head=head->next;
}
}
free(head);
}
/*销毁链表*/
void Destroy_Linklist(Linklist *head)
{
Linklist p=*head,q;
if(p==NULL||p->next==NULL)
{
printf("链表为空");
}
while(p)
{
q=p->next;
free(p);
p=q;
}
}
int main()
{
int a[5]={1,2,3,4,5};
Linklist L=Create_Linklist(5,a);
Print_Linklist(L);
Search_elem_location(L,4);
Replace_Linklist(L,3,6);
Print_Linklist(L);
Destroy_Linklist(&L);
}