您的位置:首页 > 理论基础 > 数据结构算法

数据结构单链表的建立、删除

2016-12-08 09:21 239 查看
单链表的建立,首先要声明单链表的数据结构,创建单链表的时候有头插法,尾插法

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

#define ERROR 0;

typedef struct LNode//单链表对应的数据结构

{

    int data;

    struct LNode *next;

}LNode,*LinkList;

LinkList InitList(LinkList L)

{

    LinkList node = NULL;

    node = (LinkList)malloc(sizeof(LNode));

    if(!node)

    {

        return ERROR;

    }

    node->next = NULL;

    L = node;

    return L;

}

int ListLength(LinkList L)//表长

{

    LinkList p = NULL;

    int count = 0;

    p = L;

    while(p->next)

    {

        count++;

        p = p->next;

    }

    return count;

}

LinkList CreateList_L(LinkList L,int n)    //创建一个单链表

{

    int i;

    LinkList p = NULL,m;

     m=L;

    for(i=0;i<n;i++)

    {

        p = (LinkList)malloc(sizeof(LNode));

        scanf("%d",&p->data);

      // p->next = L->next;

        m->next = p;

  m=p;

    }

 m->next=NULL;

    return L;

}

LinkList ListInsert(LinkList L,int i,int e)//插入链表中的一个元素

{

    int j = 0;

    LinkList s = NULL,p = NULL;

    p = L;

    while(p&&j<i-1)

    {

        p = p->next;

        j++;

    }

    if(!p||j>i-1)

    {

        printf("输入的位置不合法!!!\n");

        return L;

    }

    s = (LinkList)malloc(sizeof(LNode));

    s->data = e;

    s->next = p->next;

    p->next = s;

    return L;

}

LinkList ListDelete(LinkList L,int i)      //删除链表中的一个元素

{

    int j;

    LinkList q = NULL,p = NULL;

    p = L;

    j = 0;

    while(p->next&&j<i-1)

    {

        p = p->next;

        j++;

    }

    if(!(p->next)||j>i-1)

    {

        printf("输入的位置不合法!!!\n");

        return L;

    }

    q = p->next;

    p->next = q->next;

    free(q);

    return L;

}

int GetElem(LinkList L,int i)               //查询单链表中的一个元素

{

    int j,e;

    LinkList p = NULL;

    if(i<1||i>ListLength(L))

    {

         printf("输入的位置不合法!!!\n");

         return 0;

    }

    p = L->next;

    j = 1;

    while(j<i)

    {

        p = p->next;

        j++;

    }

    e = p->data;

    printf("第%d位的数据元素为%d\n",i,e);

}

void menu()

{

    printf("请输入指令:\n");

    printf("输出单链表中的各元素值        1\n");

    printf("在单链表中插入数据元素        2\n");

    printf("在单链表中删除数据元素        3\n");

    printf("查询单链表中的数据元素        4\n");

    printf("      结束程序                0\n");

    printf("\n");

}

//逆置单链表

LinkList reverse(LinkList L)

{

LinkList p=NULL,s,m;

p=L;

s=p->next;

//L->next=NULL;

m=NULL;

p=p->next;

while(p!=NULL)

{

   p=p->next;

  s->next=m;

  m=s;

  s=p;

}

L->next=m;
retur
4000
n L;

}

void main()

{

    int n,m,i,e;

    LinkList L = NULL,p = NULL;

    L = InitList(L);//初始化链表

    printf("请输入元素个数:");

    scanf("%d",&n);

    printf("依次输入%d个数据元素:",n);

    L = CreateList_L(L,n);

    do

    {

        printf("\n \n");

        menu();

        printf("请输入你的选择:");

        scanf("%d",&m);

        switch(m)

        {

            case 1:

                printf("现在链表的元素为:");

   // L=reverse(L);

                p = L->next;

                while(p!=NULL)

                {

                    printf("%d ",p->data);

                    p=p->next;

                }

                printf("\n");

                break;

            case 2:

                printf("依次输入插入位置和数据元素(空格隔开):");

                scanf("%d %d",&i,&e);

                L = ListInsert(L,i,e);

                break;

            case 3:

                printf("输入需要删除的元素的位置:");

                scanf("%d",&i);

                L = ListDelete(L,i);

                break;

            case 4:

                printf("输入需要取出的元素的位置:");

                scanf("%d",&i);

                GetElem(L,i);

                break;

            case 0:

                printf("已结束程序!!!\n");

                break;

            default:

                printf("输入错误!!!\n");

        }

    }while(m!=0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 单链表
相关文章推荐