说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。
#include <stdio.h>
#include <malloc.h>
const int OK = 1; //定义正确返回
const int ERROR = -1; //定义错误的返回
const int OVERFLOW = -2; //定义溢出
//定义元素类型
typedef int ElemType;
//定义返回类型
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//获取第i个元素(L为带头结点的单链表的头指针)
Status GetElem_L(LinkList L, int i, ElemType &e){
LinkList p = L->next; //L->next指向头结点
int j = 1;
while(p&&j<i){
p = p->next;
++j;
}
if(!p || j>i) return ERROR;
e = p->data;
return OK;
}
//插入元素(第i个位置之前插入元素)
Status ListInsert_L(LinkList L, int i, ElemType &e){
LinkList p = L; //头结点
int j = 0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!p || j>i-1) return ERROR;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除第i个元素
Status ListDelete_L(LinkList &L, int i, ElemType &e){
LinkList p = L; //p指针指向头结点
int j = 0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!p || j>i-1) return ERROR;
LinkList s = p->next;
p->next = s->next;
e = s->data;
free(s);
return OK;
}
//创建链表,并添加n个数据结点
void CreateList_L(LinkList &L, int n){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //创建一个带头结点的单链表
int i;
LinkList p;
for(i=n;i>0;--i){
p = (LinkList)malloc(sizeof(LNode));
printf("请输入链表第%d个元素的数据:\n", i);
scanf("%d", &p->data);
p->next = L->next; //头插法
L->next = p;
}
}
//遍历链表
void ShowList_L(const LinkList &L){
LinkList p = L->next;
int j = 1;
while(p){
printf("链表的第%d个元素是%d\n", j, p->data);
p = p->next;
++j;
}
}
int main(){
LinkList L;
printf("============创建5个数据结点============\n");
CreateList_L(L, 5);
ShowList_L(L);
printf("============删除了第5个元素============\n");
ElemType e;
ListDelete_L(L, 5, e);
ShowList_L(L);
printf("============添加第5个元素=============\n");
ListInsert_L(L, 5, e);
ShowList_L(L);
scanf("%d");
return 0;
}部分说明:1、第i个元素之前插入元素
如上图所示,假如现在有4个元素,那么有四个可选插入位置(①②③④):
让p先指向头结点,我们需要找到第i-1个结点,也就是需要插入位置的前一个结点,比如我们要插入到i=3,那么需要找到2位置,插入到③位置。
原文地址:http://blog.csdn.net/dawanganban/article/details/41648399