作为一名通工转cs的coder,这学期中终于开始学习数据结构,在此做一些学习总结,以下是实现的一些功能:
- 建立链表
- 求链表长度
- 打印数据
- 按序号查找
- 按值查找
- 单链表的插入,按序号插入
- 删除链表第i个元素
- 倒置链表
- 单链表中删除重复节点,排序思想,双重循环进行比较
冒泡排序
定义结构体
struct node
{
int num;
struct node *next;
};
typedef struct node *LinkList,Node;
建立链表
LinkList create_LinkList();
LinkList create_LinkList()
{
LinkList h=(LinkList)malloc(sizeof(Node));
h->next=NULL;
Node *s,*r=h;
int x;
scanf("%d",&x);
while(x!=-1)
{
s=(LinkList)malloc(sizeof(Node));
s->num=x;
r->next=s;
r=s;
//s->next=r->next;
//r->next=s;
//r=s;
scanf("%d",&x);
}
r->next=NULL;
return h;
}
求链表长度
int getLength_LinkList(LinkList h);
int getLength_LinkList(LinkList h)
{
Node *p=h;
int Length=0;
while(p->next!=NULL)
{
p=p->next;
Length++;
}
return Length;
}
打印数据
void print_LinkList(LinkList h);
void print_LinkList(LinkList h)
{
Node *p;
p=h->next;
if(p==NULL)
printf("LinkList is NULL!");
printf("Head:");
while(p!=NULL)
{
printf("%d -> ",p->num);
p=p->next;
}
printf("NULL");
}
按序号查找
LinkList get_LinkList(LinkList h, int k);
LinkList get_LinkList(LinkList h, int k)
{
Node *p=h;
int i=0;
while(p->next != NULL && i<k)
{
p=p->next;
i++;
}
if(i==k)
return p;
else
return NULL;
}
按值查找
LinkList locate_LinkList(LinkList h,int x);
LinkList locate_LinkList(LinkList h,int x)
{
Node *p=h->next;
while(p!=NULL&&p->num!=x)
p=p->next;
if(p==NULL)
return NULL;
else
return p;
}
单链表的插入,按序号插入
LinkList insert_LinkList(LinkList h, int i, int x);
LinkList insert_LinkList(LinkList h, int i, int x)
{
Node *p,*s;
p=get_LinkList(h,i-1);
if(p==NULL)
{
printf("插入位置i错!");
return;
}
else
{
s=(LinkList)malloc(sizeof(Node));
s->num=x;
s->next=p->next;
p->next=s;
printf("插入成功!");
}
}
删除链表
LinkList delete_LinkList(LinkList h, int i);
LinkList delete_LinkList(LinkList h, int i)
{
Node *p,*q;
p=get_LinkList(h,i-1);
if(p==NULL||p->next==NULL)
{
printf("第i-1个节点不存在!");
return;
}
else
{
q=p->next;
p->next=p->next->next;
free(q);
printf("删除成功!");
}
}
倒置链表
void remove_LinkList(LinkList h);
void remove_LinkList(LinkList h)
{
Node *p,*q;
p=h->next;
h->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=h->next;
h->next=q;
}
}
单链表中删除重复节点,排序思想,双重循环进行比较
void pur_LinkList(LinkList h);
void pur_LinkList(LinkList h)
{
Node *p,*q,*r;
p=h->next;
if(p!=NULL)
while(p->next)
{
q=p;
while(q->next)
{
if(p->num==q->next->num)
{
r=q->next;
q->next=q->next->next;
free(r);
}
else
q=q->next;
}
p=p->next;
}
}
冒泡排序(可优化)
void bubblesort_LinkList(LinkList h);
void bubblesort_LinkList(LinkList h)
{
Node *p,*q,*x,*y;
p=h;
if(p->next==NULL||p->next->next==NULL)
return;
for(;p->next->next!=NULL;p=p->next)
for(q=p;q->next->next!=NULL;q=q->next)
{
if(q->next->num > q->next->next->num)
{
y=q->next->next;
x=q->next;
q->next=y;
x->next=y->next;
y->next=x;
}
}
}
以上基本是线性单链表的所有操作,可以借鉴交流一下。
由于个人不太喜欢写注释,部分地方需要自己好好想想,画图理解,敬请见谅。