链表的基本操作
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int type;
typedef struct Node
{
type info;
struct Node *next;
}node;
//建立一个头节点并将其指针返回
node *node_init()
{
node *head=(node*)malloc(sizeof(node));
head->next=NULL;
return head;
}
//打印一个链表
void node_display(node*head)
{
node*p=head->next;
if(!p){
printf("EMPTY\n");
}
else{
while(p){
printf("%5d",p->info);
p=p->next;
}
printf("\n");
}
}
//找到第n个节点并返回其指针,若n==0则返回头节点指针
node* node_find(node*head,int n)
{
int i=0;
node *p=head;
if(n<0){
printf("not\n");
return NULL;
}
else if(n==0){//第零个位置的节点:头节点
return head;
}
while(p&&i<n){//找到第i个节点的地址
p=p->next;
i++;
}
if(!p)printf("not\n");
return p;
}
//在pos个节点的位置插入一个值为num的节点
void node_insert(node*head,int pos,type num)
{
node*pre=node_find(head,pos-1),*q;//找到前驱节点
if(!pre){
printf("not\n");
}
else{
q=(node*)malloc(sizeof(node));
q->info=num;
q->next=pre->next;
pre->next=q;
}
}
//删除第pos个节点
void node_dele(node*head,int pos)
{
node*pre=node_find(head,pos-1),*q;
if(!pre){
printf("not\n");
}
else{
q=pre->next;
pre->next=q->next;
free(q);
}
}
//删除整个链表并释放内存
void node_destory(node*head)
{
node*p=head,*q;
while(p){
q=p->next;
free(p);
p=q;
}
}
课后习题部分
//返回第i个节点的值
type node_get(node*head,int i)
{
node*p=node_find(head,i);
if(!p){
printf("not\n");
exit(1);
}
return p->info;
}
//返回值为x的节点的位置是第几个节点
int node_Get(node*head,type x)
{
int i=1;
node*pre=head,*p=head->next;
while(pre&&p&&p->info!=x){
pre=p;
p=p->next;
i++;
}
if(p)return i;
else return -1;
}
//返回值为x的节点的指针
node*node_Find(node*head,type x)
{
node*pre=head,*p=head->next;
while(pre&&p&&p->info!=x){
pre=p;
p=p->next;
}
if(p){
return p;
}
else{
printf("not\n");
return NULL;
}
}
//把p2链表连接的p1后面
void node_cat(node*p1,node*p2)
{
node*p=p1;
while(p->next){
p=p->next;
}
p->next=p2->next;
free(p2);
}
//把p2链表插入到p1节点的第n个节点的位置
void node_Insert(node*p1,int n,node*p2)
{
node*pre=node_find(p1,n-1),*p=p2;
if(!pre){
printf("node_Insert error\n");
}
else{
while(p->next){
p=p->next;
}
p->next=pre->next;
pre->next=p2->next;
free(p2);
}
}
//删除p1,节点的从begin开始的n个节点
void node_Del(node*p1,int begin,int n)
{
int i;
for(i=1;i<=n;i++)
node_dele(p1,begin);
}
//返回节点的和
int node_sum(node*head)
{
node*p=head->next;
int sum=0;
while(p){
sum+=p->info;
p=p->next;
}
return sum;
}
//创建链表,当输入的值为负数结束
void node_create(node*head)
{
node*p=head,*pre;
while(1){
pre=(node*)malloc(sizeof(node));
pre->next=NULL;
scanf("%d",&pre->info);
if(pre->info<0){
free(pre);
break;
}
else{
p->next=pre;
p=pre;
}
}
}
//计算链表节点数
int node_count(node*head)
{
int i=0;
node*p=head->next;
while(p){
p=p->next;
i++;
}
return i;
}
//在值为y的节点前面插入x
void node_insert_xy(node *head,type x,type y)
{
node*p=head,*pre=p->next,*q;
while(pre&&pre->info!=y){
p=pre;
pre=pre->next;
}
if(pre&&pre->info==y){
q=(node*)malloc(sizeof(node));
q->next=NULL;
q->info=x;
q->next=pre;
p->next=q;
}
else printf("error\n");
}
//倒置链表
void node_reverse(node*head)
{
node*pre=NULL,*mid=head->next,*next;
while(mid){
next=mid->next;
mid->next=pre;
pre=mid;
mid=next;
}
head->next=pre;
}
//将链表的偶数部分保留,奇数部分赋给另外一个链表,并返回其头指针
node *node_divide(node*head1)
{
node*head2=(node*)malloc(sizeof(node));
node *p2=head2,*p=head1,*pre=p->next;
while(pre){
if(pre->info%2!=0){
p->next=pre->next;
p2->next=pre;
p2=pre;
}
else
p=pre;
pre=pre->next;
}
p2->next=NULL;
p->next=NULL;
return head2;
}
//删除链表中大约x不大于y的节点
void node_dele_XtoY(node*head,int x,int y)
{
node*p=head,*pre=p->next,*pmid;
while(pre){
pmid=pre->next;
if(pre->info>x&&pre->info<=y){
p->next=pre->next;
free(pre);
}
else p=p->next;
pre=pmid;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。