数据结构_线性表链式存储Node

/*Linked List,只包含一个指针的单链表,头指针head是附设的(不是关键字,可以改的),最后一个结点的指针指向NULL,画图的时候可以用^标记*/


#include<stdio.h>

typedef int DataType;

struct node
{
 DataType data;
 struct node *next;   //指针指向下一个结点,不是数据
};


int getSize(struct node *head);//链表的大小,传进来的是头指针
strct node *getptr(struct node *head,int pos);//获得指定位置的结点
bool insert(struct node **head,int pos,DataType x);//插入
bool erase(struct node **head,int pos);//删除
bool set(struct node *head,int pos,DataType x);//修改
void clear(struct node *head);//销毁
void travel(struct node *head);//遍历
void connect(struct node *list,struct node **list1);//链表合并


int main()
{
return 0;
}


//函数实现
int getSize(struct node *head)
{
 struct node *p=head;
 int count=0;
 while(p)
 {
   p=p->next;
   count++;
  }
 return count;
}


strct node *getptr(struct node *head,int pos)//程序中没有判断pos<0的情况
{
 struct node *p=head;
 if(p==NULL ||pos==0)
   return head;
 for(int i=0;i<pos && p;i++)
  p=p->next;
 return p;
}


bool insert(struct node **head,int pos,DataType d)
{
 if(pos<0 ||pos>getSize(*head))
  return false;
 
 struct node *new_node=(struct node*)malloc(sizeof(struct node));//强制转换


,其实这边应该判断下malloc有没有成功
 new_node->next=d;
 new_node->next=NULL;//初始化


 if(pos==0){
 new_node->next=*head;
 *head=new_node;
 }
 else{
 struct node *p=getptr(*head,pos-1);
 struct node *r=p->next;
 new_node->next=r;
 p->next=new_node;
 }
return true;
}


bool erase(struct node **head,int pos)
{
 if(pos<0 ||pos>getSize(*head))
  return false;


 struct node *p=*head;
 if(pos=0){
  *head=p->next;
  free(p);
  p=NULL;
  }
 else{
  p=getptr(*head,pos-1);
  struct node *q=p->next;
  p->next=q->next;
  free(q);
  q=NULL;
  }


 return true;
}


bool set(struct node *head,int pos,DataType x)
{
 if(pos<0 ||pos>getSize(head);
  return false;


 struct node *p=getptr(head,pos);
 p->data=x;
 return true;
}




void clear(struct node *head)
{
  while(head){
   struct node*p=head->next;
   free(head);
   head=p;
  }
}


void travel(struct node *head)
{
 struct node *p=head;
 while(p){
 printf("%d ",p->data);
 p=p->next;
 }
}


void connect(struct node *list,struct node *list1)
{
 struct node *p=getptr(list,getSize(list)-1);
  p->next=*list1;


//老师用的方法是插入,如下,这个insert函数是重写的在队尾插入的函数,两个函数
参数数目不同,没有冲突
//另外在两个链表有序后合并继续有序的情况,需要另外处理
 for(int i=0;i<getSize(list1);i++)
  insert(&list,getptr(list1,i)->data);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值