单链表

#include<stdio.h>
#include<stdlib.h>
#define list_init_size 100  //在这里设置线性表长度可以方便以后的修改 
#define listincrement 10
#define ok 1
#define overflow -1
#define error 0

typedef int status;  //自定义status为int型,以后看到status等价于int 

//线性表的单链表存储结构 
typedef struct lnode{
    int data;   //存储实际数据 
    struct lnode *next;  //存储下一节点的地址 
}lnode,*linklist;

//取出链表中的某个数
status getelem(linklist l,int i,int &e)
{
    //l为带头结点的单链表的头指针
    //当第i个元素存在时,其值赋给e并返回OK
    lnode *p;  //p用来指向节点地址,所以是lnode类型,用int声明会报错 
    linklist q;//等价于lnode *q 
    p=l->next;  //p当前指向链表第一个节点 
    int j=1;    //j为计时器 
    while(p&&j<i)  //顺指针向后查找,直到p指向目标,或者超出链表范围仍未找到 
    {
        p=p->next;  // 
        ++j;
    } 
    if(!p||j>i)   //不存在 ,函数结束执行 
        return ok;
    e=p->data;     //成功找到,把p指向的数据给e 
    return ok;
}  //getelem
 
//插入元素
status listinsert(linklist &l,int i,int e)
{
    //在带头结点的单链表L中的第i个位置之前插入元素e
    lnode *p;
    linklist s;
    p=l;
    int j=0;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
     } 
     if(!p||j>i-1)
         return error;
     s=(linklist)malloc(sizeof(lnode));
     s->data=e;
     s->next=p->next;
     p->next=s;
     return ok;
}

status listdelete(linklist &l,int i,int &e)
{
    //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
    lnode *p,*q;
    int j=0;
    while(p->next&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!(p->next)||j>i-1)
        return error;
    q=p->next;
    p->next=q->next;
    e=q->data;
    free(q);
    return ok; 
}//listdelete

void listcreate(linklist &l,int n)
{
    //逆序数输入n个元素的值,建立带头结点的单链表L
    linklist p,q;
    l=(linklist)malloc(sizeof(lnode));
    l->next=NULL;
    for(int i=n;i>0;--i)
    {
        p=(linklist)malloc(sizeof(lnode));
        scanf("%d",&p->data);
        p->next=l->next;
        l->next=p;
     } 
}  //listcreate 
void picture()
{
    printf("\n**********这是一个图形界面**********\n");     
}
int main()
{
    int c,b;
    picture();
    
    linklist l;
    
    listcreate(l,5);
    lnode *p=l;
    listinsert(l,3,333);
    listdelete(l,4,b);
    p=p->next;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    picture();
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值