数据结构之链表

来源:互联网 发布:同济网络教育 编辑:程序博客网 时间:2024/05/03 07:33

    前天写的,对指针有了更深刻的理解,感觉现在就是任我拿捏了,初学者也练练啊。大笑

   自己在后边测试了下,感觉没问题。

/*单链表*/
#include <stdio.h>
#include <stdlib.h>
typedef int status ;
//#define
typedef struct LIST{
 int data;
    struct LIST *next;
}listnode,*slist;
//创建链表
void CreateList(slist &L)
{
 int i=1;
 int a;
 slist r,p;  //r 指向前一个结点,P 当前结点
 printf("请输入链表第%d个结点:",i);
 scanf("%d",&a);
 r=L;
 while(a!=-1)//当a=-1时,结束建立
 {
  p=(slist)malloc(sizeof(listnode));
  p->data=a;
  r->next=p;
  r=p;
  i++;  // 计数
  printf("请输入链表第%d个结点:",i);
  scanf("%d",&a);
 }
 r->next=NULL;
}
//打印链表
int PrintList(slist &L)
{
 slist p;
 p=L->next;
 if(!p)
 {
  printf("此表已置空");
  return -1;
 }
 while(p)
 {
  printf("\t%d",p->data);
  p=p->next;
 }
   return 0;
}
//销毁链表
int DestroyList(slist &L)
{
 slist q;
 while(L)
 {
  q=L->next;
  free(L);
  L=q;
 }
 return 0;
}
//置空表
int ClearList(slist &L)
{
 slist p,q;
 p=L->next;
 while(p)
 {
  q=p->next;
  free(p);
  p=q;
 }
 L->next=NULL;
    return 0;
}
//取得第i元素
int GetElem(slist &L,int i,int* e)
{
 int j=1;
 slist p;
 p=L->next;
 while(p && j<i)  //找到第i个结点
 {
  p=p->next;
  j++;
 }
 if(i<0||!p)
  return -1;
 *e=p->data;
        return 0;
}
//按值查找链表
int LocateList(slist &L,int a)
{
 int j=1;
 slist p;
 p=L->next;
 while(p)
 {
  if(p->data==a)
   break;
     p=p->next;
  j++;
 }
 if(p==NULL)
 {
  printf("没有此元素");
  return -1;
 }
    printf("%d",j);
    return 0;
}
//插入链表
int InsertList(slist &L,int i,int e)
{
 int j=0;
 slist p,s;
 p=L;
 while(p && j<i-1)
 {
  p=p->next;
  j++;
 }
 if(!p||j>i-1)
  return -1;
    s=(slist)malloc(sizeof(listnode));
 s->data=e;
 s->next=p->next;
 p->next=s;
 return 0;
}
//删除某一元素
int DeleteList(slist &L,int i)
{
 int j=0;
 slist p,q;
 p=L;
 while(p && j<i-1)
 {
     p=p->next;
  j++;
 }
 if(!p)
  return -1;
 q=p->next;
    p->next= q->next;
    free(q);
 return 0;

}
//倒置链表
int L1N_LN1(slist &L)
{
 slist p,q;//p指向下一个结点,q指向当前结点
 p=L->next;
 L->next=NULL;
 while(p)
 {
  //顺序不能出错
  q=p;        //q指向当前
  p=q->next;  //p指向后一个结点
  q->next=L->next; //把L->next后的链表赋给q->next
  L->next=q;   //把当前结点q赋给L->next
 }
    return 0;
}
//有序链表合并
slist Merge(slist &L,slist &k)
{
 slist h,r,p,q;
 p=L->next;
 q=k->next;
 free(k);
 r=L;
 h=r;
 while(p && q)
 {
  if(p->data<=q->data)//1. 赋结点给r  2. r后移一位 3. p后移一位
  {
   r->next=p;    // 1. 赋结点给r 
   r=p;          // 2. r后移一位
   p=p->next;    // 3. p后移一位
  }else{
      r->next=q;
   r=q;
   q=q->next;
  }
 }
    if(p==NULL) //如果p指向最后,q没有完,则把q赋给r->next
  p=q;
 r->next=p;//否则,直接把p赋给r->next
 return h;
}

 

 

int main()
{
 int a;
 slist H,k,r;
 H=(slist)malloc(sizeof(listnode));
 H->next=NULL;
 k=(slist)malloc(sizeof(listnode));
 k->next=NULL;
 CreateList(H);
 PrintList(H);
 printf("\n");
 CreateList(k);
 PrintList(k);
    r=Merge(H,k);
 printf("\n");
 PrintList(r);
 printf("\n");
 
 return 0;

}

 

0 0