对于在数据结构中的链表,无非就是C语言中指针的合理运用罢了。
链表分为以下几种:单链表,双向链表,循环链表以及双向循环链表。
单链表
单链表的操作:创建单链表,销毁单链表,插入和删除操作等
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node *pNext;//指针域
}NODE,*PNODE;
//函数声明
PNODE creat_list(void);//创建链表
void traverse_list(PNODE pHead);//遍历链表
bool is_empty(PNODE pHead);//判断链表是否为空
int length_list(PNODE pHead);//求链表的长度
bool insert_list(PNODE pHead,int pos,int val);//链表的插入操作
bool delete_list(PNODE pHead,int pos,int val);//链表的删除操作
int main()
{
PNODE pHead=NULL;
int pos;
int val;
pHead=creat_list();//创建一个非循环的单链表
traverse_list(pHead);
if(is_empty(pHead))
printf("链表为空\n");
else
printf("链表非空\n");
int len=length_list(pHead);
printf("链表的长度是:%d\n",len);
insert_list(pHead,pos,val);
traverse_list(pHead);
delete_list(pHead,pos,val);\
traverse_list(pHead);
return 0;
}
PNODE creat_list(void)//创建链表
{
int len;//结点的个数
int i;//表示循环的次数
int val;//结点中的数据域
PNODE pHead=(PNODE)malloc(sizeof(NODE));//创建一个头结点
PNODE pTail=pHead;//表示一个尾结点
pTail->pNext=NULL;
if(pHead==NULL)//判断是否成功创建头结点
{
printf("分配失败,程序终止\n");
exit(-1);
}
printf("请输入你要输入的结点的个数:");
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请输入第%d个结点的值:",i+1);
scanf("%d",&val );
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
printf("分配失败,程序终止\n");
exit(-1);
}
//依次将生成的结点;;连接起来
pNew->data=val;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)//遍历链表
{
PNODE p=pHead->pNext;
while(p!=NULL)
{
printf("%d\n",p->data);
p=p->pNext;
}
}
bool is_empty(PNODE pHead)//判断链表是否非空
{
if(pHead->pNext==NULL)
return true;
else
return false;
}
int length_list(PNODE pHead)//求链表的长度
{
int i=0;
PNODE p=pHead->pNext;
while(p!=NULL)
{
i++;
p=p->pNext;
}
return i;
}
bool insert_list(PNODE pHead,int pos,int val)//单链表的插入操作
{
printf("请输入你要在哪个结点之前插入:");
scanf("%d",&pos);
printf("请输入插入节点的数据域:");
scanf("%d",&val);
PNODE p=pHead;
int j=0;
while(j<pos-1&&p!=NULL)
{
j++;
p=p->pNext;
}
if(p==NULL)
return false;
else//此时指针p已经指向pos-1位置的结点
{
PNODE s;
s=(PNODE)malloc(sizeof(NODE));
s->data=val;
s->pNext=p->pNext;
p->pNext=s;
return true;
}
}
bool delete_list(PNODE pHead,int pos,int val)//单链表的删除操作
{
printf("请输入需要删除的节点:");
scanf("%d",&pos);
PNODE p=pHead;
PNODE q;
int j=0;
while(j<pos-1&&p!=NULL)
{
j++;
p=p->pNext;
}
if(p==NULL)
return false;
else
{
q=p->pNext;
if(q==NULL)
return false;
val=q->data;
p->pNext=q->pNext;
free(q);
return true;
}
}
通过上面的代码实现了单链表的大部分操作,其余的大家可以根据这些举一反三