408cpp学习之链表(二)
今天我主要学习了单链表的基础操作,包括头插法,尾插法,按位查找以及按元素查找,下面我将我今天所写代码分享给大家。
1. 头插法创建链表
//头插法创建链表
#define maxsize 50
typedef int Elemtype;
typedef struct Lnode {Elemtype data; //数据域struct Lnode* next; //指针域
}Lnode,*LinkList;void head_insert(LinkList L)
{Elemtype x;scanf("%d", &x);LinkList s;L->next = NULL; //初始化头结点的next指针为NULLwhile (x != 99999) //以99999作为输入结束标志{s = (LinkList)malloc(sizeof(Lnode)); //创建新结点s->data = x; //赋值数据域s->next = L->next; //头插法关键步骤:让新结点指向原来的第一个节点L->next = s; //头结点指向新结点scanf("%d", &x); //继续读取输入}
}void PrintL(LinkList L)
{L = L->next; //跳过头结点while (L!= NULL) //遍历链表直到NULL{printf("%3d\n", L->data); //打印当前结点数据L = L->next; //移动到下一个结点}
}
2. 尾插法创建链表
//尾插法创建链表
#define maxsize 50
typedef int elemtype;
typedef struct Lnode {elemtype data;struct Lnode* next;
}Lnode,* link_list;void tail_insert(link_list L)
{L->next = NULL; //初始化头结点的next指针为NULLelemtype x;scanf("%d", &x);link_list r = L; //r始终指向链表尾部link_list s;while (x != 99999) //以99999作为输入结束标志{s = (link_list)malloc(sizeof(Lnode)); //创建新结点s->data = x; //赋值数据域r->next = s; //尾部结点的next指向新结点r = r->next; //r指向新的尾部scanf("%d", &x); //继续读取输入}r->next = NULL; //最后将尾结点的next置为NULL
}
3. 按位置查找结点
//按位置查找链表结点
link_list Search_L(link_list L,int posi)
{int i = 1; //从第一个结点开始计数(头结点不算)while (L && i <= posi) //遍历直到找到指定位置或链表结束{L = L->next;i++;}return L; //返回找到的结点指针,没找到返回NULL
}
4. 按值查找结点
//按值查找链表结点
link_list search_num(link_list L, elemtype num)
{L = L->next; //跳过头结点while (L) //遍历链表{if (L->data == num) //找到匹配的值{return L; //返回结点指针}L = L->next; //继续下一个结点}return NULL; //没找到返回NULL
}
5. 在指定位置插入结点
//在链表指定位置插入结点
void insert_num(link_list L, elemtype num, elemtype posi)
{elemtype i = 0;//找到插入位置的前一个结点while (L && posi && i < posi - 1){L = L->next;i++;}link_list s;s = (link_list)malloc(sizeof(Lnode)); //创建新结点s->data = num; //赋值数据域s->next = L->next; //新结点指向原位置的结点L->next = s; //前一个结点指向新结点
}