题目为:实现两个有序表合并后仍然有序的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode*LinkList;
LinkList Create_Link()/*创建链表的函数,返回的是头指针*/
{
char ch;
struct LNode *head=NULL,*p1,*p2;
while(1)
{
p1=(struct LNode*)malloc(sizeof(struct LNode));
p1->next=NULL;
scanf("%d%c",&p1->data,&ch);
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
if(ch=='\n')
break;
}
return (head);
}
Status ListLength(LinkList L)/*计算链表长度的函数*/
{
int length=0;
struct LNode *p1;
p1=L;
while(p1!=NULL)
{
length++;
p1=p1->next;
}
return length;
}
Status GetElem(LinkList L,int i,ElemType*e)/*该函数取第i个元素赋给e,e用于后续比较*/
{
int j=1;
LinkList p=L;
while(p&&j<i)/*while(p!=NULL&&j<i),找到第i个数据*/
{
p=p->next;
j++;
}
if(!p||j>i)/*if(p=NULL||j>i),如果已经退出了循环,说明在循环中没有找到数据*/
return ERROR;
*e=p->data;
return OK;
}
void ListInsert(LinkList **L,int j,ElemType e)/*在链表中插入数据*/
{
int i=0;
struct LNode *p1,*p2,*p;
p1=**L;
p2=**L;
p=(struct LNode*)malloc(sizeof(struct LNode));
p->next=NULL;
p->data=e;
if(j==ListLength(**L)+1)
{
while(p1!=NULL)
{
p2=p1;
p1=p1->next;
}
p2->next=p;
}
else
{
if(j-1==0)
{
p->next=p1;
**L=p;
}
else
{
while(i<j)
{
p2=p1;
p1=p1->next;
}
p->next=p1;
p2->next=p;
}
}
}
Status ListEmpty(LinkList L)/*判断是否为空表*/
{
if(L->next)
return FALSE;
else
return TRUE;
}
void MergeList (LinkList La,LinkList Lb,LinkList *Lc)
{
int i=1,j=1,k=0;
int La_len,Lb_len;
int a,b;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len&&j<=Lb_len)
{
GetElem(La,i,&a);
GetElem(Lb,j,&b);
if(a<=b)
{
ListInsert(&Lc,++k,a);
++i;
}
else
{
ListInsert(&Lc,++k,b);
++j;
}
}
while(i<=La_len)
{
GetElem(La,i++,&a);
ListInsert(&Lc,++k,a);
}
while(j<=Lb_len)
{
GetElem(Lb,j++,&b);
ListInsert(&Lc,++k,b);
}
}
int main()
{
struct LNode *p1;
LinkList La,Lb,Lc;
La=Create_Link();
Lb=Create_Link();
if(!ListEmpty(La)&&!ListEmpty(Lb))
{
MergeList(La,Lb,&Lc);
}
p1=La;
while(p1!=NULL)
{
printf("%d ",p1->data);
p1=p1->next;
}
return 0;
}
参考GPT和自己的思路:该代码中的问题在于,在主函数中打印链表La的元素时,没有将指针p1指向链表Lc,而是仍然指向了链表La,因此输出为空。解决方法是将指针p1指向链表Lc。修改后的代码如下:
int main()
{
struct LNode *p1;
LinkList La,Lb,Lc;
La=Create_Link();
Lb=Create_Link();
if(!ListEmpty(La)&&!ListEmpty(Lb))
{
MergeList(La,Lb,&Lc);
}
p1=Lc; // 将指针p1指向链表Lc
while(p1!=NULL)
{
printf("%d ",p1->data);
p1=p1->next;
}
return 0;
}
链式顺序表合并,void MergeList (LinkList La,LinkList Lb,LinkList *Lc) 函数写的不对,以下是有序链表(非递减)序列合并的代码,供参考:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node* PtrToNode;
struct Node { //定义结点
ElementType data;//结点数据域
PtrToNode Next;//结点指针域
};
typedef PtrToNode List;
void creatList(List* L)
{
ElementType x;
PtrToNode pt = NULL, pL = NULL ;
while (1){
scanf("%d", &x);
if (x == -1) break; // 输入 -1 时,结束链表输入。
pt = (List)malloc(sizeof(struct Node));
pt->Next = NULL;
pt->data = x;
if (!(*L))
(*L) = pt;
else
pL->Next = pt;
pL = pt;
}
}
void MergeList_L(List* L1, List* L2, List* L3)
{
List p1 = (*L1), p2 = (*L2), p3 = (*L3);
while (p1 && p2) {
if (p1->data<= p2->data)
{
if (!(*L3))
(*L3) = p1;
else
p3->Next = p1;
p3 = p1;
p1 = p1->Next;
}
else
{
if (!(*L3))
(*L3) = p2;
else
p3->Next = p2;
p3 = p2;
p2 = p2->Next;
}
}
if (!(*L3))
(*L3) = p1 ? p1 : p2;
else
p3->Next = p1 ? p1 : p2;
(*L1) = NULL;
(*L2) = NULL;
}
void PrintList(List L)
{
if (!L)
printf("NULL");
else{
List p = L;
while (p)
{
printf(p == L ? "%d" : " %d", p->data);
p = p->Next;
}
}
}
int main()
{
List La = NULL, Lb = NULL, Lc = NULL;
creatList(&La);
creatList(&Lb);
MergeList_L(&La, &Lb, &Lc);
PrintList(Lc);
return 0;
}
运行如:
1、电阻噪声
电阻的噪声主要由三部分组成: 热噪声Thermal noise、接触噪声Contact noise、散粒噪声shot noise。
上面的公式显示噪声的大小与电阻值的平方根成正比。因此用两个半值电阻计算的结果和用1个电阻的计算结果相同。通常,任何相连的被动元件的噪声等同于总阻值产生的噪声。减小此类噪声的方法是:减少电阻的阻值。这也是输入部分不用大电阻的原因。
接触噪声
接触噪声与电阻的材料和尺寸有关。
shot噪声
Shot噪音与电流有关系,越多的直流电流流经电阻,噪音越大。为了减少这个噪音,应该尽量减少直流电流。
噪声模型
为了便于计算,可以将电阻R看作一个噪声电压源和一个理想无噪声电阻串联,或者看做一个噪声电流源和一个理想无噪声电阻并联。当实际电路中包含多个电阻时,每个电阻都将引入一个噪声源。若有多个电阻并联,总噪声电流等于各个点到所产生的噪声电流的均方值相加;若有多个电阻串联,总噪声电压等于各个电阻所产生的噪声电压的均方值相加。
重要公式
2、晶体管噪声
3.运算放大器噪声
如图40,噪声密度曲线由两部分噪声源相加构成,低频段的1/f噪声,高频段的白噪声。
PSPICE仿真见文档。挖个坑,以后再仔细分析。