单链表

 

单链表

--------------------------------------------------------------------------------

/* 程序开头的预处理命令和结构体定义:*/

#include <stdio.h>
#include <stdlib.h>
#define error(x) fprintf(stderr,x)

typedef struct node{
  int data;
  struct node *next;
}NODE;

/* 建立单链表的函数:*/
/* 说明:本程序有头结点,数组中的数据从下标1开始存放 */

NODE *createlist(int A[],int n)
{
  NODE *h,*p,*q;
  int i;
  if(n<=0) return (NULL);
  q=(NODE*)malloc(sizeof(NODE));
  h=q;
  for(i=1;i<=n;i++)
  {
    p=(NODE*)malloc(sizeof(NODE));
    p->data=A[i];
    q->next=p;
    q=p;
  }
  q->next=NULL;
  return (h);
}

/* 在第i个元素之前插入一个新的元素:*/

void insert1(NODE *p,int i,int key)
{
  int j=0;
  NODE *t;
  while(p!=NULL && j<i-1)
  {
    p=p->next;
    j++;
  }
  if(p==NULL) error("下标越界!");
  else
  {
    t=(NODE*)malloc(sizeof(NODE));
    if(t==NULL) error("没有足够的存储空间");
    else
    {
      t->data=key;
      t->next=p->next;
      p->next=t;
    }
  }
}

/* 在值为key的元素之前插入一个新的元素(假设该线性表中没有相同的元素):*/

void insert2(NODE *h,int key,int key1)
{
  int j=0;
  NODE *p=h,*temp;
  while(p->next!=NULL && p->next->data!=key)
  {
    p=p->next;
  }
  if(p->next->data==key)
  {
    temp=(NODE*)malloc(sizeof(NODE));
    if(temp==NULL) error("没有足够的存储空间");
    else
    {
      temp->data=key1;
      temp->next=p->next;
      p->next=temp;
    }
  }
}

/* 在升序排列的线性表中插入一个新的元素,插入后仍然保持有序:*/

void insert_node(NODE *h, int key)
{
  NODE *q, *p, *s;
  s=(NODE *)malloc(sizeof(NODE)) ;
  s->data = key;
  q = h;
  p = h->next;
  while( p!=NULL && s->data > p->data )
  { q = p;
    p = p->next;
  }
  q->next = s;
  s->next = p;
}

/* 删除线性表第i个元素:*/

void delete1(NODE *h,int i)
{
  int j=0;
  NODE *p,*q;
  p=h;
  while(p->next!=NULL && j<i-1)
  {
    p=p->next;
    j++;
  }
  if(p->next==NULL) error("下标越界!");
  else
  {
    q=p->next;
    p->next=q->next;
    free(q);
  }
}

/* 删除单链表中值为key的元素(假设该线性表中没有相同的元素):*/

void delete2(NODE *h,int key)
{
  NODE *q,*p=h;
  while(p!=NULL && p->data!=key)
  {
    q=p;
    p=p->next;
  }
  if(p->data==key)
  {
    q->next=p->next;
    free(p);
  }
}

/* 显示输出单链表全部元素的函数:*/

void printlist(NODE *h)
{
  NODE *p=h->next;
  while(p!=NULL)
  {
    printf("%d ",p->data);
    p=p->next;
  }
  printf("/n/n");
}

/* 上机练习时,可编写程序调用以上函数。例如:*/

void main()
{
  int A[]={0,10,20,30,40,50},n=5; /* 数据从下标1开始存放 */
  NODE *h;
  h=createlist(A,n);

/* 显示输出线性表的每一个元素,验证建立单向表的函数是否正确 */

printlist(h);

/* 删除第4个元素,然后输出验证 */

delete1(h,4);
printf("删除第4个元素: "); printlist(h);

/* 删除值为30的元素,然后输出验证 */

delete2(h,30);
printf("删除值为30的元素: "); printlist(h);

/* 在第2个元素前插入一个元素15,然后输出验证 */

insert1(h,2,15);
printf("在第2个元素前插入元素15: "); printlist(h);

/* 在值为50的元素前插入一个元素45,然后输出验证 */

insert2(h,50,45);
printf("在值为50的元素前插入元素45: "); printlist(h);

/* 在线性表中插入一个元素22,要保持有序,然后输出验证 */

insert_node(h,22);
printf("插入一个元素22,要保持有序: "); printlist(h);

}

--------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值