有表头结点的链栈的基本操作 C语言

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 10
#define ElemType char
#define OK 1
#define ERROR 0
 
//结点类型定义
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node,*LinkList;//LinkList为结构体指针类型
 
//初始化单链表
void init_list(LinkList *H)
{
    *H=(LinkList)malloc(sizeof(Node));//建立头结点
    (*H)->next=NULL; //建立空的单链表
}

//删除链表
void ListDestory(LinkList H)
{
    printf("删除链表\n");
    Node *q;
    while(H){
        q=H->next;
        free(H);
        H=q;
    }
    printf("删除成功!\n");
}
 
//计算单链表的长度
int list_len(LinkList H)
{
    Node *p;
    int j=0;
    p=H->next;
    while(p!=NULL)
    {
        p=p->next;
        j++;
    }
    return j;
}
 
//用尾插法建立单链表
int create_from_tail(LinkList H)
{
    Node *r,*s;
    char c;
    int flag=1;//设置标志位,控制建表结束
    r=H;//动态指向当前链表尾部,便于尾插入,初值指向头结点
    while(flag)
    {
        c=getchar();
        if(c!='$')
        {
            s=(Node *)malloc(sizeof(Node));
            s->data=c;
            r->next=s;
            r=s;
        }
        else
        {
            flag=0;
            r->next=NULL;//将最后一个结点的next置为空,表示链表结束
        }
    }
    printf("\n");
    return(OK);
}
 
//按序输出元素
void print_out(LinkList H)
{
    Node *p;
    p=H->next;//从第一个结点开始
    while(p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}
 
 
//按序号查找元素
Node *get(LinkList H,int i)
{
    int j;
    Node *p;
    p=H;j=0;
    while(p->next!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    if(i==j)
    {
        return p;
    }
    else
    {
        return NULL;
    }
}
 
//按值查找元素
int locate(LinkList H,ElemType key)
{
    Node *p;
    int j=0;
    p=H->next;//从第一个结点查找
    
    while(p!=NULL)
    {
        if(p->data!=key)
        {
            j++;
            p=p->next;
        }
        
        else break;
    }
    if(p==NULL)
    {
        printf("未找到元素!");
        return(ERROR);
    }
    else
    {
        printf("此元素位于第%d个节点",j+1);//打印出元素的结点
        return(OK);
    }
}
 
//插入元素
int ins_list(LinkList H,int i,ElemType e)
{
    Node *pre,*s;
    int L;
    L=list_len(H);
    pre=get(H,i-1);//调用get函数,找到第i-1个结点
    if(pre==NULL)
    {
        printf("插入位置不合理");
        printf("\n");
        return(ERROR);
    }
    else
    {
        s=(Node *)malloc(sizeof(Node));//新建s结点
        s->data=e;//将插入数据赋给s的数据域
        s->next=pre->next;//完成插入
        pre->next=s;
        printf("插入后的链表数据:");
        print_out(H);//输出插入后的链表数据
        return(OK);
 
    }
}
 
//删除元素
int del_list(LinkList H,int i, char *e)
{
    Node *pre,*s;
 
    pre=get(H,i-1);//调用get函数,找到第i-1个结点
    if(pre==NULL)
    {
        printf("删除位置不合理");
        printf("\n");
        return(ERROR);
    }
    else
    {
        s=pre->next;
        pre->next=pre->next->next;//删除结点
        *e=s->data;
        printf("删除的元素是:%c",*e);
        printf("\n");
        printf("删除后的链表:");
        print_out(H);//输出删除后的结点
        free(s);//释放被删除的结点
        return(OK);
    }
}

//倒序排列元素
void printRevList(LinkList H){
    if (H->next != NULL)
        printRevList(H->next);
    printf("%c ",H->data);
}

//主方法
int main()
{
    LinkList H;
    int a,d,f;
    char b,c,e='m';
    init_list(&H);//初始化
    printf("用尾插法建立链表,请输入链表数据,以$结束(数据之间不要加空格):\n");
    create_from_tail(H);//尾插法建表
    printf("输出链表数据:\n");
    print_out(H);//输出链表
    printf("\n");
    printf("请输入需查找的节点:");
    scanf("%d",&a);
    if(get(H,a)==NULL) //按结点查找
    {
        printf("未找到此节点");
        printf("\n");
        return(ERROR);
    }
    else printf("查找到的元素:%c",*get(H,a));
    printf("\n");
    printf("请输入要查找的元素值:");
    getchar();
    scanf("%c",&b);
    locate(H,b);//按值查找
    printf("\n");
    printf("请输入要插入的位置和元素,[hint:输入两个数据之间有逗号]:");
    getchar();
    scanf("%d,%c",&d,&c);
    ins_list(H,d,c);//插入
    printf("请输入要删除的位置:");
    getchar();
    scanf("%d",&f);
    del_list(H,f,&e);//删除
    
    //倒序排列元素
    printf("倒序排列元素:");
    printRevList(H);
    printf("\n");
    
    //删除链表
    ListDestory(H);
    
    return(OK);
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值