c语言线性表的链式存储的实现

下面是链表的一些基本操作,使用c语言实现
#include "HA.h"


int main()
{
    int e,n,select=1;

    LinkList L;
    LinkList T;
    printf("请输入所要创建链表的结点个数\n");
    scanf("%d",&n);
    printf("****************************\n");
    printf("*请输入下列指定数字进行操作*\n");
    printf("* [0] 退出程序             *\n");
    printf("* [1] 头插法建立链表       *\n");
    printf("* [2] 尾插法建立链表       *\n");
    printf("* [3] 遍历链表并输出       *\n");
    printf("* [4] 清空链表             *\n");
    printf("* [5] 计算链表的长度       *\n");
    printf("* [6] 获取指定位置的元素   *\n");
    printf("* [7] 求元素第一次出现位置 *\n");
    printf("* [8] 在指定位置插入元素   *\n");
    printf("* [9] 删除指定位置的元素   *\n");
    printf("* [10] 将链表逆转          *\n");
    printf("****************************\n");
    while(select)
    {
        printf("请选择:>>");
        scanf("%d",&select);
        if(select==0)
            break;
switch(select)
        {
        case 1:
            CreateListHead(&L,n);
            break;
        case 2:
            CreateListTail(&L,n);
            break;
        case 3:
            ListTraverse(L);
            break;
        case 4:
            ClearList(L);
            break;
        case 5:
            ListLength(L);
            break;
        case 6:
            printf("请输入要求元素的位置\n");
            int t;
            scanf("%d",&t);
            GetElem(L,t,e);
            break;
        case 7:
            printf("请输入元素\n");
            int c;
            scanf("%d",&c);
            LocateElem(L,c);
            break;
        case 8:
            printf("请输入要插入的位置和元素\n");
            int a,b;
            scanf("%d %d",&a,&b);
            ListInsert(L,a,b);
            break;
        case 9:
            printf("请输入要删除元素的位置\n");
            int y;
            scanf("%d",&y);
            ListDelete(L,y);
            break;
        case 10:
            ListReverse(L,&T,3);
            printf("逆转后的元素为\n");
            ListTraverse(T);
            break;
        default:
            printf("输入指令有误,请重新输入\n");
            break;
        }

    }

}

#ifndef HA_H
#define HA_H
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

void CreateListHead(LinkList *L,int n);//头插法创建链表
void CreateListTail(LinkList *L,int n);//尾插法创建链表
void ListTraverse(LinkList L);//链表的遍历和输出
void ListLength(LinkList L);//求链表的长度
void ClearList(LinkList L);//将链表变为空表
void GetElem(LinkList L,int i,ElemType e);//打印第I个位置的元素
void LocateElem(LinkList L,ElemType e);//求元素e的第一次出现的位置
void ListInsert(LinkList L,int i,int e);//在第i个位置插入元素e
void ListDelete(LinkList L,int i);//删除第i个位置的元素
void ListReverse(LinkList L,LinkList *T,int n);//将链表逆转
#endif // HA_H
#include "HA.h"

void CreateListHead(LinkList *L, int n)//头插法,产生的链表顺序是反的
{
	LinkList p;
	int i,x;

	*L = (LinkList)malloc(sizeof(Node));
	(*L)->next = NULL;
	printf("请输入:>>\n");                     /*  先建立一个带头结点的单链表 */
	for (i=0; i<n; i++)
	{
	    scanf("%d",&x);
		p = (LinkList)malloc(sizeof(Node)); /*  生成新结点 */
		p->data = x;             /*  随机生成100以内的数字 */
		p->next = (*L)->next;
		(*L)->next = p;						/*  插入到表头 */
	}
}

void CreateListTail(LinkList *L,int n)//尾插法,每新加入一个结点都在下一个节点的后面,产生的链表顺序正常
{
    LinkList p,r;
    int i,x;
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
    r=*L;
    printf("请输入:>>\n");
    for(i=0;i<n;i++)
    {
        scanf("%d",&x);
        p=(LinkList)malloc(sizeof(Node));
        p->data=x;
        r->next=p;
        r=p;
    }
    r->next=NULL;
}

void ListTraverse(LinkList L)//链表的遍历,依次打印出每个元素
{
    LinkList p=L->next;//创建一个结点指向头结点的下一个,即创建链表的第一个结点
    while(p)
    {
        printf("%d\n",p->data);
        p=p->next;//每一次的p都变换位置,所以可以访问到链表的每一个元素
    }


}

void ListLength(LinkList L)//返回线性表的长度
{
    int i=0;
    LinkList p=L->next;
    while(p)
    {
        i++;
        p=p->next;
    }
    printf("线性表的长度为:%d\n",i);

}

void ClearList(LinkList L)//将L变成空表
{
    LinkList p,q;
    p=L->next;
    while(p)
    {
        q=p->next;

        free(p);
        p=q;
    }
    L->next=NULL;

}

void GetElem(LinkList L,int i,ElemType e)//打印第i个位置的元素e
{
    int j;
    LinkList p;
    p=L->next;
    j=1;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    e=p->data;
    printf("%d\n",e);

}

void LocateElem(LinkList L,ElemType e)//打印第一个和l相同的元素
{
    int i=0,j=0,t=0;
    int flag=0;
    LinkList p;
    p=L->next;
    while(p)
    {
        i++;

        if(p->data==e)
        {
            j=i;
            break;

        }
        p=p->next;


    }
    printf("第一个:%d\n",j);

}

void ListInsert(LinkList L,int i,int e)//在第i个位置插入元素e
{
    int j;
    LinkList p,s;
    p=L;
    j=1;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    s=(LinkList)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
}

void ListDelete(LinkList L,int i)//删除第i个位置的元素
{
    int j;
    LinkList p,q;
    p=L;
    j=1;
    while(p->next&&j<i)
    {
    p=p->next;
    j++;
    }
    q=p->next;//结点q的删除
    p->next=q->next;
    free(q);
}

void ListReverse(LinkList L,LinkList *T,int n)//逆转L为P
{
	LinkList p,q;
	int i;
	q=L->next;
	*T=(LinkList)malloc(sizeof(Node));
	(*T)->next=NULL;
	for(i=0;i<n;i++)
	{
		p=(LinkList)malloc(sizeof(Node));
		p->data=q->data;
		q=q->next;
		p->next=(*T)->next;
		(*T)->next=p;
	}
}


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值