#include
#include
#include
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef char ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; /* LinkList为结构指针类型*/
void init_linklist(LinkList *l)/*对单链表进行初始化*/
{
*l=(LinkList)malloc(sizeof(Node));
(*l)->next=NULL;
}
void CreateFromTail( LinkList L)
{
Node *r, *s;
char c;
int flag =1; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/
}
}
}
Node *Get(LinkList L, int i)
/*在带头结点的单链表L中查找第i个结点,若找到(1≤i≤n),则返回该结点的存储位置; 否则返回NULL*/
{
int j;
Node *p;
p=L;
j=0; /*从头结点开始扫描*/
while ((p->next!=NULL)&&(jnext; /* 扫描下一结点*/
j++; /* 已扫描结点计数器 */
}
if(i == j)
return p; /* 找到了第i个结点 */
else
return NULL; /* 找不到,i≤0或i>n */
}
int main()
{
LinkList l;
Node *p;
int j;
init_linklist(&l);
printf("请输入链表数据,以$结束!\n");
CreateFromTail(l);
p = l->next;
while(p!=NULL)
{
printf("%c\n",p->data);
p=p->next;
}
fflush(stdin);
printf("请输入要查找的结点序号:\n");
scanf("%d",&j);
p = Get(l,j);
if(p!=NULL)
printf("该结点的值为:%c\n",p->data);
else
printf("未找到此结点!\n");
return 0;
}
网上现成的一大筐哦
int insert_link(Link *pHead,int pos,data_type item)
{
//入参判断
if(NULL == pHead)
{
return LINKNULL;
}
//创建新节点
Link *pNew = (Link *)malloc(sizeof(Link));
if(NULL == pNew)
{
perror("malloc error");
return MALLOCERROR;
}
memset(pNew,0,sizeof(Link));
//将新值赋值给新节点的数据域
pNew->data = item;
//根据位置向链表中插入元素
Link *pTail = NULL;
Link *pPre1 = NULL;
Link *pPre2 = NULL;
int i = 0;
switch(pos)
{
//头插法
case HEAD:
//先保护好要插入节点后的所有节点
if(pHead->pNext != NULL)
{
pNew->pNext = pHead->pNext;
}
//将新节点插入进去
pHead->pNext = pNew;
break;
//尾删法
case TAIL:
//定义一个指针变量,初始化为头节点
pTail = pHead;
//当pTail->pNext不为空的时候
while(pTail->pNext != NULL)
{
pTail = pTail->pNext;
}
//将新节点插入进去
pTail->pNext = pNew;
break;
//中间插入
default:
//定义两个结构体指针变量一个指向头节点一个指向首节点
pPre1=pHead;
pPre2=pHead->pNext;
while(pPre2 != NULL && i<pos-1)
{
pPre1=pPre2;
pPre2=pPre2->pNext;
i++;
}
//当pPre2不等于空时,移动pos-1个位置
if(NULL == pPre2)
{
return EMPTY;
}
//保护要插入元素后的所有节点
pNew->pNext=pPre2;
//插入元素
pPre1->pNext=pNew;
}
return OK;
}
int delete_link(Link *pHead,int pos,data_type *pData)
{
//入参判断
if(NULL == pHead)
{
return LINKNULL;
}
//定义一个结构体指针变量,保存要删除的节点的首地址
Link *pDel = NULL;
Link *pPre = NULL;
int i = 0;
switch(pos)
{
case HEAD:
//找到要删除的节点
pDel = pHead->pNext;
//头删法
// 保存要删除的数据
*pData = pDel->data;
// 保存要删除节点后的所有节点
pHead->pNext = pDel->pNext;
//释放pDel
free(pDel);
pDel = NULL;
break;
//尾删法
case TAIL:
//定义两个指针变量,一个初始化为头节点,一个初始化为首节点
pPre = pHead;
pDel = pHead->pNext;
if(NULL == pDel)
{
return EMPTY;
}
//判断pDel的指针域是否为空
while(pDel->pNext != NULL)
{
//两个指针同时向后移动
pPre = pDel;
pDel = pDel->pNext;
}
//保存要删除的数据
*pData = pDel->data;
//4.将pPre的指针域赋值为NULL
pPre->pNext = NULL;
//5.释放pDel
free(pDel);
pDel = NULL;
break;
//中间删除
default:
//定义两个指针变量,一个初始化为头节点,一个初始化为首节点
pPre = pHead;
pDel = pHead->pNext;
//当pDel不为空的情况下,移动pos-1次
while(pDel != NULL && i < pos-1)
{
pPre = pDel;
pDel = pDel->pNext;
i++;
}
if(NULL == pDel)
{
return EMPTY;
}
//保存好要删除的数据
*pData = pDel->data;
//保护好要删除节点后的所有节点
pPre->pNext = pDel->pNext;
//释放pDel
free(pDel);
pDel = NULL;
}
return OK;
}
https://blog.csdn.net/yyyy11665/article/details/126334657
贝祖等式:
设a,b是任意两个正整数,则存在整数s,t使得 s*a+t*b=(a,b)
编程实现(Java):
public class BezoutsIdentity {
static long s;
static long t;
public static void main(String[] args) {
get_s_t(7,12);
System.out.println(Main.s+" "+Main.t);
}
public static long get_s_t(long a,long b){
long d=get_gcd(a,b);
long n=1;
s=s*n;
t=t*n;
return d;
}
public static long get_gcd(long a,long b){ //greatest Common Divisor求最大公因数
if (b==0) {
s=1;
t=0;
return a;
}
long gcd=get_gcd(b,a%b);
long s1=s;
s=t;
t=s1-(a/b)*t;
return gcd;
}
}