数据结构链表源码

数据结构链表源码

数据结构链表源码,仅供自己复习专用。

数据结构链表源码

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

typedef struct Node{
    int data;
    struct Node *next;
}node,*linklist;

linklist List;

int get(linklist L,int i)
{
    int j=1;
    linklist p;
    p=L->next;
    while (p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p&&j>i)
    return -1;
    return (p->data);
}

int insert(linklist L,int i,int val)
{
    int j=1;
    linklist p,s;
    p=L;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(j>i||!p)
    return -1;
    s=(linklist)malloc(sizeof(node));
    s->data=val;
    s->next=p->next;
    p->next=s;
    return 1;
}

int delete(linklist L,int i)
{
    int j=1;
    linklist p,q;
    p=L;
    while(p->next&&j<i)
    {
        p=p->next;
        ++j;
    }
    if (!(p->next)||j>i)
    return -1;
    q=p->next;
    p->next=q->next;
    free(q);
    return 1;
}

void show(linklist L)
{
    linklist p;
    p=L->next;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

void InitList(void)
{
    linklist head;
    head=(linklist)malloc(sizeof(node));
    List=head;
    List->next=NULL;
}

void rearcreat(linklist L,int i)
{
    linklist p,t;
    p=(linklist)malloc(sizeof(node));
    t=L;
    while(t->next)
    {
        t=t->next;
    }
    t->next=p;
    p->data=i;
    p->next=NULL;
}

int length(linklist L)
{
    int flag=0;
    linklist p;
    p=L->next;
    while(p)
    {
        p=p->next;
        flag++;
    }
    return flag;
}
int main()
{
    int flag,tmp,n;
    InitList();
    printf("请输入一些数用以初始化链表(输入-1代表输入结束):\n");
    while(~scanf("%d",&n))
    {
        if(n==-1)
        break;
        rearcreat(List,n);
    }
    printf("初始化链表后,其链表里面的元素为:\n");
    show(List);
    printf("请输入相关操作指令(输入end表示操作结束):insert,show,delete,get,LinkList'sLength\n");
    char s[50];
    memset(s,'\0',sizeof(s));
    while(~scanf("%s",s))
    {
        if(!strcmp(s,"end"))
        break;
        if(!strcmp(s,"insert"))
        {
            printf("请输入你想要插入的位置和值中间以空格隔开:\n");
            int location,val;
            scanf("%d%d",&location,&val);
            tmp=length(List);
            if(tmp<location)
            printf("指针飘移,位置出错!!!\n");
            else
            {
            	flag=insert(List,location,val);
            	if(flag==-1)
                printf("指针飘移,位置出错!!!\n");
                else
                {
                    printf("恭喜你!插入成功。\n插入成功后,链表元素为:");
                    show(List);
                }
			}
        }
        if(!strcmp(s,"delete"))
        {
            printf("请你想要删除的位置:\n");
            int location;
            scanf("%d",&location);
            tmp=length(List);
            flag=delete(List,location);
            if(tmp<location||flag==-1)
            printf("指针飘移,位置出错!!!\n");
            else
            {
                printf("恭喜你!删除成功。\n删除成功后,链表元素为:");
                show(List);
            }
        }
        if(!strcmp(s,"get"))
        {
            printf("请你想要获取元素的位置:\n");
            int location;
            scanf("%d",&location);
            tmp=length(List);
            if(tmp<location)
            printf("指针飘移,位置出错!!!\n");
            else
            {
            	flag=get(List,location);
            	if(flag==-1)
            	printf("指针飘移,位置出错!!!\n");
            	else
                {
                    printf("恭喜你!获取成功:位置为 %d 的元素其值为 %d 。\n",location,flag);
                }
			}
        }
        if(!strcmp(s,"show"))
        {
            printf("恭喜你!展示成功,链表元素为:\n");
            show(List);
        }
        if(!strcmp(s,"LinkList'sLength"))
        {
            flag=length(List);
            printf("恭喜你!获取成功,链表长度为:%d\n",flag);
        }
        memset(s,'\0',sizeof(s));
    }
    return 0;
}
上一篇:链表的具体实现


下一篇:线性表的简单应用