数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)

9 篇文章 0 订阅
7 篇文章 0 订阅
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>


typedef struct Node
{
int data;//数据域
struct Node * pNext;//指针域
}NODE, * PNODE; //NODE等价于struct Node,  PNODE 等价于struct Node *


//函数声明
void create_list(PNODE pHead);//创建一个动态链表
void traverse_list(PNODE pHead);//输出链表
bool is_empty(PNODE pHead);//判断链表非空
void length_list(PNODE pHead);//求链表长度
void insert_list(PNODE pHead);//插入结点
void delete_list(PNODE pHead);//删除结点
void sort_list(PNODE pHead);//链表元素排序
void play_choose(void);//显示菜单栏
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
int main()
{
int i;
PNODE pHead;
pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
play_choose();
while(true)
{
       printf("\n\t\t请选择你要执行的操作:");
       scanf("%d",&i);
  switch(i)
  {
case 1: create_list(pHead);break;
case 2: traverse_list(pHead);break;
case 3: insert_list(pHead);break;
case 4: delete_list(pHead);break;
  case 5: sort_list(pHead);break;
case 6: play_choose();printf("\t\t\t\t处理后的链表:\n");traverse_list(pHead);break;
case 7: length_list(pHead);break;
case 8: exit(-1);
default:
printf("您输入的是非法值\n\n");
break;
  }
}
    return 0;
}
void play_choose(void)
{
system("cls");
printf("\n\n\n\t\t.......................................\n\n\n");
printf("\t\t      1-建立链表      2-遍历链表               \n\n");
printf("\t\t      3-插入元素      4-删除元素               \n\n");
printf("\t\t      5-排序元素      6-清屏(只显示菜单)       \n\n");
printf("\t\t      7-链表长度      8-退出                  \n\n");
printf("\n\n\t\t.......................................  \n\n\n");
}
void create_list(PNODE pHead)
{
int len ;//用来存放有效结点的个数
int i;
int val;//用来临时存放用户输入的节点的值
PNODE pNew;
    PNODE pTail=pHead;//pTail始终指向尾节点,链表空时pTial指向尾结点即和pHead都指向头结点,
printf("请输入您需要生成链表的节点的个数:len=");
scanf("%d",&len);

for( i=0;i<len;++i)
{
    printf("请输入第%d的值",i+1);
        scanf("%d",&val);


    pNew = (PNODE)malloc(sizeof(NODE));
    if(NULL==pNew)
{
         printf("分配失败,程序终止\n");
         exit(-1);
}
//pNew->date=val;
//pHead->pNext=pNew;
        //pNew->pNext=NULL;
        pNew->data=val;
pTail->pNext=pNew;
//pNew->pNext=NULL;
pTail=pNew;
}
pTail->pNext=NULL;
return;
}
void traverse_list(PNODE pHead)
{
if(is_empty(pHead)==true)
{
printf("链表为空\n");
return;
}
printf("\t\t\t\t");
PNODE  p=pHead->pNext;
while(p!=NULL)
{
printf("%d   ",p->data);
p=p->pNext;
}
printf("\n");
return;
}
bool is_empty(PNODE pHead)
{
if(pHead->pNext==NULL)
{
return true;
}
else
{
       return false;
}
}
void length_list(PNODE pHead)
{
int len=0;
PNODE p=pHead->pNext;
     while(p!=NULL)
{
 
         len++;
p=p->pNext;
}
printf("链表长度是%d\n",len);
return;
}
void insert_list(PNODE pHead)
{
//在pHead指向的链表的第pos个节点的前面插入一个新的节点,该节点的值为val
    int i=0;
int pos;
int val;
    if(is_empty(pHead)==true)
{
printf("链表为空,插入失败\n");
return;
}
PNODE p = pHead;
printf("请输入你要在第几个结点前插入:\n");
scanf("%d",&pos);
printf("请输入你要插入的值:\n");
scanf("%d",&val);
while(p != NULL && i < pos-1)
{  
p = p->pNext;
i++;
}
if(i > pos-1||p == NULL)//i > pos-1是不是可有可无?????????????
{
printf("输入值非法,插入失败");
return;
}


PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
 printf("动态分配内存失败!");
 exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
printf("插入成功\n");
return;
}
void delete_list(PNODE pHead)//删除结点
{
    int i=0;
int pos;
if(is_empty(pHead)==true)
{
printf("链表为空,删除失败\n");
return;
}
PNODE p = pHead;
    printf("请输入你要删除第几个结点:\n");
scanf("%d",&pos);


while(p->pNext != NULL && i < pos-1)
{  
p = p->pNext;
i++;
}
if(i > pos-1||p->pNext == NULL)//i > pos-1是不是可有可无?????????????
{
printf("输入值非法,删除失败\n");
return;
}


PNODE q=p->pNext;
printf("您删除的元素是:%d\n",q->data);
        p->pNext=p->pNext->pNext;
free(q);
//q=NULL;
printf("删除成功\n");
return;

void sort_list(PNODE pHead)
{
if(is_empty(pHead)==true)
{
printf("链表为空,排序失败\n");
return;
}
int t;
    //int i,j,t;
//int len=length_list(pHead);
PNODE p,q;
//下面跟数组对照着写
for(p=pHead->pNext;p->pNext!=NULL;p=p->pNext)//类似于数组中:for(i=1;i<len-1;i++)
{
for(q=p->pNext;q!=NULL;q=q->pNext)       //类似于数组中:for(j=1+i;j<len;j++)
{
if(p->data>q->data)                 //类似于数组中:if(a[i]>a[j])
{
t=p->data;                      //类似于数组中:t=a[i];
p->data=q->data;               //类似于数组中:a[i]=a[j];
q->data=t;                     //类似于数组中: a[j]=t;
}
}
}
printf("排序成功\n");
return;
}                                       
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值