当前位置:编程学习 > C/C++ >>

用C语言写出如下算法

用C语言写出如下算法:
1.头插法创建单链表    linklist create_front()
2.尾插法创建单链表    linklist create_rear()
3.查找单链表s的第i个结点   linklist getnode(linklist s,int i)
4.在单链表s的第i个位置插入值为x的结点   void insert_linklist(linklist s,int i,int x)
5.删除单链表s的第i个结点  void delete_linklist(lintklist s,int i)
6.编写一个算法,实现将单链表s逆置,返回逆置后的单链表 linklist sort(linklist s)
 (例如:s原来结点为3 5 6 7,逆置后的s为7 6 5 3)
要求:
1.写出每个算法的功能说明;
2.写出每条语句的中文注释
答案:#include <stdio.h>
#include <stdlib.h>
/* 定义链表 */
struct mylink{
  struct mylink *next;
  int data;
};
typedef struct mylink * linklist;

void printlink(linklist link){
/*顺序打印链表各节点值*/
   while(link){
   printf("%d",link->data);
   link=link->next;
   if(link)printf(",");
   }
   printf("\n");
}
void freelink(linklist link){
  /*释放链表空间*/
  linklist node;
   while(link){
   node=link; /*当前节点*/
   link=link->next; /*下一节点*/
   /*free()函数,某些C语言中为freemalloc()*/
   free(node); /*删除当前节点*/
   }
}

linklist create_front(int *datalist,int n){
/*头插法创建单链表*/
   linklist head=NULL,p;
   int i;
   for(i=0;i<n;i++){ /*依次插入数组datalist的n个元素*/
    p=malloc(sizeof(linklist));/*申请节点空间*/
    p->data=datalist[i];/*存入节点值*/
    p->next=head;/*下一节指向链表头*/
    head=p;      /*链表头变为新插入的节点*/
   }
   return head;
}

linklist create_rear(int *datalist,int n){
/*尾插法创建单链表*/
   linklist head=NULL,tail=NULL,p;
   int i;
   for(i=0;i<n;i++){ /*依次插入数组datalist的n个元素*/
    p=malloc(sizeof(linklist));/*申请节点空间*/
    p->data=datalist[i];/*存入节点值*/
    p->next=NULL;/*下一节点为空*/
    if(tail)tail->next=p; /*链表尾指向当前节点*/
    else
    head=p;
    tail=p;      /*链表尾变为新插入的节点*/
   }
   return head;
}
linklist getnode(linklist s,int i){
/*查找单链表s的第i个结点,返回该节点;如果没有找到,返回NULL*/
 while(--i>0){
   if(!s)return NULL;
   s=s->next;
 }
 return s;
}

void insert_linklist(linklist s,int i,int x){
/*在单链表s的第i个位置插入值为x的结点
  如果i=0,插入在链表头部;
  如果i大于链表长度,则插入在链表尾部
*/
  linklist next,p;
  if(!s)return;/*因该函数为void类型,无法返回修改后的链表头,
  故如果链表为空,则无法插入节点,只好不执行插入操作*/
  p=malloc(sizeof(linklist));/*申请节点空间*/
  p->data=x;/*存入节点值*/
  if(i<=0){
  next=s->next;
  i=s->data;/*链表头节点值*/
  s->data=x;
  s->next=p;
  p->data=i;/*将原链表头节点值移到第2个节点上*/
  p->next=next;
  }
  else{
  while(--i>0&&s){
  if(s->next)/*如果下一节点存在,则指向下一节点*/
    s=s->next;
 }
 /*在当前位置插入节点p*/
 next=s->next;
 s->next=p;
 p->next=next;
  }
}

void delete_linklist(linklist s,int i){
/*删除单链表s的第i个结点*/
linklist prio=s;
if(!s)return;
if(i<2){ /*删除首节点时的特殊处理,原因同上*/
   if(prio->next){/*如果下一节点存在,由将下一节点的值移到首节点上,删除下一节点*/
   s=prio->next;
   prio->data=s->data;
   prio->next=s->next;
   free(s);
   }else{/*如果只有首节点一个节点,因函数定义为void类型,
   无法返回修改后的空链表头,故无法执行删除操作*/
   }
   return;
}
 while(--i>0){
   if(!s)return;
   prio=s;
   s=s->next;
 }
 prio->next=s->next; /*上一节点的下一节点跳过当前节点,指向当前的后一节点*/
 free(s);/*删除当前节点*/
}

linklist sort(linklist s){
/*链表倒置
  有两种方法:
 1是将链表的节点进行倒置;2是只倒置节点中的数据,节点本身不动。
  这里采用法1.
  方法是:依次遍历s的各节点,采用头插法创建一新的单链表
*/

   linklist head=NULL,p;
   while(s){ /*依次插入数组datalist的n个元素*/
    p=s;  /*原链表s的当前节点*/
    s=s->next; /*原链表s的下一节点*/
    p->next=head;/*新链表下一节点指向链表头*/
    head=p;      /*新链表头变为新插入的节点*/
   }
   return head;
}

void main()
{
   linklist link1,link2,node;
   int datalist[10]={1,3,5,7,9,2,4,6,8,10};
   link1=create_front(datalist,10); /*头插法创建单链表link1*/
   printlink(link1);/*显示链表节点值*/
   link2=create_rear(datalist,10); /*尾插法创建单链表link2*/
   printlink(link2);/*显示链表节点值*/

   node=getnode(link1,8); //查找link1第8个节点,并显示节点值*/
   if(node)printf("link1第8个节点值为%d\n",node->data);

   node=getnode(link2,12);
   if(!node)printf("link2第12个节点不存在!\n");

   printf("将100插入到link2的第5个位置后面:\n");
   insert_linklist(link2,5,100);
   printlink(link2);

   printf("将101插入到link2的第12个位置后面:\n");
   insert_linklist(link2,12,101);
   printlink(link2);

   printf("将99插入到link2的头部:\n");
   insert_linklist(link2,0,99);
   printlink(link2);

   printf("删除link2第9个节点:\n");
   delete_linklist(link2,9);
   printlink(link2);

   printf("删除link2第1个节点:\n");
   delete_linklist(link2,1);
   printlink(link2);

   printf("link2倒置:\n");
   link2=sort(link2);
   printlink(link2);

   freelink(link1);/*释放链表空间*/
   freelink(link2);
   getch();
}
程序运行结果:


单链表正序,逆序建立


上一个:C语言 单链表问题
下一个:纯C语言的一个程序。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,