用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语言的一个程序。