链表基本操作:链表初始化,增,删,改,查,遍历链表
以下完整代码建立在创建好的链表基础上,读者可自行完善。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Link
{
char elem;
struct Link * next;
}link;
//初始化
link * initLink();
//增
link * insertElem(link * p,int elem,int add);
//删
link * delElem(link * p,int add);
//改
link *amendElem(link * p,int add,int newElem);
//查
int selectElem(link * p,int elem);
//遍历
void display(link *p);
link * initLink(){
int i;
//创建头节点
link *p = (link*)malloc(sizeof(link));
//声明一个指针指向头节点, 用于遍历链表
link *temp = p;
for(i = 1 ; i < 5 ; i++){
link *a = (link*)malloc(sizeof(link));
a->elem = i;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
//p为原链表,elem表示新数据元素,add表示新元素要插入的位置
link * insertElem(link * p , int elem , int add){
int i;
link * temp = p;
//首先找到要插入位置的上一个结点
for(i =1 ; i < add ; i++){
if(temp == NULL){
printf("error!\n");
return p;
}
temp = temp->next;
}
//创建插入节点
link * a = (link*)malloc(sizeof(link));
a->elem = elem;
//向链表中插入节点
a->next = temp->next;
temp->next = a;
return p;
}
//p为原链表,elem为要删除元素的值
link * delElem(link * p, int add){
int i;
link * temp = p;
//temp指向被删除节点的上一个节点
for(i = 1 ; i < add ; i++){
temp = temp->next;
}
link * del = temp->next; //单独设置一个指针指向被删除结点,以防丢失
temp->next = temp->next->next; //删除某个结点的方法就是更改前一个结点的指针域
free(del); //手动释放该结点,防止内存泄漏
return p;
}
//更新函数,其中,add 表示更改结点在链表中的位置,newElem 为新的数据域的值
link * amendElem(link * p, int add, int newElem){
int i;
link * temp = p;
temp = temp->next; //在遍历之前,temp指向首元结点
for(i = 1 ; i < add ; i++){
temp = temp->next;
}
temp->elem = newElem;
return p;
}
//p为原链表,elem表示被查找元素
int selectElem(link * p, int elem){
link * temp = p;
int i = 1;
//由于头节点的存在,因此while中的判断为t->next
while(temp->next != NULL){
temp = temp->next;
if(temp->elem == elem){
return i;
}
i++;
}
return -1;
}
void display(link * p){
link * temp;
temp = p;
do{
temp = temp->next;
printf("%d\t",temp->elem);
}while(temp->next != NULL);
printf("\n");
}
int main()
{
//初始化链表(1,2,3,4)
printf("初始化链表为:\n");
link *p=initLink();
display(p);
printf("在第4的位置插入元素5:\n");
p=insertElem(p, 5, 4);
display(p);
printf("删除元素3:\n");
p=delElem(p, 3);
display(p);
printf("查找元素2的位置为:\n");
int address=selectElem(p, 2);
if (address==-1) {
printf("没有该元素");
}else{
printf("元素2的位置为:%d\n",address);
}
printf("更改第3的位置上的数据为7:\n");
p=amendElem(p, 3, 7);
display(p);
return 0;
}
代码来源于:解学武《数据结构概述》