排序
int sort(plink2 l)
{
if (l == 0 || l->len == 0) {
printf("单链表不存在或者为空\n");
return -1;
}
plink2 end = NULL; // end 指针用于标记已经排序好的部分
int swapped;
do {
swapped = 0;
plink2 p = l; // p 从头节点开始(假设 l 是带头节点的链表)
while (p->next != end && p->next->next != NULL)
{
plink2 q = p->next; // q 是 p 的下一个节点
plink2 t = q->next; // t 是 q 的下一个节点
if (q->data > t->data) {
// 交换 q 和 t 两个节点的位置
q->next = t->next;
t->next = q;
p->next = t;
swapped = 1; // 标记发生了交换
}
p = p->next; // 移动到下一个节点
}
end = p->next; // 更新 end 标记,使其指向最后一个已排序节点
}
while (swapped);
return 0;
}
link.c
#include"list.h"
plink2 gethead()
{
plink2 p=malloc(sizeof(link2));
if(p==NULL)
{
printf("申请失败\n");
return NULL;
}
p->len=0;//数据域赋值
p->next=NULL;//指针域赋值
return p;
}
int headinsert(plink2 l,int e)
{
if(l==NULL)
{
printf("单链表不存在");
return -1;
}
plink2 p=malloc(sizeof(link2));
p->data=e;
p->next=l->next;
l->next=p;
l->len++;
}
int nodeoutput(plink2 l)
{
if(l==NULL||l->len==0)
{
printf("单链表为空");
return -1;
}
int i;
plink2 t=l;
for(i=0;i<l->len;i++)
{
t=t->next;
printf("%d\t",t->data);
}
printf("\n");
}
int tailinsert(plink2 l, int e)
{
if(l==NULL)
{
printf("单链表不存在");
return -1;
}
int i;
plink2 t=l;
for(i=0;i<l->len;i++)
{
t=t->next;
}
plink2 p=malloc(sizeof(link2));
p->data=e;
p->next=NULL;
t->next=p;
l->len++;
}
int insertany(plink2 l,int e,int n)
{
if(l==NULL)
{
printf("插入失败");
return -1;
}
int i;
plink2 t=l;
for(i=0;i<n-1;i++)
{
t=t->next;
}
plink2 p=malloc(sizeof(link2));
p->data=e;
p->next=t->next;
t->next=p;
l->len++;
}
int delethead(plink2 l)
{
if(l==NULL||l->len==0)
{
printf("单链表为空");
return -1;
}
plink2 t=l->next;
l->next=t->next;
l->len--;
free(t);
t=NULL;
}
int tail_dele(plink2 l)
{
if(l==NULL||l->len==0)
{
printf("单链表为空");
return -1;
}
int i;
plink2 t=l;
for(i=0;i<l->len-1;i++)
{
t=t->next;
}
plink2 q=t->next;
t->next=NULL;
l->len--;
free(q);
q=NULL;
}
int deletany(plink2 l,int n)
{
if(l==NULL||l->len==0)
{
printf("单链表为空");
return -1;
}
int i;
plink2 t=l;
for(i=0;i<n-1;i++)
{
t=t->next;
}
plink2 q=t->next;
t->next=t->next->next;
l->len--;
free(q);
q=NULL;
}
int valuechange(plink2 l,int n)
{
if(l==NULL||l->len==0)
{
printf("单链表为空");
return -1;
}
int i,key;
int pos=-1;
plink2 t=l;
for(i=0;i<l->len;i++)
{
t=t->next;
if(n==t->data)
{
pos=i+1;
printf("要输入的值\n");
scanf("%d",&key);
t->data=key;
break;
}
}
if(pos==-1)
{
printf("没有要修改的值\n");
return -1;
}
return 0;
}
int nodereverse(plink2 l)//单链表逆置
{
if(l==0||l->len==0)
{
printf("单链表不存在或者为空\n");
return -1;
}
plink2 q = l->next->next;
plink2 t = l->next;
while(q!=NULL)
{
t->next = q->next;//连接上防止丢失
q->next = l->next;//将头结点地址放入逆置节点的指针域
l->next = q;//将逆置的节点地址放入头结点指针域
q = t->next;//将Q往后移动一位
}
}
link.h
#ifndef _LIST_H_
#define _LIST_H_
#include<myhead.h>
typedef struct node
{
union
{
int len;//头子节数据储存链表长度
int data;//正常节点储存数据
};//头结点只用len
struct node *next;//指向下一个节点的指针
}link2,*plink2;
plink2 gethead();
int headinsert(plink2 l,int e);
int nodeoutput(plink2 l);
int tailinsert(plink2 l,int e);
int insertany(plink2 l,int e,int n);
int delethead(plink2 l);
int delettail(plink2 l);
int deletany(plink2 l,int n);
int valuechange(plink2 l,int n);
int nodereverse(plink2 l);
#endif
mymain.c
#include<myhead.h>
#include"list.h"
int main(int argc, const char *argv[])
{
plink2 l=gethead();
int i, a[10]={10,20,30,40,50,60,70,80,90,95};
for(i=0;i<10;i++)
{
tailinsert(l,a[i]);
}
nodeoutput(l);
insertany(l,100,4);
nodeoutput(l);
delethead(l);
nodeoutput(l);
deletany(l,3);
nodeoutput(l);
valuechange(l,50);
nodereverse(l);
nodeoutput(l);
nodereverse(l);
return 0;
}