顺序表与链表源码之数据结构

顺序表

#include<stdio.h>
#include<stdlib.h>
#define elemtype int
#define list_size 100
#define listcrecent 10
typedef  struct
{
 elemtype *base;
 int length;
 int listsize;
}list;
//初始化
int  inist (list *L)
{
 L->base=(elemtype *)malloc(list_size*sizeof(elemtype));
 if(!L->base)
 {
  printf("分配内存失败");
  return 0;
 }
 else
 {
  L->length=0;
  L->listsize=list_size;
 } 
}
//插入
int charu (list *L,elemtype e)
{
 if(L->length>=L->listsize)
 {
  L->base=(elemtype *)realloc(L->base,(L->listsize+list_size)*sizeof(elemtype));
  if(!L->base)
  {
   printf("二次分配内存失败");
   return 0;
  }
 }
  L->base[L->length]=e;
  L->length++;
}
//打印
int dayin (list *L)
{
 int i;
 for(i=0;i<L->length-1;i++)
 {
  printf("%5d",L->base[i]);
  if(i%5==4)
  printf("\n");

 }
 }
// 删除
int shanchu(list *L,int i,elemtype *e)
{
 int j;
 if(i<1||i>L->length)
 {
  printf("删除的位置不合法");
 return 0;
    }
// e=&L->base[i-1];//为什么这样写是不行的。。。。。。。。。。。。
 *e=L->base[i-1];
 for(j=i-1;j<L->length-1;j++)
 {
  L->base[j]=L->base[j+1];
 }
 L->length--;
 return 1;
}
void main ()
{
 elemtype e,e1;
 int i;
 list L;
 inist (&L);
 printf("请输入要放入顺序表中的值以0结束\n");
 for(;;)
 {
 scanf("%d",&e);
 charu (&L,e);
 if(L.base[L.length-1]==0) break;
 }
 printf("插入完毕\n");
 printf("打印为\n");
 dayin(&L);
 printf("\n输入删除的位置");
 scanf("%d",&i);
 shanchu(&L,i,&e1);
 printf("删除的元素为%d",e1);
    printf("现在顺序表为\n");
 dayin(&L);

}

 

 

 

链表

#include<stdio.h>
#include<stdlib.h>
typedef struct LIST
{
 int elem;
 LIST *next;

}NOTE,*List;
List head;

void creat (List &L,int n)//创建是选择节点数
{
 List p;
 int i;
 L=(List)malloc(sizeof(NOTE));
 if(!L) exit(0);
 L->next=NULL;
 head=L;
 /*for(i=0;i<n;i++)//逆序
 {
  p=(List)malloc(sizeof(NOTE));
   if(!L) exit(0);
      scanf("%d",&p->elem);
   p->next=L->next;
   L->next=p;
   printf("插入%d个\n",i+1);
 } */
 for(i=0;i<n;i++)//正序
 {
  p=(List)malloc(sizeof(NOTE));
   if(!L) exit(0);
      scanf("%d",&p->elem);
      p->next=L->next;
            L->next=p;
   L=p;
   printf("插入%d个\n",i+1);

 }
}

void display(List L)//添加head节点的原因是正序输出因为把头结点移到了最后面 所以有用head记住头结点
{
    List p;
    p=head->next;
 while(p)
 {
  printf("%d  ",p->elem);
  p=p->next;
 }
}


void insert (List &L,int i,int e)
{
 int flag;
 List p,q;
 p=head;
 for(flag=1;flag<i;flag++)//第i个节点的前一个节点
 {
    p=p->next;
 }
    q=(List)malloc(sizeof(NOTE));
 q->elem=e;
 q->next=p->next;
    p->next=q;
 printf("插入成功");

}

void main()
{
 List L;
 int n;

 printf("输入创建的节点数");
 scanf("%d",&n);
 creat (L,n);
    display(L);
    insert(L,3,222);
 display(L);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值