关闭

线性表

66人阅读 评论(0) 收藏 举报
分类:
#include"stdio.h"     //非顺序结构  链表
#include"stdlib.h"
#include"time.h"
struct node
{
    int val;
    node *next;
};

int Length(node *head) //长度
{
    int cnt;
    node*p=head->next;
    for(cnt=0;p;p=p->next)
        cnt++;
    return cnt;
}

node *init() //初始化
{
    node*head=(node*)malloc(sizeof(node));
    head->val=-1;
    head->next=NULL;
    return head;
}



void Delete(node *head,int *e,int pos)  //删除
{
    int i=-1; //设置头结点 为-1这个位置
    node *p=head;
    while(i<=pos-1&&p) //找到要删除的位置的前驱
    {
        i++;
        if(i>pos-1) break; //找到位置了
        if(p->next)
            p=p->next;
        else
            break;
    }
    if(i==pos)  //找到这个元素了
    {
        node *q=p->next;
        *e=q->val;
        p->next=q->next;
    }
    else
    {
        printf("It's so boring to delete this elem!\n");
    }
}
void Insert(node *head,int e,int pos)  //插入
{
    int i=-1;node *p=head;
    while(i<=pos-1&&p)//找到元素pos的前驱
    {
        i++;        //标志表示能否插入  如果无法到达pos+1,无法插入
        if(i>pos-1) break; //找到目标位置了

        if(p->next) //当 没有找到 并且 后继不为空 的时候继续 向后移动
            p=p->next;
        else break;  //当 后继为空 的时候会直接退出

    }
    if(i==pos)
    {
        node *q=(node*)malloc(sizeof(node));
        q->next=p->next;
        q->val=e;
        p->next=q;
    }
    else{
        printf("Why so Diao!\n");
    }

}
void ListTraverse(node *head)  //遍历
{
    int first=1;
    for(node*p=head->next;p;p=p->next)
    {
        if(first) first=0;
        else printf(" ");
        printf("%d",p->val);
    }
    printf("\n");
}
int main()
{
    node * head=init();
    Insert(head,1,0);
    Insert(head,2,0);
    Insert(head,3,0);
    Insert(head,40,0);
    Insert(head,5,0);
    ListTraverse(head);
    Insert(head,3,10);
    printf("List length:%d\n",Length(head));

    int *e=(int*)malloc(sizeof(int));
    Delete(head,e,0);
    ListTraverse(head);
    printf("%d\n",*e);
    printf("List length:%d\n",Length(head));

    printf("%.2f\n",(double)clock()/CLOCKS_PER_SEC);

}

.


#include"stdio.h"      //顺序结构 数组
#include"stdlib.h"
struct list{
    int *next;
    int len;
    int cap;
};
void init(list *s,int n)  //初始化一个容量为n的表
{
    s->next=(int*)malloc(n*sizeof(int));
    s->len=0;
    s->cap=n;
}
void append(list *s,int a)  //向末尾追加一个数字
{
    s->next;
    if(s->len<s->cap)
    s->next[s->len++]=a;
}
void insert(list *s,int a,int pos)  //向pos位置插入a
{
    if(pos>=0&&pos<=s->len) // 在[0...len]范围内可以操作
    if(s->len+1<s->cap) //小于容量才操作
    {
        for(int i=++s->len-1;i>pos;i--)
            s->next[i]=s->next[i-1];
        s->next[pos]=a;
    }
}
void Delete(list *s,int pos,int *e)
{
    if(pos>=0&&pos<s->len)  //删除的位置不能出界
    {
        *e=s->next[pos];
        for(int i=pos;i<--s->len;i++)
            s->next[i]=s->next[i]+1;
    }
}
void destroy(list *s)
{
    free((void*)s->next);
    s->next=NULL;
}
int compare(int e,int a)
{
    return a==e;
}
int location(list s,int e)
{
    for(int i=0;i<s.len;i++)
        if(compare(e,s.next[i]))
        return i;

    return -1;
}

int priorElem(list s,int e) //返回e的前驱的下标
{
    int pos=-1;
    for(int i=0;i<s.len;i++)
        if(compare(e,s.next[i]))
    {pos=i;break;}
    return pos==0?-1:pos-1;
}

void ListTraverse(list s)
{
    for(int i=0;i<s.len;i++)
        printf("%d ",s.next[i]);
    printf("\n");
}
int main()
{
    list *p=(list*)malloc(sizeof(list));
    init(p,5);
    //向末尾追加元素
    append(p,1);
    //打印表格 长度 容量 与第0个元素
    printf("%d %d %d\n",p->len,p->cap,p->next[0]);
    //向1这个位置插入2
    insert(p,2,1);
    printf("%d %d %d %d\n",p->len,p->cap,p->next[0],p->next[1]);

    printf("%d\n",location(*p,2));

    printf("%d\n",priorElem(*p,2));

    ListTraverse(*p);
    int a;
    Delete(p,0,&a);
    printf("%d %d\n",p->next[0],a);


    destroy(p);
    free((void*)p);
    p=NULL;
    return 0;
}


#include"stdio.h"  //循环链表
#include"iostream"
#include"stdlib.h"
struct Node
{
    Node *next;
    int val;
};

Node* Init()
{
    Node *head=(Node*)malloc(sizeof(Node));
    head->next=head;
    return head;
}

void Append(Node *head,int e)
{
    Node *p=head;
    while(p->next!=head)
    {
        p=p->next;
    }
    Node *q=(Node*)malloc(sizeof(Node));
    p->next=q;
    q->next=head;
    q->val=e;
}

void Insert(Node *head,int e,int pos)
{
    int i=-1;
    Node* p=head;
    while(i<=pos-1)  //while(i<=pos-1&&p->next!=head)
    {
        i++;
        if(i==pos) break;      //找到了
        if(p->next!=head)
            p=p->next;
        else break; //若下一个为head则停止
    }
    if(i==pos)
    {
        Node *q=(Node *)malloc(sizeof(Node));
        q->next=p->next;
        q->val=e;
        p->next=q;
    }
    else
        puts("It's so boring!");
}

void Delete(Node* head,int *e,int pos)
{
    Node*p=head;
    int i=-1;
    while(i<=pos-1)
    {
        i++;
        if(i==pos)break;
        if(p->next!=head) p=p->next;
        else break;
    }
    if(i==pos)
    {
        Node *q;
        q=p->next;
        *e=q->val;
        p->next=q->next;
        free(q);
        q->next=NULL;
    }
    else
    {
        *e=-1;
        puts("Why so boring!");
    }
}


void Print(Node *head)
{
    Node *p=head->next;
    while(p!=head)
    {
        printf("%d ",p->val);
        p=p->next;
    }

    printf("\n");
}

int main()
{
    Node *head=Init();
    Append(head,1);
    Append(head,2);
    Print(head);

    //Insert(head,3,1);
    //Insert(head,3,0);
    Insert(head,2,2);
    Insert(head,334,5);
    Print(head);
    int *e=(int*)malloc(sizeof(int));
    //Delete(head,e,2);
    //Delete(head,e,0);
    Delete(head,e,234);
    Print(head);
    printf("%d\n",*e);
    return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31531次
    • 积分:2714
    • 等级:
    • 排名:第13326名
    • 原创:249篇
    • 转载:20篇
    • 译文:0篇
    • 评论:0条