数据结构day02(单链表)

 排序 

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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值