最近了解C语言的链表,也算是有点心得,至此分享给大家
初学时,我做的单向链表实现代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
int num;
struct student* next;
} node;
int main(){
int i;
node *head = NULL;
while(1){
scanf("%d",&i);
if( i == -1 )//链表创建退出条件
break;
node* p = (node*)malloc(sizeof(node));
p->num = i;
p->next = NULL;
node *last = head;//在此定义一个临时结点,用来寻找链表上的最后一个节点
if( last ){
while(last->next){
last = last->next ;//如果链表不为空,那么将尾结点指向刚才创建的新节点
}
last->next = p;
}else {
head = p;//如果链表为空,那么让刚才创建的结点尾头结点
}
}
return 0;
}
双向链表如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct student{
int num;
struct student* lnext;
struct student* rnext;
}node;
int main(){
int i;
node *head = NULL,*real = NULL;
while(1){
scanf("%d",&i);
if(i==-1) //链表创建退出条件
break;
node *pp = (node*)malloc(sizeof(node));
pp->num = i;
pp->lnext = NULL;
pp->rnext = NULL;
node* temp = head;
if(temp){ //如果链表不为空,
while(temp->rnext){//找出尾结点
temp = temp->rnext;
}
temp->rnext = pp; //将新节点连接
pp->lnext = temp;
}else { //如果链表为空,则让刚创建的结点成为头结点
head = pp;
}
real = pp;
}
return 0;
}
在进一步学习双向,单向循环链表时,了解到了尾结点的妙用,于是单向链表可以写成这样:
#include<stdio.h>
#include<stdlib.h>
typedef struct list{
int num;
struct list* next;
}node;
int main(){
int i;
node* head = NULL,*real = NULL;//额外定义一个尾结点
while(1){
scanf("%d",&i);
node* p1 = (node*)malloc(sizeof(node));
if(i==-1)
break;
p1->num = i;
p1->next = NULL;
node* pp = head;
if(pp){
real->next = p1;//直接用尾结点相连,是不是方便多啦
}else {
head = p1;
}
real = p1;//每次创建的新链表都作为尾结点保存,
//这样每次就不用再苦苦寻找尾结点啦
}
return 0;
}
至于循环链表 只需要在那个while循环出来得时候将尾结点指向头节点即可。
还有一个就是交换链表结点的东西,以下是比较正规的实现方法:
传入的参数为头结点和需要交换的相邻结点的前一个结点的标志:
void swap(node* head,int i){
node* temp1,*p = head,*pp;
while(p){
if(p->num == i){
temp1 = p;//保存需要交换的前一个节点
pp->next = p->next;//使指向前一个结点的结点指向后一个节点
temp1->next = p->next->next;//需要交换的前一个结点指向
//需要交换的后一个节点的后一个节点
pp->next->next = temp1;//使需要交换的后一个节点指向需要交换的前一个结点
break;
}
pp = p;
p = p->next;
}
}
个人在开始的时候对交换结点得方式有点迷惑,于是当时想出了一种笨方法,将需要交换的两个结点和这两个结点的前后结点都保存在变量中,接下来要做的就只是互相指来指去达到交换的效果了,虽然用到的变量比较多,但也不失为一种简单易懂的方法,有兴趣的小伙伴可以试试。
本人编程新手入门,各方大佬多多指教,不喜勿喷,有相同爱好的小伙伴可以相互关注下,常交流。谢谢