对于链表我都快忘记了,于是花了点时间重温一下。
对于基础的介绍我就不多说了,链表最基本的功能,增删改,排序,展示。
typedef struct node
{
int dataType;
struct node * pNext;
}NODE,*PNODE;
最基本的结构体,数据和next指针,当然数据可以是各种类型甚至也可以是一个结构体。首先得建表,是需要一个lenth的,当然可以写代码,我嫌麻烦直接弄一个全局变量lenth。
//int lenth(PNODE pHead)
//{
// PNODE p = pHead->pNext;
// int lenth = 0;
// for(lenth = 0;p != NULL;lenth++)
// {
// p = p->pNext;
// }
// return lenth;
//}
建表:
PNODE createList()
{
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(pHead != NULL)
{
PNODE pH = pHead;
pHead->pNext = NULL;
printf("lenth of node: ");
scanf_s("%d",&lenth);
for(int i = 0; i < lenth; i ++)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
if(p != NULL)
{
printf("input value: ");
scanf_s("%d",&val);
p->dataType = val;
pH->pNext = p;
p->pNext = NULL;
pH = p;
}
}
}
return pHead;
}
代码比较简单。主要是增加和删除,主要思路:如图
void deleteNode(PNODE pHead,int pos)
{
int i;
PNODE p = pHead;
if( p !=NULL && pos <= lenth)
{
for(i = 0;i < pos - 1; i ++)
{
p = p->pNext;
}
PNODE q = p->pNext;
p->pNext = q->pNext;
free(q);
q = NULL;
lenth --;
}
else
{
printf("删除位置有误,链表不变\n");
}
}
void insert(PNODE pHead,int pos,int val)
{
int i;
PNODE p = pHead;
if( p !=NULL && pos <= lenth)
{
for(i = 0;i < pos - 1; i ++)
{
p = p->pNext;
}
PNODE q = (PNODE)malloc(sizeof(NODE));
q->dataType = val;
q->pNext = p->pNext;
p->pNext = q;
lenth ++;
}
else
{
printf("插入位置有误,链表不变\n");
}
}
其他的就手到擒来了。display很简单,排序基于display遍历的思想,第二层循环每次只于后面的进行比较。
void display(PNODE pHead)
{
PNODE p1;
int i;
// int len = lenth(pHead);
for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
{
printf("%d -->",p1->dataType);
}
printf("NULL\n");
}
void sort(PNODE pHead) //排序
{
PNODE p1,p2;
int i,j;
int m;
// int len = lenth(pHead);
for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
{
for(j = i+1,p2 = p1->pNext; j < lenth; j ++, p2 = p2->pNext)
{
if(p1->dataType > p2->dataType)
{
m = p1->dataType;
p1->dataType = p2->dataType;
p2->dataType = m;
}
}
}
}
void modify(PNODE pHead,int pos,int val) //修改
{
int i;
PNODE p = pHead;
if( p !=NULL && pos <= lenth)
{
for(i = 0;i < pos - 1; i ++)
{
p = p->pNext;
}
p->pNext->dataType = val;
}
}
最后附上完整测试代码
#include <stdlib.h>
int lenth = 0;
typedef struct node
{
int dataType;
struct node * pNext;
}NODE,*PNODE;
PNODE createList()
{
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(pHead != NULL)
{
PNODE pH = pHead;
pHead->pNext = NULL;
printf("lenth of node: ");
scanf_s("%d",&lenth);
for(int i = 0; i < lenth; i ++)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
if(p != NULL)
{
printf("input value: ");
scanf_s("%d",&val);
p->dataType = val;
pH->pNext = p;
p->pNext = NULL;
pH = p;
}
}
}
return pHead;
}
//int lenth(PNODE pHead)
//{
// PNODE p = pHead->pNext;
// int lenth = 0;
// for(lenth = 0;p != NULL;lenth++)
// {
// p = p->pNext;
// }
// return lenth;
//}
void display(PNODE pHead)
{
PNODE p1;
int i;
// int len = lenth(pHead);
for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
{
printf("%d -->",p1->dataType);
}
printf("NULL\n");
}
void deleteNode(PNODE pHead,int pos)
{
int i;
PNODE p = pHead;
if( p !=NULL && pos <= lenth)
{
for(i = 0;i < pos - 1; i ++)
{
p = p->pNext;
}
PNODE q = p->pNext;
p->pNext = q->pNext;
free(q);
q = NULL;
lenth --;
}
else
{
printf("删除位置有误,链表不变\n");
}
}
void insert(PNODE pHead,int pos,int val)
{
int i;
PNODE p = pHead;
if( p !=NULL && pos <= lenth)
{
for(i = 0;i < pos - 1; i ++)
{
p = p->pNext;
}
PNODE q = (PNODE)malloc(sizeof(NODE));
q->dataType = val;
q->pNext = p->pNext;
p->pNext = q;
lenth ++;
}
else
{
printf("插入位置有误,链表不变\n");
}
}
void sort(PNODE pHead)
{
PNODE p1,p2;
int i,j;
int m;
// int len = lenth(pHead);
for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
{
for(j = i+1,p2 = p1->pNext; j < lenth; j ++, p2 = p2->pNext)
{
if(p1->dataType > p2->dataType)
{
m = p1->dataType;
p1->dataType = p2->dataType;
p2->dataType = m;
}
}
}
}
void modify(PNODE pHead,int pos,int val)
{
int i;
PNODE p = pHead;
if( p !=NULL && pos <= lenth)
{
for(i = 0;i < pos - 1; i ++)
{
p = p->pNext;
}
p->pNext->dataType = val;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
PNODE pHead1 = createList();
display(pHead1);
deleteNode(pHead1,2);
display(pHead1);
insert(pHead1,2,10);
display(pHead1);
sort(pHead1);
display(pHead1);
modify(pHead1,1,6);
display(pHead1);
return 0;
}