c语言单链表操作实现
/**
单链表操作
开发环境codeblocks12.11
xxwu
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode * next;
} LNode, *LinkList;
//初始化一个空链表
LinkList initNullList(LinkList L);
//初始化 头插法 以9999退出
LinkList initListHead(LinkList L);
//初始化 尾插法 以9999退出
LinkList initListTill(LinkList L);
//获取第i个元素
LNode * getLocateElem(LinkList L, int i);
//获取指定元素下标
int getElem(LinkList L, LNode *p);
//在第i个元素前插入元素e
bool insertElem(LinkList L, int i, int e);
//删除第i个元素
bool deleteLocateElem(LinkList L, int i);
//删除指定元素
bool deleteElem(LinkList L, LNode * p);
//初始化一个空链表
LinkList initNullList(LinkList L) {
L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
}
//初始化 头插法 以9999退出
LinkList initListHead(LinkList L) {
LNode *s;
int x;
L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
scanf("%d", &x);
while(x != 9999) {
s = (LNode*) malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
};
//初始化 尾插法 以9999退出
LinkList initListTill(LinkList L) {
L = (LNode *) malloc(sizeof(LNode));
L->next = NULL;
LNode *s, *r;
r = L;
int x;
scanf("%d", &x);
while(x!=9999) {
s = (LNode *) malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
//打印链表
void printLNode(LinkList L){
LinkList p = L->next;
int i = 1;
while(p != NULL) {
printf("第 %d 个元素值 %d \t\t对应地址%x\n",i,p->data,p);
p = p->next;
i++;
}
}
//获取第i个元素
LNode * getLocateElem(LinkList L, int i) {
if(i < 0) return NULL;
if(i < 1) return L;
LNode *p = L->next;
int j = 1;
while(p!= NULL && j < i) {
p = p->next;
j++;
}
return p;
}
//获取指定元素下标
int getElem(LinkList L, LNode *p) {
LNode *s = L->next;
int i = 1;
while(s!= NULL && s != p) {
s = s->next;
i++;
}
if(s == NULL) {
return -1;
}
return i;
}
//在第i个元素前插入元素e
bool insertElem(LinkList L, int i, int e) {
LNode *p = L;
int j = 0;
while(p && j<i-1) {
p = p->next;
j++;
}
if(!p || j > i-1) {
return false;
}
LNode *s = (LinkList) malloc(sizeof(LNode));
// scanf("%d",&s->data);
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//删除第i个元素
bool deleteLocateElem(LinkList L, int i){
if(i < 1) return false;
LNode *p, *q;
p = getLocateElem(L,i-1);
q = p->next;
p->next = q->next;
free(q);
return true;
}
//删除指定元素
bool deleteElem(LinkList L, LNode * p) {
LNode *s = L;
while(s != NULL && s->next != p) {
s = s->next;
}
if(s == NULL)
return false;
s->next = p->next;
free(p);
return true;
}
int main()
{
// LinkList L;
// L = initListHead(L);// L地址发生了改变
// printLNode(L);
LinkList L2 = NULL;
L2 = initListTill(L2);// L地址发生了改变
printLNode(L2);
insertElem(L2,3,555);
LNode *p = getLocateElem(L2,3);
printf("第3个元素%d\n",p->data);
printLNode(L2);
deleteLocateElem(L2,1);
deleteElem(L2,p);
printLNode(L2);
return 0;
}
测试结果: