敲黑板划重点
头文件 myll.h
/*************************************************************************
> File Name: myll.h
> Author:lanyxs
> Mail:lanyxs@126.com
> Created Time: Thu 08 Aug 2019 12:27:53 AM PDT
************************************************************************/
#ifndef _MYLL_H
#define _MYLL_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int DATA_T;
typedef struct node
{
DATA_T data;
struct node *pNext;
}NODE;
typedef struct list
{
NODE *phead;
NODE *ptial;
int len;
}LLT;
int create_list(LLT **pplist);
int destory_list(LLT **pplist);
int insert_elem(LLT *plist,int index,DATA_T newData);
int print_list(LLT *plist);
int delete_elem(LLT *plist,int index);
int replace_elem(LLT *plist,int index,DATA_T rdata);
#endif
函数文件:my_link-list.c
/*************************************************************************
> File Name: my_link_list.c
> Author:lanyxs
> Mail:lanyxs@126.com
> Created Time: Thu 08 Aug 2019 12:33:49 AM PDT
************************************************************************/
#include "../include/myll.h"
/*创建链表*/
int create_list(LLT **pplist)
{
if(pplist == NULL)
{
puts("NULL pointer error.");
return -1;
}
*pplist = (LLT *)malloc(sizeof(LLT));
if((*pplist) == NULL)
{
puts("malloc faild");
return -1;
}
memset(*pplist,0,sizeof(LLT));
(*pplist)->phead = NULL;
(*pplist)->ptial = NULL;
(*pplist)->len = 0;
return 0;
}
/*销毁链表*/
int destory_list(LLT **pplist)
{
if(pplist == NULL || (*pplist) == NULL)
{
puts("NULL pointer error.");
return -1;
}
if((*pplist)->phead != NULL)
{
NODE *p = (*pplist)->phead;
while(p)
{
NODE *pTemp = p;
p = p->pNext;
free(pTemp);
}
}
free(*pplist);
*pplist = NULL;
return 0;
}
/*插入*/
int insert_elem(LLT *plist,int index,DATA_T newData)
{
if(plist == NULL)
{
puts("NULL pointer error.");
return -1;
}
if(index < 0 || index > plist->len)
{
puts("index out range.");
return -1;
}
NODE *p = (NODE *)malloc(sizeof(NODE));
if(p == NULL)
{
puts("malloc node fault.");
return -1;
}
p->data = newData;
if(index == 0 && plist->len == 0) //头部插入(第一次)
{
p->pNext = NULL;
plist->phead = p;
plist->ptial = p;
}
else if(index == 0 && plist->len != 0) //头部插入(不是首次插入)
{
p->pNext = plist->phead;
plist->phead = p;
}
else if(index > 0 && index < plist->len) //中间插入
{
int i;
NODE *ptmp = plist->phead;
for(i = 0;i < index-1;i++)
{
ptmp = ptmp->pNext;
}
p->pNext = ptmp->pNext;
ptmp->pNext = p;
}
else if(index == plist->len) //尾部插入
{
plist->ptial->pNext = p;
plist->ptial = p;
p->pNext = NULL;
}
plist->len += 1;
return 0;
}
/*遍历*/
int print_list(LLT *plist)
{
if(plist == NULL || plist->phead == NULL)
{
puts("NULL pointer error.");
return -1;
}
NODE *ptmp = plist->phead;
while(ptmp)
{
printf("%d ",ptmp->data);
ptmp = ptmp->pNext;
}
puts("");
return 0;
}
/*删除*/
int delete_elem(LLT *plist,int index)
{
if(plist == NULL || plist->phead == NULL)
{
puts("NULL pointer error.");
return -1;
}
if(index > plist->len || index < 0)
{
puts("index out range.");
return -1;
}
NODE *p = plist->phead;
if(index == 0)
{
plist->phead = p->pNext;
if(plist->len == 1)
{
plist->ptial = NULL;
}
free(p);
}
else if(index > 0)
{
int i;
for(i = 0;i < index-1;i++)
{
p = p->pNext;
}
if(index == plist->len-1)
{
plist->ptial = p;
free(p->pNext);
p->pNext = NULL;
}
if(index != plist->len-1)
{
NODE *pdel = p->pNext;
p->pNext = pdel->pNext;
free(pdel);
}
}
plist->len -= 1;
return 0;
}
/*replace*/
int replace_elem(LLT *plist,int index,DATA_T rdata)
{
if(plist == NULL || plist->phead == NULL)
{
puts("NULL pointer error.");
return -1;
}
if(index < 0 || index > plist->len)
{
puts("index out range.");
return -1;
}
int i;
NODE *p = plist->phead;
for(i = 0;i < index;i++)
{
p = p->pNext;
}
p->data = rdata;
return 0;
}
/*排序*/
int sort_list(LLT *plist)
{
if(plist == NULL || plist->phead == NULL)
{
puts("NULL pointer error.");
return -1;
}
NODE *p1 = plist->phead;
NODE *p2 = plist->phead;
while(p1)
{
p2 = p1->pNext;
while(p2)
{
if(p1->data > p2->data)
{
/*用交换结点函数进行交换*/
swap_node(plist,p1,p2);
}
p2 = p2->pNext;
}
p1 = p1->pNext;
}
return 0;
}
/*删除多余元素*/
int del_res_elem(LLT *plist)
{
if(plist == NULL)
{
puts("NULL pointer error.");
return -1;
}
NODE *p1 = plist->phead;
while(p1)
{
NODE *p2 = p1;
while(p2->pNext)
{
if(p1->data == p2->pNext->data)
{
NODE *ptmp = p2->pNext;
if(ptmp->pNext == NULL)
{
free(ptmp);
p2->pNext = NULL;
break;
}
else{
p2->pNext = ptmp->pNext;
free(ptmp);
}
plist->len -= 1;
}
p2 = p2->pNext;
}
p1 = p1->pNext;
}
return 0;
}
/*找结点的前驱*/
NODE *find_prenode(LLT *plist,NODE *pnode)
{
if(plist == NULL || pnode == NULL)
{
puts("NULL pointer error.");
return NULL;
}
if(pnode == plist->phead) //头指针没有前驱,返回本身
{
return pnode;
}
else{
NODE *preNode = plist->phead;
while(preNode)
{
if(preNode->pNext == pnode)
{
return preNode;
}
preNode = preNode->pNext;
}
}
return NULL;
}
/*交换结点*/
int swap_node(LLT *plist,NODE *pnode1,NODE *pnode2)
{
if(plist == NULL || pnode1 == NULL || pnode2 == NULL)
{
puts("NULL pointer error.");
return -1;
}
NODE *pPre1 = find_prenode(plist,pnode1);
NODE *pPre2 = find_prenode(plist,pnode2);
if(pPre1 == NULL || pPre2 ==NULL) return -1;
/*相邻的情况(pnode1在前,pnode2在后)*/
if(pnode1 == pPre2)
{
if(pnode1 == plist->phead)
{
plist->phead = pnode2; /*头部两个相邻*/
}else{
pPre1->pNext = pnode2;
}
if(pnode2->pNext == NULL) /*尾部两个相邻*/
{
pnode1->pNext = NULL;
plist->ptial = pnode1;
}else{
pnode1->pNext = pnode2->pNext;
}
pnode2->pNext = pnode1;
return 0;
}
/*相邻的情况(pnode2在前,pnode1在后)*/
if(pnode2 == pPre1)
{
if(pnode2 == plist->phead)
{
plist->phead = pnode1;
}else{
pPre2->pNext = pnode1;
}
if(pnode1->pNext == NULL)
{
pnode2->pNext = NULL;
plist->ptial = pnode2;
}else{
pnode2->pNext = pnode1->pNext;
}
pnode1->pNext = pnode2;
return 0;
}
/*不相邻的情况*/
else{
if(plist->phead == pnode1 && pnode2->pNext != NULL)
{
NODE *p = pnode1->pNext;
plist->phead = pnode2;
pnode1->pNext = pnode2->pNext;
pPre2->pNext = pnode1;
pnode2->pNext = p;
}
if(plist->phead == pnode2 && pnode1->pNext != NULL)
{
NODE *p = pnode2->pNext;
plist->phead = pnode1;
pnode2->pNext = pnode1->pNext;
pPre1 ->pNext = pnode2;
pnode1->pNext = p;
}
if(plist->phead == pnode1 && pnode2->pNext == NULL)
{
plist->phead = pnode2;
pnode2->pNext = pnode1->pNext;
pPre2->pNext = pnode1;
pnode1->pNext = NULL;
plist->ptial = pnode1;
}
if(plist->phead == pnode2 && pnode1->pNext == NULL)
{
plist->phead = pnode1;
pnode1->pNext = pnode2->pNext;
pPre1->pNext = pnode2;
pnode2->pNext = NULL;
plist->ptial = pnode2;
}
else{
NODE *p = pnode1->pNext;
pnode1->pNext = pnode2->pNext;
pPre1->pNext = pnode2;
pPre2->pNext = pnode1;
pnode2->pNext = p;
}
return 0;
}
return 0;
}
main.c
/*************************************************************************
> File Name: main.c
> Author:lanyxs
> Mail:lanyxs@126.com
> Created Time: Thu 08 Aug 2019 12:54:19 AM PDT
************************************************************************/
#include "../include/myll.h"
int main()
{
int op,index;
DATA_T data;
LLT *plist = NULL;
create_list(&plist);
printf("1.---------------[ insert ]---------\n");
printf("2.---------------[ output ]---------\n");
printf("3.---------------[ delete ]---------\n");
printf("4.---------------[ replace ]--------\n");
printf("5.---------------[ DelResElem ]--------\n");
printf("6.---------------[ sortList ]--------\n");
printf("0.---------------[ exit ]--------\n");
while(1)
{
printf("please input option:");
scanf("%d",&op);
switch(op)
{
case 1:
puts("please input data and index:");
scanf("%d%d",&data,&index);
insert_elem(plist,index,data);
break;
case 2:
print_list(plist);
break;
case 3:
puts("please input delete index");
scanf("%d",&index);
delete_elem(plist,index);
break;
case 4:
puts("please input replace data and index:");
scanf("%d%d",&data,&index);
replace_elem(plist,index,data);
break;
case 5:
del_res_elem(plist);
break;
case 6:
puts("-------排序后----------");
sort_list(plist);
print_list(plist);
break;
case 0:
return -1;
}
}
destory_list(&plist);
return 0;
}