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

#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;
 }














 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值