加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

单链表的创建、插入、删除、倒置操作

发布时间:2020-12-14 05:54:35 所属栏目:百科 来源:网络整理
导读:/*-----------------------------------------------------*/ /*--------------单链表的创建、插入、删除、倒置操作-----------*/ /*--------------Written by redfire250-----2005.5.10----*/ /*-----------------------------------------------------*/ #

/*-----------------------------------------------------*/
/*--------------单链表的创建、插入、删除、倒置操作-----------*/
/*--------------Written by redfire250-----2005.5.10----*/
/*-----------------------------------------------------*/

#include<malloc.h>
#include<stdio.h>
#define null 0
struct student
{
?long Number;
?char Name[20];
?long Score;
?struct student *Next;
};

int n=0;/*n为全局变量,用来计算链表的结点个数*/

?

/*-----------------------------------------*/
/*--------------创建结点函数Creat()--------*/
/*-----------------------------------------*/
struct student *Creat()
{

? struct student *p1;
? struct student *p2;
? struct student *head=null;
? p1=p2=(struct student *)malloc(sizeof(struct student));/*开辟一段可用内存单元*/
? printf("please input the student's Number Name and the Score:/n");
? scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);

? while(p2->Number!=0)
? {
????? n++;

????? if(n==1)??????????? /*是否开辟的是第一个结点*/
????? head=p2;
????? else
????? p1->Next=p2;

????? p1=p2;
????? p2=(struct student *)malloc(sizeof(struct student));
????? printf("Input the? Number the Name and the Score:/n");
????? scanf("%ld%s%ld",&p2->Score);
? }
? p1->Next=null;
? return(head);
}


/*------------------------------------------*/
/*--------------查看链表内容函数View()------*/
/*------------------------------------------*/
?View(struct student *head)
?{
? struct student *p;
? p=head;
? while(p->Next!=null)
? {
?????? printf("%ld? %s? %ld/n",p->Number,p->Name,p->Score);
?????? p=p->Next;
? }
? printf("%ld? %s? %ld/n",p->Score);
?}

?

/*-------------------------------------------------*/
/*--------------插入结点函数(前插)Insert()-------*/
/*-------------------------------------------------*/
?Insert(struct student *head,int Num)?????? /*head为链表头指针,Num插入链表位置*/
{
?int t=1;
?struct student *p1,*p2;
?p1=head;
?if (Num>n||Num<0)
?{
???? printf("input error!!!/n");
???? return 0;
?}
?
?while(t<Num-1)????????????????? /*找到要插入结点的前一个结点*/
?{
???? p1=p1->Next;
???? t++;
?}
?p2=(struct student *)malloc(sizeof(struct student));
?printf("Input the? Number the Name and the Score:/n");
?scanf("%ld%s%ld",&p2->Score);
?p2->Next=p1->Next;
?p1->Next=p2;
?n++;

}


/*------------------------------------------*/
/*------------ 删除结点函数Delnode()--------*/
/*-----------------------------------------*/
?Delnode(struct student *head,int node)
{
?int t=1;
?struct student *p1,*p2;
?p2=head;
?if (node>n||node<1)
?{
???? printf("error!!! The node is not exist!");
???? return 0;
?}
?while(t<node-1)?????? /*找到要删除结点的前一个结点*/
?{
???? p2=p2->Next;
???? t++;
?}
?p1=p2->Next->Next;???? /*找到要删除结点的后一个结点*/
?free(p2->Next);??????? /*释放要删除的结点空间(删除)*/
?p2->Next=p1;?????????? /*前一结点指向后一结点*/
?n--;??????????
}

/*-------------------------------------------------*/
/*--------------逆序重组链表Invert()-------*/
/*-------------------------------------------------*/
?struct student *Invert(struct student *head)
{
? struct student *p1,*p2;
? p1=head;
? p2=p1->Next;
? head=p2->Next;
? p1->Next=null;
? while(head->Next!=null)
? {
?? p2->Next=p1;
?? p1=p2;
?? p2=head;
?? head=head->Next;
? }
? head->Next=p2;
? p2->Next=p1;
? return head;
}

main()
{
?int number1,number2;
?struct student *head;
?head=Creat();
?View(head);

?printf("the n that you want to insert:/n");
?scanf("%d",&number1);
?Insert(head,number1);
?View(head);

?printf("the node that you want to DELETE:/n");?scanf("%d",&number2);?Delnode(head,number2);?View(head);??printf("Inverte the list:/n");?View(Invert(head));??getch();}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读