1.顺序表操作 C 完整版
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct list
{
int* elem;
int length;
}SqList;
void InitList(SqList& L);
void PrintList(SqList L);
int LocateElem(SqList L, int e);
int ListInsert(SqList& L, int i, int e);
int ListDelete(SqList& L, int i);
int main()
{
SqList L;
InitList(L);
printf("初始顺序表元素:");
PrintList(L);
//查找
/*int e;
scanf_s("%d",&e);
int loc=LocateElem(L,e);
printf("%d的序号=%d",e,loc);
*/
//插入
int i,e;
scanf_s("%d%d",&i,&e);
ListInsert(L,i,e);
printf("执行插入操作后顺序表的元素:");
PrintList(L);
//删除
/*int i;
scanf_s("%d", &i);
ListDelete(L,i);
printf("执行删除操作后顺序表的元素:");
PrintList(L);
return 0;*/
}
void InitList(SqList& L)
{
L.elem = (int*)malloc(MAXSIZE * sizeof(int));
int e, len = 0;
scanf_s("%d", &e);
while (e != -1)
{
L.elem[len++] = e;
scanf_s("%d", &e);
}
L.length = len;
}
void PrintList(SqList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}
int LocateElem(SqList L, int e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == e)
{
return i + 1;
}
}
return 0;
}
int ListInsert(SqList& L, int i, int e)
{
if (L.length >= MAXSIZE)
{
return 0;
}
if (i<1 || i>L.length + 1)
{
return 0;
}
for (int j = L.length - 1; j >= i - 1; j--)
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
L.length++;
return 1;
}
int ListDelete(SqList& L, int i)
{
if (i<1 || i>L.length)
{
return 0;
}
for (int j = i - 1; j < L.length - 1; j++)
{
L.elem[j] = L.elem[j + 1];
}
L.length--;
return 1;
}
2.哈希表
7-10 整型关键字的散列映射 (25 分)
给定一系列整型关键字和素数P,用除留余数法定义的散列函数H(Key) = Key % P将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
输入格式:
输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。
输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例:
4 5
24 15 61 88
输出样例:
4 0 1 3
解题:
没什么好说的,但是要注意一个地方,即while循环的条件(关键字可能会重复,这时插在原位置即可)
代码如下:
#include<stdio.h>
int main()
{
int n,p,arr[10000]={0},a,b,flag=1;
scanf("%d %d",&n,&p);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
b=a%p;
while(arr[b]!=0&&arr[b]!=a)
{
b++;
if(b>=p)
b=0;
}
arr[b]=a;
if(flag==1)
{
flag=0;
printf("%d",b);
}
else
{
printf(" %d",b);
}
}
return 0;
}
3.链表操作
带头结点的单链表插入操作:
int insert_link ( LinkList L,int i,ElemType e)
{
LinkList p=L,s;
s=(LinkList)malloc(sizeof(LNode));
int count=0;
while(p)
{
count++;
if(count==i)
{
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
p=p->next;
}
return 0;
}
带头结点的单链表删除操作:
int delete_link ( LinkList L,int i)
{
LinkList p=L,s;
int count=0;
while(p->next)
{
count++;
if(count==i)
{
s=p->next;
p->next=p->next->next;
free(s);
return 1;
}
p=p->next;
}
return 0;
}
4.二叉树层次遍历
void Levelorder(BiTree T)
{
int z=0,y=0;
BiTree arr[10];
if(T)
{
arr[y++]=T;
while(z!=y)
{
if(arr[z]->lchild!=NULL)
arr[y++]=arr[z]->lchild;
if(arr[z]->rchild!=NULL)
arr[y++]=arr[z]->rchild;
printf(" %c",arr[z++]->data);
}
}
}
求树深:
int Depth(BiTree T)
{
int z=0,y=0,count=0,depth=0,size=0;
BiTree arr[10];
if(T)
{
arr[y++]=T;
while(z!=y)
{
count=0;
depth++;
size=y-z;
while(count<size)
{
count++;
if(arr[z]->lchild!=NULL)
arr[y++]=arr[z]->lchild;
if(arr[z]->rchild!=NULL)
arr[y++]=arr[z]->rchild;
z++;
}
}
}
return depth;
}
5.图的遍历
深搜:
void DFS(MGraph G,Vertex v)
{
visited[v]=1;
printf(" %d",v);
for(int i=0;i<G.vexnum;i++)
{
if(visited[i]==0&&G.arcs[i][v]!=0)
DFS(G,i);
}
}
广搜:
void BFS(MGraph G,Vertex i)
{
int arr[10],z=0,y=0,u=0;
arr[y++]=i;
visited[i]=1;
while(z!=y)
{
u=arr[z++];
printf(" %d",u);
for(int j=0;j<G.vexnum;j++)
{
if(visited[j]==0&&G.arcs[u][j]==1)
{
arr[y++]=j;
visited[j]=1;
}
}
}
}