需求:给定的线性表为 L= (24,25, 7, 42, 19, 38)。
- 实现初始化并建立单链表【前插法或者后插法】
- 实现单链表的取值:取第5个元素的值。
- 实现单链表的插入:依次插入3,21,15 三个数.分别插入在第 4 ,6和2 位置。每插入一次都要输出一次单链表。
- 实现单链表的按值查找:输出 38 存储地址。
- 删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次单链表。。
需求:给定的线性表为 L= (24,25, 7, 42, 19, 38)。
供参考:
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct _node {
ElemType data;
struct _node* next;
}Node, * LinkList;
Status CreateList_T(LinkList& L, int i, ElemType a[])//尾插法建立链表
{
int k;
LinkList pL = NULL, tail = NULL;
if (!L) {
L = (LinkList)malloc(sizeof(Node));
if (!L) {
return ERROR;
}
L->next = NULL;
}
for (pL = L, k = 0; k < i; k++) {
tail = (Node*)malloc(sizeof(Node));
tail->next = NULL;
tail->data = a[k];
pL->next = tail;
pL = tail;
}
return OK;
}
//实现单链表按位置取元素值
Status GetElem(LinkList L, int i, ElemType& e)
{
int j = 0;
LinkList p = L;
if (!L || i < 1) {
e = -999;
return ERROR;
}
while (p->next && j < i - 1) { //寻找第i个结点,并令p指向其前趋结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { e = -999; return ERROR; }
e = p->next->data;
return OK;
}
Status ListInsert(LinkList L, int i, ElemType e)
{
int j = 0;
LinkList p = L, pt = NULL;
if (!L || i < 1)
return ERROR;
while (p->next && j < i - 1) { //寻找第i个结点,并令p指向其前趋结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) return ERROR;
pt = (Node*)malloc(sizeof(Node));
pt->data = e;
pt->next = NULL;
pt->next = p->next;
p->next = pt;
return OK;
}
//实现单链表按值查找,返回存储地址
Node* LocateElem(LinkList L, ElemType e)
{
LinkList p = L;
if (!L)
return NULL;
while (p->next && p->next->data != e) { //寻找第i个结点,并令p指向其前趋结点
p = p->next;
}
if (!p->next) return NULL;
return p->next;
}
//在带头结点的单链表 L中,删除第 i 个元素,并由e返回其值
Status ListDelete_L(LinkList L, int i, ElemType& e)
{
int j = 0;
LinkList p = L, q = NULL;
if (!L || i < 1) {
e = -999;
return ERROR;
}
while (p->next && j < i - 1) { //寻找第i个结点,并令p指向其前趋结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { e = -999; return ERROR; }
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
void printList(LinkList L)
{
LinkList p = L;
if (!L || !L->next) {
printf("NULL");
}
else {
while (p->next) {
printf(p->next == L->next ? "%d" : " %d", p->next->data);
p = p->next;
}
}
printf("\n");
}
int main()
{
LinkList L = NULL, pt = NULL;
ElemType a[6] = { 24,25,7,42,19,38 }, e;
CreateList_T(L, 6, a);
printList(L);
GetElem(L, 5, e);//单链表按位置取元素值
printf("第%d个元素值为:%d\n", 5, e);
ListInsert(L, 4, 3);//在第4位置上插入数值3
printList(L);
ListInsert(L, 6, 21);//在第6位置上插入数值21
printList(L);
ListInsert(L, 2, 15);//在第2位置上插入数值15
printList(L);
pt = LocateElem(L, 38);//单链表的按值查找:输出 38 存储地址
if (pt)
printf("pt:%p,pt->data=%d\n", pt, pt->data);
else
printf("pt:%p\n", pt);
ListDelete_L(L, 5, e);//删除第5个位置上的元素
printList(L);
ListDelete_L(L, 3, e);//删除第3个位置上的元素
printList(L);
ListDelete_L(L, 12, e);//删除第12个位置上的元素
printList(L);
return 0;
}