/*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);
}
#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);
}