解释说明
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。这组存储单元可以是连续的,也可以是不连续的。链表中的数据是以结点来表示的,一个结点包含数据域data和指针域next,数据域用来存储结点的值,指针域用来存储数据域的直接后继的地址,单链表结点的而结构如下图:
代码展示
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}LNode;
//创建单链表
LNode *CreatLinkList()
{
int i,value,len;
LNode *head=(LNode *)malloc(sizeof(LNode));
LNode *p,*q;
head->next=NULL;
p=head;
printf("输入单链表初始的长度:");
scanf("%d",&len);
for (i=0;i<len;i++) {
printf("请输入第%d个节点的值:",i+1);
scanf("%d",&value);
q=(LNode *)malloc(sizeof(LNode));
q->data=value;
q->next=NULL;
p->next=q;
p=p->next;
}
return head;
}
//遍历单链表
void Trave_LinkList(LNode *head)
{
LNode *p=head->next;
while (p!=NULL) {
printf("%d ",p->data);
p=p->next; //你要往循环终止的方向走
}
printf("\n");
}
//查找位置,返回指针
LNode *Loc_LinkList(LNode *head,int index)
{
int i=0;
LNode *p=head->next;
if (p!=NULL) {
for (i=1;i<index;i++) {
p=p->next;
}
}
return p;
}
//插入元素
void Insert_LinkList(LNode *head,int index,int x)
{
LNode *p=Loc_LinkList(head,index-1);
LNode *q,*pNew;
if (p==NULL) {
printf("第%d个位置不存在!",index);
} else {
q=p->next;
pNew=(LNode *)malloc(sizeof(LNode));//一定要为新节点分配空间
pNew->data=x;
pNew->next=q;
p->next=pNew;
}
}
//删除元素
int Delet_LinkList(LNode *head,int index)
{
int x;
LNode *p=Loc_LinkList(head,index-1);
LNode *q;
if (p==NULL) {
printf("第%d个位置不存在!",index-1);
} else if(p->next==NULL) {
printf("第%d个节点不存在!\n",index);
} else {
q=p->next;
x=q->data;
p->next=q->next;
free(q);
}
return x;
}
//查找指定位置上的值并修改
void Select_LinkList(LNode *head,int index)
{
int x;
LNode *p=Loc_LinkList(head,index);
if (p==NULL) {
printf("指定位置不存在!\n");
return;
} else {
printf("第%d个位置上的值是:%d\n",index,p->data);
printf("请输入要修改的值:");
scanf("%d",&x);
p->data=x;
}
}
//求链表的长度
int Lenth_LinkList(LNode *head)
{
int len=0;
LNode *p=head->next;
while (p!=NULL) {
len++;
p=p->next;
}
return len;
}
//链表排序(冒泡排序)
void Sort_LinkList(LNode *head)
{
int i,j,temp;
LNode *p;
LNode *q;
int len=Lenth_LinkList(head);
for (i=0,p=head->next;i<len;i++,p=p->next) {
for (j=i+1,q=p->next;j<len-i;j++,q=q->next) {
if (p->data>q->data) {
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
}
//查找值返回指定位置
int Get_LinkList(LNode *head,int x)
{
LNode *p=head->next;
int index=1;
while (p!=NULL&&p->data!=NULL) {//当p与指定值不等时就循环
p=p->next;
index++;
}
return index;
}
//元素的逆序
LNode *Rever_LinkList(LNode *head)//逆序链表
{
LNode *p1,*p2,*p3;
if(head==NULL||head->next==NULL) {
return head;
}
p2=head; //指向第一个节点
p1=head->next; //指向第二个节点
head->next=NULL; //第一个节点后继置空
while(p1!=NULL)
{
p3=p2; //p3指向p2位置
p2=p1; //p2指向p1位置
p1=p1->next; //p1指向下一个节点
p2->next=p3; //逆序节点
}
head=p2; //头指针指向逆序后的第一个节点
return head;
}
int main()
{
int index,x,i;
printf("创建单链表:\n");
LNode *head=CreatLinkList();
printf("创建的单链表为:\n");
Trave_LinkList(head);
int run=1;
while (run==1) {
printf("1.插入元素\n2.删除元素\n3.修改元素的值\n4.链表长度\n5.链表排序\n6.链表查找\n7.链表逆序\n");
printf("请输入操作:");
scanf("%d",&i);
switch (i) {
case 1: printf("请输入插入的位置和插入的元素:");
scanf("%d %d",&index,&x);
Insert_LinkList(head,index,x);
Trave_LinkList(head);
break;
case 2: printf("请输入删除的位置:");
scanf("%d",&index);
printf("删除的值为:%d\n",Delet_LinkList(head,index));
Trave_LinkList(head);
break;
case 3: printf("修改指定位置上的值,请输入位置:");
scanf("%d",&index);
Select_LinkList(head,index);
Trave_LinkList(head);
break;
case 4: printf("单链表的长度为:%d\n",Lenth_LinkList(head));
break;
case 5: printf("对单链表进行排序后的结果为:");
Sort_LinkList(head);
Trave_LinkList(head);
break;
case 6: Trave_LinkList(head);
printf("输入要查找的值:");
scanf("%d",&x);
if (Get_LinkList(head,x)==(Lenth_LinkList(head)+1)) {
printf("该值不在链表中!\n");
} else {
printf("%d位于第%d个位置上\n",x,Get_LinkList(head,x));
}
break;
case 7: printf("逆序单链表:");
head=Rever_LinkList(head);
Trave_LinkList(head);
break;
}
printf("输入1继续,other结束:");
scanf("%d",&run);
}
return 0;
}