#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
typedef int Status;
typedef int ElemType;
typedef struct Lnode{
ElemType data;
struct Lnode *next;
}Lnode, *LinkList;
//头插法 输出时是逆序,不方便,但插入方便
Status CreatList1_L(LinkList *L, int n){
int i;
LinkList p;
*L = (LinkList)malloc(sizeof(Lnode)); //创建一个头结点
(*L)->next = NULL; //头结点为空
printf("请输入要插入的%d个数据:", n);
for(i=0; i<n; i++){
p = (LinkList)malloc(sizeof(Lnode)); //新建要插入的结点
if(!p)
return ERROR; //分配不成功 那岂不是上边分配也需要这句代码?
scanf("%d",&p->data); //输入数据
p->next = (*L)->next;
(*L)->next = p;
}
return OK;
}
//尾插法 输出时是正序,方便,但插入时不方便,其实也并没有很不方便
Status CreatList2_L(LinkList *L, int n){
LinkList q,p;
int i;
*L = (LinkList)malloc(sizeof(Lnode));
(*L)->next = NULL;
q = *L;
printf("请输入要插入的%d个数据:", n);
for(i=0; i<n; i++){
p = (LinkList)malloc(sizeof(Lnode));
if(!p)
return ERROR;
scanf("%d", &p->data);
q->next = p; //妈的在这句话上出了岔子。
q = q->next;
}
p->next = NULL;
return OK;
}
//查找第i个元素,以e返回L的第i个元素
Status GetElem_L(LinkList L, int i, ElemType *e){
int t=1;
LinkList p;
p = L->next;
while(p&&t<i){
p = p->next; //这个循环中只控制p的移动
t++;
}
if(!p||t>i)
return ERROR;
*e = p->data;
return OK;
}
Status InsertList_L(LinkList L, int i, ElemType e){
LinkList p,n;
int t=1; //t=0
p = L;
while(p&&t<i){ //t<i-1
p = p->next; //寻找第i-1个结点
t++;
}
if(!p||t>i)
return ERROR;
n = (LinkList)malloc(sizeof(Lnode));
n->next = p->next;
p->next = n;
n->data = e;
return OK;
}
Status DeleteList_L(LinkList L, int i, ElemType *e){
LinkList p,q;
int t=1;
p = L;
while(p&&t<i){
p = p->next;
t++;
}
if(!p||t>i)
return ERROR;
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return OK;
}
Status ClearList_L(LinkList L){
LinkList p,q;
p = L->next;
while(p){
q = p->next;
free(p);
p=q;
}
L->next = NULL;
return OK;
}
Status TraverseList_L(LinkList L){
LinkList p;
if(!L->next){
printf("该链表为空!\n");
return OK;
}
p = L->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
int main(){
//做测试用,详细另写
LinkList L;
int qq,n,e,tag,i;
// printf("请选择你的操作:");
scanf("%d",&qq);
scanf("%d",&n);
if(qq==0)
CreatList1_L(&L,n);
else
CreatList2_L(&L,n);
TraverseList_L(L);
printf("请输入要查找的数的位序:");
scanf("%d", &n);
GetElem_L(L, n, &e);
printf("第%d位数据为%d.\n", n, e);
printf("请输入要插入的数据及其位置:");
scanf("%d%d",&e, &i);
InsertList_L(L,i,e);
printf("是否继续插入?0否/1继续");
scanf("%d",&tag);
while(tag==1){
printf("请输入要插入的数据及其位置:");
scanf("%d%d",&e, &i);
InsertList_L(L,i,e);
printf("是否继续插入?0否/1继续");
scanf("%d",&tag);
}
if(tag==0)
TraverseList_L(L);
printf("请输入要删除的数据的位置:");
scanf("%d",&i);
DeleteList_L(L,i,&e);
TraverseList_L(L);
printf("清空链表!\n");
ClearList_L(L);
TraverseList_L(L);
return 0;
}
链表期末小练(部分操作)
最新推荐文章于 2023-03-11 16:30:45 发布