C语言实现单链表的操作:创建,删除,插入,反转
刚学了数据结构的单链表基本操作:创建,删除,插入,反转等,以下是详细内容,其中很多关于数据结构的表述并不完整,只是简单的基本算法思想的表现。
由于没经验,代码有点乱·····
如有不当或错误之处,欢迎指正,不胜感激!
- #include<stdio.h>
- #include <malloc.h>
- struct node
- {
- int data;
- struct node* next;
- }head;
- struct node *p,*q;//声明临时节点
- void head_insert(int x)//从头部插入新节点
- {
- p=(struct node*)malloc(sizeof(struct node));
- if(p==NULL)
- {
- printf("内存申请失败,退出");
- exit(0);
- }
- p->data=x;
- p->next=head.next;
- head.next=p;
- }
- void tail_insert(int x)//从尾部插入节点
- {
- p=(struct node*)malloc(sizeof(struct node));
- if(p==NULL)
- {
- printf("内存申请失败,退出");
- exit(0);
- }
- p->data=x;
- p->next=NULL;
- q->next=p;
- q=p;
- }
- void node_length()//输出链表长度
- {
- int length=0;
- p=head.next;
- if(p==NULL) printf("The length of node is 0.\n");
- else
- {
- do
- {
- length++;
- p=p->next;
- } while(p);
- printf("The length of node is %d.\n",length);
- }
- }
- void print_node()//打印链表
- {
- printf("输出此时链表:\n");
- p=head.next;
- if(p==NULL) {printf("NULL\n");return;}
- else
- {
- while(p)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
- }
- void clear_node()//清空链表
- {
- p=head.next;
- head.next=NULL;
- while(p)
- {
- q=p;
- p=p->next;
- free(q);
- }
- }
- void new_insert(int i,int a)//在第i个位置后插入新整型元素 a
- {
- q=(struct node*)malloc(sizeof(struct node));
- q->data=a;
- p=head.next;
- if(i<0) printf("Position Error.\n");
- else
- {
- while(p&&--i) p=p->next;
- if(i) printf("Position Error.\n");
- else
- {
- q->next=p->next;
- p->next=q;
- }
- }
- }
- void delete_node(int i)//删除某节点
- {
- p=&head;
- while(p->next&&--i)
- p=p->next;
- if(i) printf("Position Error.\n");
- else
- {
- q=p->next;
- p->next=q->next;
- free(q);
- }
- }
- void invert_order()//将链表反转
- {
- node *This,*prev;
- p=head.next;
- This=NULL;
- while(p)
- {
- prev=This;
- This=p;
- p=p->next;
- This->next=prev;
- }
- head.next=This;
- }
- int main()
- {
- int number,i,a;
- head.next=NULL;
- q=&head;
- printf("输入整型数据:\n");
- while(scanf("%d",&number)!=EOF) //将数据存入链表
- {
- head_insert(number);//从头插入 即逆序插入
- /* tail_insert(number); 从尾端 插入即正序插入 */
- }
- invert_order();
- node_length();//输出链表长度
- print_node();//输出链表
- printf("在第i个位置后插入a,请输入i和a:\n");
- scanf("%d%d",&i,&a);
- new_insert(i,a);
- print_node();
- printf("输入要删除的第i个结点:\n");
- scanf("%d",&i);
- delete_node(i);
- print_node();
- clear_node();
- return 0;
- }
附:在Windows下,输入数据完毕后先按Enter键,再按Ctrl+Z键,最后按Enter键即可结束输入;在Linux下,输入完毕后按Ctrl+D键可结束输入。
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20