链表的操作(遍历、查找、清空、销毁、求长度、增加、删除)
创建一个链表:需要三个指针(头指针、始终指向尾节点的指针(刚开始让其指向头结点)、新创节点指针)
遍历:需要一个指针P,刚开始指向首节点,用while(NULL!=P)来循环,在循环里面更新指针P,P = P->pNext,让其指向下一个节点。
算法:
狭义的算法是与数据的存储有关
广义的算法与数据的存储无关
泛型:通过某种技术(函数的重载)达到的效果就是:不同的存储方式,使用的操作是一样的
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node *pNext;//指针域,指向的数据类型与本身结构体的数据类型一样
}* P_N,N;//P_N<==>struct Node *,N<==>struct Node
P_N list_creat()
{
int len;
int i;
int val;
P_N pHead = (P_N) malloc(sizeof(N));//创建一个头结点
if(pHead == NULL)
{
printf("内存创建失败,终止程序\n");
exit(-1);
}
P_N pTail = pHead;//创建一个指针,始终指向尾节点
pTail->pNext = NULL;
printf("请输入有效节点的个数:len = ");
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请为第%d个节点赋值:",(i+1));
scanf("%d",&val);
P_N pNew = (P_N) malloc(sizeof(N));//创建一个节点
if(pNew == NULL)
{
printf("内存创建失败,终止程序\n");
exit(-1);
}
pNew->data = val;
pTail->pNext = pNew;//在尾节点挂上新节点
pTail = pNew;//使pTail始终指向尾节点
pTail->pNext = NULL;
}
return pHead;
}
void traverse_list(P_N pHead)
{
P_N p = pHead->pNext;//p指向首节点
while(NULL != p)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
return;
}
bool empty_list(P_N pHead)
{
P_N p = pHead->pNext;
if(NULL == p)
return true;
else
return false;
}
int length_list(P_N pHead)
{
P_N p = pHead->pNext;
int i = 0;
while(NULL != p)
{
i++;
p = p->pNext;
}
return i;
}
void sort_list(P_N pHead)
{
int i,j,t;
int len = length_list(pHead);
P_N p,q;
for(i=0,p=pHead->pNext;i<len-1;i++,p=p->pNext)//冒泡排序法
{
for(j=i+1,q=p->pNext;j<len;j++,q=q->pNext)
if(p->data>q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
bool insert_list(P_N pHead,int pos,int val)//在第pos个有效节点之前插入,从1开始,val要插入的值
{
P_N p = pHead;
int i=0;
while(NULL != p->pNext && i<pos-1)
{
p = p->pNext;
i++;
}
if(p->pNext == NULL || i > pos-1)//考虑了list空,pos值不合法(负数或超过)
return false;
P_N pNew = (P_N)malloc(sizeof(N));
pNew->data = val;
P_N pTemp = (P_N)malloc(sizeof(N));
pTemp = p->pNext;
p->pNext = pNew;
pNew->pNext = pTemp;
return true;
}
bool delete_list(P_N pHead,int pos,int * val)
{
P_N p = pHead;
int i = 0;
while(NULL!=p->pNext && i< pos -1)
{
p = p->pNext;
i++;
}
if(i>pos-1 || NULL==p->pNext)
return false;
P_N q = p->pNext;//删除p节点后面的一个节点
* val = q->data;
p->pNext = q->pNext;
free(q);
return true;
}
int main(void)
{
int del_val;
int len;
P_N pHead = NULL;//创建一个头指针
pHead = list_creat();//创建一个链表,使头指针指向链表的头结点
/*len = length_list(pHead);
printf("len = %d\n",len);
traverse_list(pHead);
sort_list(pHead);
traverse_list(pHead);*/
insert_list(pHead,3,5);
traverse_list(pHead);
delete_list(pHead,4,&del_val);
traverse_list(pHead);
return 0;
}