链表的创建、修改、删除、排序、销毁

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    int data;
    struct node *pnext;
}linknode;

linknode *creatlinklist(void)
{
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if(NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return NULL;
    }

    ptmpnode->pnext = NULL;

    return ptmpnode;
}

int insertheadlinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if(NULL == ptmpnode)
    {
        printf("malloc failed!\n");
        return -1;
    }

    ptmpnode->data = tmpdata;
    ptmpnode->pnext = phead->pnext;
    phead->pnext = ptmpnode;

    return 0;
}

int showlinklist(linknode *phead)
{
    linknode *ptmp = NULL;

    ptmp = phead->pnext;
    while(ptmp != NULL)
    {
        printf("%d\n", ptmp->data);
        ptmp = ptmp->pnext;
    }

    return 0;

}

linknode *findlinklist(linknode *phead, int tmpdata)
{
    linknode *tmp = NULL;

    tmp = phead->pnext;
    while(tmp != NULL)
    {
        if(tmpdata == tmp->data)
        {
            return tmp;
        }
        tmp = tmp->pnext;
    }

    return NULL;
}

int replacelinklist(linknode *phead, int olddata, int newdata)
{
    linknode *tmp = NULL;

    tmp = phead->pnext;

    while(tmp != NULL)
    {
        if(tmp->data == olddata)
        {
            tmp->data = newdata;
        }
        tmp = tmp->pnext;
    }
    return 0;
}

int inserttaillinklist(linknode *phead, int tmpdata)
{
    linknode *ptmp = NULL;
    linknode *plastnode = NULL;

    ptmp = malloc(sizeof(linknode));
    if(NULL == ptmp)
    {
        printf("failed!\n");
        return -1;
    }

    ptmp->data = tmpdata;
    ptmp->pnext = NULL;

    plastnode = phead;

    while(plastnode->pnext != NULL)
    {
        plastnode = plastnode->pnext;
    }
    plastnode->pnext = ptmp;

    return 0;
}

int deletelinklist(linknode *phead, int tmpdata)
{
    linknode *ptmpnode = NULL;
    linknode *pprenode = NULL;

    pprenode = phead;
    ptmpnode = phead->pnext;

    while(ptmpnode != NULL)
    {
        if(ptmpnode->data == tmpdata)
        {
            pprenode->pnext = ptmpnode->pnext;
            free(ptmpnode);
            ptmpnode = pprenode->pnext;
        }
        else
        {
            ptmpnode = ptmpnode->pnext;
            pprenode = pprenode->pnext;
        }
    }

    return 0;
}

int destroylinklist(linknode **pphead)
{
    linknode *ptmpnode = NULL;
    linknode *pprenode = NULL;

    ptmpnode = pprenode = *pphead;
    while(ptmpnode != NULL)
    {
        ptmpnode = ptmpnode->pnext;
        free(pprenode);
        pprenode = ptmpnode;
    }
    *pphead = NULL;

    return 0;
}

int maopaolinklist(linknode *phead)
{
    linknode *ptmpnode1 = NULL;
    linknode *ptmpnode2 = NULL;
    linknode *pend = NULL;
    int tmp = 0;

    while(1)
    {
        ptmpnode1 = phead->pnext;
        ptmpnode2 = phead->pnext->pnext;

        if(ptmpnode2 == pend)
        {
            break;
        }

        while(ptmpnode2 != pend)
        {
            if(ptmpnode1->data > ptmpnode2->data)
            {
                tmp = ptmpnode1->data;
                ptmpnode1->data = ptmpnode2->data;
                ptmpnode2->data = tmp;
            }

        ptmpnode1 = ptmpnode1->pnext;
        ptmpnode2 = ptmpnode2->pnext;
        }

    pend = ptmpnode1;
    }

    return 0;
}

int main(void)
{
    linknode *plinklist = NULL;
    linknode *p = NULL;
   
    plinklist = creatlinklist();

    insertheadlinklist(plinklist, 1);
    insertheadlinklist(plinklist, 2);
    insertheadlinklist(plinklist, 3);
    insertheadlinklist(plinklist, 4);
    insertheadlinklist(plinklist, 3);
    insertheadlinklist(plinklist, 3);
    showlinklist(plinklist);

    p = findlinklist(plinklist, 2);
    if(p != NULL)
    {
        printf("%p, %d\n", p, p->data);
    }

    replacelinklist(plinklist, 2, 10);

    showlinklist(plinklist);

    printf("--------------\n");
    inserttaillinklist(plinklist, 5);
    inserttaillinklist(plinklist, 6);
    inserttaillinklist(plinklist, 3);
    showlinklist(plinklist);
    
    printf("-------\n");
    deletelinklist(plinklist, 3);
    showlinklist(plinklist);

    printf("-----------\n");
    maopaolinklist(plinklist);
    showlinklist(plinklist);
    printf("--------\n");

    destroylinklist(&plinklist);
    printf("plinklist:%p\n", plinklist);
    return 0;
}

选择排序:

int selectsortlinklist(linknode *phead)
{
	linknode *pselectnode = NULL;
	linknode *pminnode = NULL;
	linknode *ptmpnode = NULL;
	int tmp;
	
	pselectnode = phead->pnext;
	while (pselectnode->pnext != NULL)
	{
		pminnode = pselectnode;
		ptmpnode = pselectnode->pnext;
		while (ptmpnode != NULL)
		{
			if (ptmpnode->data < pminnode->data)
			{
				pminnode = ptmpnode;
			}

			ptmpnode = ptmpnode->pnext;
		}
		if (pminnode != pselectnode)
		{
			tmp = pminnode->data;
			pminnode->data = pselectnode->data;
			pselectnode->data = tmp;
		}

		pselectnode = pselectnode->pnext;
	}

	return 0;
}

解决段错误的办法:
1. 打印法;

2. 调试器

        编译时要加上-g选项、使用gdb调试生成的代码;

3. core文件调试法(只能调试段错误)

        配置core文件;

        编译代码加入-g选项;

        运行代码使其产生段错误会生成一个包含错误的core文件;

        gdb a.out core        找到错误位置。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值