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

数据结构_线性表_链表实现

2017-10-15 15:12 288 查看
#include<stdio.h>

#include <stdlib.h>  

#define OK 1

#define ERROR 0

typedef int Status;   //Status是函数的类型,其值是函数结果状态OK等 

typedef int ElemType; // ElemType类型根据实际情况而定这里设为int型 

typedef struct LNode    //定义单链表结点类型 

{
ElemType data;    //数据域
struct LNode *next;  //指针域 

 }LNode,*LinkList;

 

 /************初始化******************************/   

Status InitList() {  

    LNode *L;  

    L = (LinkList)malloc(sizeof(LNode));   //创建头结点 

    if(L == NULL) {                      //判断是否有足够的内存空间   

        printf("申请内存空间失败\n");  

    }  

    L->next = NULL;                  //将next设置为NULL,初始为空单链表   

   // return L;  

}  

/*******尾插法随机产生n个元素的建立带表头结点的单链表L*********/

Status CreateList(LinkList *L,int n)

{
LinkList s, r;
int i;
printf("输入建立链表元素长度n:");
scanf("%d",&n);
srand(time(0));                      //产生随机数 
*L = (LinkList)malloc(sizeof(LNode));  //创建头结点 
r=*L;                        // r为表尾指针 
(*L)->next=NULL;           //初始化为空链表 

        

for (i=0;i<n;i++)
{
s = (LNode *)malloc(sizeof(LNode)); //生成新结点 
s->data = rand()%1000+1;           //随机生成1000以内的数字
r->next=s;                        //表尾终指针指向新结点
r=s;                            //r指向新结表尾结点 
}

r->next = NULL;                       //表尾指针置空 



/*******头插法随机产生n个元素的建立带表头结点的单链表L*********/  

Status CreateListHead(LinkList *L, int n)  

{  

    LinkList p;  

    int i;  

    printf("输入建立链表元素长度n:");
scanf("%d",&n);

    srand(time(0));                         

    *L = (LinkList)malloc(sizeof(LNode));  

    (*L)->next = NULL;                      //初始化为空链表 

    for (i=0;i<n;i++)
{
p = (LNode *)malloc(sizeof(LNode)); //生成新结点 
p->data = rand()%1000+1;           //随机生成1000以内的数字
p->next = (*L)->next;  

        (*L)->next = p;                      //  插入到表头  

             

   

}  

/*******************第i个位置前插入(头插法)************************************/

Status CreateList1(LinkList *L,int i,ElemType e)

{
int j=0;
LinkList s, p;
p=*L;
while(p&&j<i-1)  //寻找第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;

 } 

    

 /**********返回L中第i个元素的值(按序号查找结点值)******************/

 Status GetElem(LinkList L,int i) //第i个元素存在时赋值给e并返回OK 否则返回ERROR 

 {

    ElemType e;

  LNode *p; 

  p=L->next;   //初始化,p指向第一个结点
int j=1;     //j为计数器
if(!p||j>i)   //查找的第i个元素不存在 
return ERROR;
while(p&&j<i) //p为空或者p指向第i个元素
{
p=p->next;
++j; 

e=p->data;   //e区第i个元素的值
printf("%d",e);
//return 0; 

 }

 

 /************按值查找表结点*********************/

 Status *GetElem1(LinkList L,ElemType e)   //查找L中data值等于e的结点指针,否则返回NULL 

 {

  LNode *p=L->next;        //p指向头结点            
while(p!=NULL&&p->data!=e)
{
p=p->next;

printf("%d",p);
return p;

 }

 

 /******************删除*********************/

 Status ListDelete(LinkList *L,int i,ElemType *e)    //删除第i个元素 ,由e返回 

 {

  int j=0;  

    LinkList p,q;  

    p=*L;   

    while(p->next&&j<i-1)  // 遍历寻找第i个结点,并令p指向其前驱 

    {  

        p = p->next;  

        ++j;  

    }  

    if (!(p->next)||j>i)   //删除位置不合理 

        return ERROR;           

    q = p->next;  

    p->next = q->next;            //将q的后继赋值给p的后继  

    *e = q->data;               // 将q结点中的数据给e  

    free(q);                    // 让系统回收此结点,释放内存  

    return OK;  

 }

/**************获取表长***************/ 

Status ListLength(LinkList L)  

{  

    int i=0;  

    LinkList p=L->next; // p指向第一个结点  

    while(p)  

    {  

        i++;  

        p=p->next;  

    }  

    return i;  

    printf("表长为:%d",i);

}  

 /******************打印查看****************/

 Status display(LinkList L)   

 {

  LinkList i; 

  i=L->next;   //p指向第一个结点

  while(i)

    {

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

        i=i->next;

    }

    printf("\n");

    return OK;

 } 

 

 int main()

 {

  int i,n;

  int k;

  ElemType e; 

  LinkList p,L;
InitList(L); //初始化单链表L

printf("1打印查看链表  2创建链表(尾插法)3创建链表(头插法)\n4按序号查找链表 5按值查找表结点 6头插法 7删除 8链表长度 0.退出 \n"); 
printf("\n");
while(n!= 0)

    {

    printf("请选择你的操作:");

        scanf("%d",&n);

        switch(n)

        {

            case 1:

                display(L);

                printf("\n");

                break;

            case 2:
   printf("创建链表L(尾插法):\n");

                CreateList(&L,n);

                display(L);

                printf("\n");

                break;

                

            case 3:
   printf("创建链表L(头插法):\n");

                CreateList(&L,n);

                display(L);

                printf("\n");

                break;

 

            case 4:

            CreateList(&L,n);

                display(L);

                printf("输入要查找的序号i:");

                scanf("%d",&i);

                GetElem(L,i);

                printf("\n");

                break;

                

            case 5:

            CreateList(&L,n);

                display(L);

                printf("输入要查找的元素e:");

                scanf("%d",&e);

                GetElem1(L,e);

                printf("\n");

                break;

                

            case 6:

            CreateList(&L,n);

            display(L);

            printf("请输入要插入元素位置i:");

            scanf("%d",&i); 

            printf("请输入要插入元素e:");
scanf("%d",&e); 
CreateList1(&L,i,e);  
display(L);
printf("\n");

case 7:

            CreateList(&L,n);

            display(L);

            printf("请输入要删除元素位置i:");

            scanf("%d",&i); 
ListDelete(&L,i,&e);  
display(L);
ListLength(L);
printf("\n");

            case 8:

                ListLength(L);

                printf("\n");

            case 0:

                exit(0);

        }

    }

  return 0;

 }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: