#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 找到错误位置。