#include <stdio.h>
#include <stdlib.h>
//定义一个结构体
typedef struct Node{
int data;
struct Node *next;
}Node,* LinkList;
//链表的初始化操作
void InitList(LinkList * L)
{
(*L)=(LinkList)malloc(sizeof(Node));
(* L)->next=NULL;
}
//采用头插法创建链表,所得链表与输出数据正好相反,如果想要得到顺序的话应该采用尾插法
void CreateFromHead(LinkList L)
{
int e;
Node *s;
int flag=1;
printf("输入值");
while(flag){
//TODO
// scanf用来获取用户输入数据
scanf("%d",&e);
// 如果用户输入的数据为-100的话代表输入结束
if(e == -100){
//TODO
flag = 0;
}
else{
// 创建一个s节点用来保存用户输入数据
s = (Node*)malloc(sizeof(Node));
// 存放在s的data域里面
s->data=e;
// L->next也就代表第一个元素,然后s插在了第一个的前面头节点的后面
s->next=L->next;
L->next=s;
}
}
//
}
//在单链表查找第i个节点
Node * Get(LinkList L,int i){
int j;
Node * p;
if(i<=0){
//TODO
return NULL;
}
p=L;j=0;
while(p->next!=NULL&&j<i){
//TODO
p=p->next;
j++;
}
if(i == j ){
//TODO
return p;
}else{
return NULL;
}
}
//插入操作
int InsList(LinkList L,int i,int e){
// 定义两个指针分别是pre和s
Node *pre,*s;
int k;
// 判断非法输入
if(i<=0){
//TODO
return -1;
}
pre=L; k=0;
// 用来查找要插入节点的前一个节点
while(pre!=NULL&&k<i-1){
//TODO
pre=pre->next;
k++;
}
if(pre==NULL){
printf("插入位置不合理");
return -1;
}
s=(Node*)malloc(sizeof(Node));
s->data=e;
s->next=pre->next;
pre->next=s;
// 这里为了测试,写死了插入位置和插入的值
printf("在3位置,插入4----");
while(pre->next){
pre=pre->next;
return 1;
}
}
//display用来打印链表的值
void display(LinkList *p){
Node* temp=p;//将temp指针重新指向头结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (temp->next) {
temp=temp->next;
printf("%d",temp->data);
}
printf("\n");
}
// 删除操作
int DelList(LinkList L,int i){
int e;
printf("删除2位置");
Node *pre,*r;
pre=L;
int k=0;
while(pre->next!=NULL&&k<i-1){
//TODO
pre=pre->next;
k++;
}
if(pre->next==NULL){
//TODO
printf("删除的位置不合理");
return -1;
}
r=pre->next;
pre->next=r->next;
e=r->data;
free(r);
return e;
}
int main(){
LinkList L;
printf("执行初始化操作");
InitList(&L);
CreateFromHead(L);
display(L);
InsList(L,3,4);
display(L);
DelList(L,2);
display(L);
return 0;
}
数据结构 链表插入删除查找
最新推荐文章于 2022-02-10 11:34:46 发布