资料来自大话数据结构
线性表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE 20
#define ERROR 0
#define TRUE 0
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
Status ListInsert(SqList *L, int m, ElemType e);//在L中第m个位置前插入元素e,L长度+1
Status ListDelete(SqList *L, int m, ElemType *e);//删除L的第m个元素,并用e返回值,L长度减1
int main()
{
SqList list_ex;
SqList *ptr = &list_ex;
list_ex.length = 5;
int re = 0;
ElemType *ptr_re = &re;
for (int i = 0; i < list_ex.length; i++)
{
list_ex.data[i] = i;
}
//ListInsert(ptr, 3, 4);//在第三个数字前+4.
//ListDelete(ptr, 3, ptr_re);printf("删除元素:%d\n", re);//删除第三个元素
for (int i = 0; i < list_ex.length; i++)
{
printf("%d ", list_ex.data[i]);
}
system("pause");
return 0;
}
Status ListInsert(SqList *L, int m, ElemType e)
{
if (m > L->length + 1 || m < 1)
{
return ERROR;
}
if (L->length >= MAXSIZE)
{
return ERROR;
}
if (m <= L->length)
{
for (int i = L->length - 1; i >= m - 1; i--)
{
L->data[i + 1] = L->data[i];
}
L->data[m - 1] = e;
L->length++;
}
return TRUE;
}
Status ListDelete(SqList *L, int m, ElemType *e)
{
if (m > L->length||m<1)
{
return ERROR;
}
*e = L->data[m - 1];
for (int i = m - 1; i < L->length; i++)
{
L->data[i] = L->data[i + 1];
}
L->length--;
return TRUE;
}
链表
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef int ElemType;
#define OK 1
#define ERROR 0
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;//将struct Node定义成了新类型LinkList,这个类型是一个结构体的指针
typedef int Status;
LinkList CreateListHead(int n);//前插
LinkList CreateListEnd(int n);//尾插法
Status LinstInsert(LinkList L, int i, int e);//插入,传入节点的地址是头节点的地址
Status ListDelete(LinkList L, int i, int e);//删除
void output(LinkList L);
LinkList CreateListHead(int n)//头插法
{
LinkList p0;//LinkList与Node*类似
p0 = (LinkList)malloc(sizeof(Node));
p0->next = NULL;
for (int i = 0; i < n; i++)
{
Node* p;
p = (Node *)malloc(sizeof(Node));
p->data = i;
p->next = p0->next;
p0->next = p;
}
return p0;
}
void output(LinkList L)
{
Node *p;
for (p = L->next; p != NULL; p = p->next)
{
printf("%d", p->data);
}
printf("\n");
}
LinkList CreateListEnd(int n)//尾插法
{
LinkList p0;
p0 = (LinkList)malloc(sizeof(Node));
p0->next = NULL;
LinkList p_tem;
p_tem = p0;
for (int i = 0; i < n; i++)
{
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p->data = i;
p->next = NULL;
p_tem->next = p;
p_tem = p;
}
return p0;
}
Status LinstInsert(LinkList L, int i, int e)
{
LinkList p,s;
p = L;
int j = 1;//p指向第几个节点
while (p && j < i)
{
p = p->next;
++j;
}
if (!p)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p -> next = s;
return OK;
}
Status ListDelete(LinkList L, int i, int e)
{
LinkList q;
q = L;
int j = 1;
while (q->next && j < i)
{
q = q->next;
j++;
}
if (!q)
{
return ERROR;
}
LinkList p;
p = q->next;//p指向删除的节点
q->next = p->next;
e = p->data;
free(p);
return OK;
}
int main()
{
LinkList H;
H = CreateListEnd(9);
output(H);
//LinstInsert(H, 3, 1);
ListDelete(H, 3, 1);
output(H);
return 0;
}