# include <stdio.h>
# include <malloc.h>
/*
*单链表定义及相关操作
*/
typedef struct Node * List;
struct Node{
int data;
List next;
};
List findByPos(List list, int i);
//初始化:头指针,头结点
List init(){
List s = (List)malloc(sizeof(struct Node));
s->next = NULL;
return s;
}
//插入一个结点到第 i-1 个结点之后,返回插入后的头指针
List insert(List list, int i, int data){
if(i == 1){ //插入在头结点
List s = (List)malloc(sizeof(struct Node));
s->data = data;
s->next = list;
return s;
}
List p = findByPos(list, i-1); //找到插入位置
if(p != NULL){
List s = (List)malloc(sizeof(struct Node));
s->data = data;
s->next = p->next;
p->next = list;
}
if(p == NULL){
printf("非法位置\n");
return NULL;
}
}
//链表遍历的方法求表长
int getLength(List list){
int length = 0;
List p = list;
while(p->next != NULL){ //到达尾结点
length ++;
p = p->next;
}
return length;
}
//查找第i个结点
List findByPos(List list, int i){
if(i > getLength(list) || i < 1){
printf("非法位置\n");
return NULL;
}
List p = list;
int j = 1;
while(p != NULL && j < i){
p = p->next;
j++;
}
if( j == i)
return p;
else
return NULL;
}
//查找一个元素,返回对应结点的指针
List find(List list, int target){
List thisNode = list;
while(thisNode->next != NULL && target != thisNode->data)
thisNode = thisNode->next;
return thisNode;
}
//遍历
void print(List list){
List p = list;
while(p->next != NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//删除第i个结点
List del(int i, List list){
List p,s;
if(i == 1){ //当要删除的结点为头结点时
s = list;
if(list != NULL)
list = list->next;
else
return NULL;
free(s);
return list;
}
p = findByPos(list,i-1); //查找到第i-1个结点
if(p == NULL){
printf("第%d结点不存在", i-1);
return NULL;
}else if(p->next == NULL){
printf("第%d结点不存在", i);
return NULL;
}else{
s = p->next; //s指向第i个结点
p->next = s->next;
free(s);
return list;
}
}
int main(void){
List list = init();
list = insert(list,1,1);
list = insert(list,1,2);
list = insert(list,1,3);
print(list);
int length = getLength(list);
printf("链表长度:%d\n", length);
List pos = find(list, 3);
if(pos != NULL)
printf("查找成功\n");
list = del(3,list);
print(list);
return 0;
}
数据结构复习——线性表(二)链表
最新推荐文章于 2024-04-11 17:09:47 发布