- 头文件及结构体类型定义
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;//数据域
struct LNode *next;//指针域
}LNode,*LinkList;//头指针与头节点,头指针指向一个LNode类型的节点。
- 头插法创建链表
LinkList headinsert(){//头插法
LinkList l;
l=(LinkList)malloc(sizeof(LNode));
l->next=NULL;
LNode *p;
int x;
scanf("%d",&x);
while(x!=999){
p=(LNode*)malloc(sizeof(LNode));
p->next=l->next;
p->data=x;
l->next=p;
scanf("%d",&x);
}
return l;
}
- 尾插法创建链表
LinkList rearList(){//尾插法
LinkList l;
l=(LinkList)malloc(sizeof(LNode));
l->next=NULL;
LNode *rear,*p;
rear=l;
int x;
scanf("%d",&x);
while(x!=999){
p=(LNode*)malloc(sizeof(LNode));
rear->next=p;
p->data=x;
rear=rear->next;
scanf("%d",&x);
}
rear->next=NULL;//给尾指针指向的节点的指针域赋值NULL
return l;
}
- 前插法实现链表的插入
int Listinsert2(LinkList L,int i,int e){//前插法
LNode *p;
int num;
num=0;
while(num!=i-1){
L=L->next;
num++;
}
p=(LNode*)malloc(sizeof(LNode));
p->next=L->next;
p->data=e;
L->next=p;
return 1;
}
- 用后插法代替前插法实现链表的插入
int Listinsert1(LinkList L,int i,int e){//用后插法代替前插法
LNode *p;
int num;
num=0;
while(num!=i){
L=L->next;
num++;
}
p=(LNode*)malloc(sizeof(LNode));
p->next=L->next;
p->data=L->data;
L->data=e;
L->next=p;
return 1;
}
- 删除链表i位置的元素
void ListDelete(LinkList L,int i){//删除链表i位置的元素
LNode *q;
int num;
num=0;
while(num!=i-1){
L=L->next;
num++;
}
q=L->next;
L->next=L->next->next;
free(q);
}
- 打印链表元素
void listprint(LinkList L){//打印链表
LNode *p;
p=L;
while(p->next!=NULL){
int k;
k=p->next->data;
printf("%d\n",k);
p=p->next;
}
}
- 测试用例
int main(){
LinkList L;
// L=headinsert();
L=rearList();
Listinsert1(L,2,998);
Listinsert2(L,2,888);
ListDelete(L,4);
listprint(L);
}
(让想起了写实验报告的感觉…23333)