当前位置:网站首页>2021-04-12 链表第一次实现!!!

2021-04-12 链表第一次实现!!!

2022-06-23 09:41:00 Mr. Rabbit.

#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node
{
    
    DataType Data;
    struct Node*Next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L)							//带有头节点的单链表的初始化
{
    
	(*L) = (LinkList)malloc(sizeof(Node));
	if (!L)
	{
    
		printf("分配内存失败!\n");
		exit(0);
	}
	(*L)->Next = NULL;
	return 0;
}
int ListEmpty(LinkList H)//就是看头结点的指针域是否为空;
{
    
    return H->Next==NULL;
}
void CreatFormHead(LinkList H)//逆序;
{
    
    DataType data;//建立一个data型的数据类型;
    Node*s;//需要插入的结点指针;
    scanf("%d",&data);//给数据域赋值;
    while(data!=-1)
    {
    
        s=(Node*)malloc(sizeof(Node));//给插入的节点分配空间;
        s->Data=data;//给结点的数据域赋值;
        s->Next=H->Next;
        H->Next=s;//头插法的最重要两步骤;
        scanf("%d",&data);//继续赋值;
    }
}
void CreatFormTail(LinkList H)//顺序;
{
    
    Node*tail;
    tail=H;
    DataType data;//建立一个data型的数据类型;
    Node*s;//需要插入的结点指针;
    scanf("%d",&data);//给数据域赋值;
    while(data!=-1)
    {
    
        s=(Node*)malloc(sizeof(Node));//给插入的节点分配空间;
        s->Data=data;//给结点的数据域赋值;
        s->Next=tail->Next;
        tail->Next=s;//头插法的最重要两步骤;
        tail=s;//tail始终指向尾部;
        scanf("%d",&data);//继续赋值;
    }
}
Node*Get(LinkList H,int i)
{
    
    Node*p;//结点指针;
    int j=0;
    p=H;
    if(ListEmpty(H))//空表;
    {
    
        printf("表为空!/n");
        return 0;
    }
    while(!ListEmpty&&j<i)
        {
    
            p=p->Next;
            j++;
        }
        if(j==0)
            return p;
        return NULL;
}
int Locate(LinkList H,DataType data)//按值查找;
{
    
    Node*p=H->Next;
    int i=1;
    while(p)
    {
    
        while(p->Data!=data)
        {
    
            p=p->Next;
            i++;
        }
        break;
    }
    return i;
}
int length(LinkList H)//求表长;
{
    
    Node*p;
    p=H;
    int len=0;
    while(p->Next!=NULL)
    {
    
        len++;
        p=p->Next;
    }
    return len;
}
void InsList(LinkList H,int i,DataType data)//插入操作;
{
    
    Node*p;
    Node*s;
    p=H;
    int j=0;
    while(p->Next!=NULL&&j<i-1)
    {
    
        p=p->Next;
        j++;
    }
    if(p==NULL)
    {
    
        return;
    }
    s=(Node*)malloc(sizeof(Node));
    s->Data=data;
    s->Next=p->Next;
    p->Next=s;
}
int DelList(LinkList H,int i,DataType*data)//删除操作;
{
    
    Node*p;
    Node*s;
    p=H;
    int k=0;
    while(i<0||i>length(H))
    {
    
       printf("删除位置不合法!");
       return 0;
    }
    if(p->Next!=NULL&&k<i-1)
    {
    
       p=p->Next;
       k++;
    }
    s=p->Next;
    *data=s->Data;
    p->Next=s->Next;
    free(s);
    return *data;
}
void DestoryList(LinkList H)//销毁链表;
{
    
    Node*p;
    Node*q;
    p=H;
    while(p->Next!=NULL)
    {
    
        q=p;
        p=p->Next;
        free(q);
    }
}
void PrintList(LinkList H)
{
    
    Node*p;
    p=H->Next;
    while(p)
    {
    
        printf("%d",p->Data);
        p=p->Next;
    }
    printf("\n");
}
int main()
{
    
LinkList(L);
LinkList(L1);
DataType data;
int num;//需要操作的元素序号
int val;//插入元素值
InitList(&L);
InitList(&L1);
printf("头插法建表(L1):\n");
CreatFormHead(L1);
printf("链表中的元素有:\n");
PrintList(L1);
printf("\n");
printf("尾插法建表(L):");
CreatFormTail(L);
printf("链表中的元素有:\n");//后面为对尾插法所建表的操作
PrintList(L);
printf("\n");
printf("在链表中插入一个元素:\n");
printf("请输入插入位置:");
scanf("%d",&num);
printf("请输入插入元素值:");
scanf("%d",&val);
InsList(L,num,val);
printf("链表中的元素有:\n");
PrintList(L);
printf("\n");
printf("删除链表中的元素:\n");
printf("请输入删除位置:");
scanf("%d",&num);
DelList(L,num,&data);
printf("删除元素的值为%d\n",data);
printf("\n");
printf("链表中的元素有:\n");
PrintList(L);
printf("\n");
printf("链表的长度为:%d\n",length(L));
printf("\n");
printf("请输入要查找的元素序号:\n");
scanf("%d",&num);
Node*p=Get(L,num);
printf("第%d个元素值为:%d\n",num,p->Data);
printf("请输入要查找的元素值:\n");
scanf("%d",&val);
printf("%d在表中的位置序号为:%d\n",val,Locate(L,val));
printf("\n");
system("pause");
return 0;
}
参考曹记东老师
```c
在这里插入代码片

原网站

版权声明
本文为[Mr. Rabbit.]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_52340450/article/details/115641580