题目:设计算法分段逆置线性表。例如线性表(1,2,3,4,5,6,7,8),按k等于3分段逆置得到
(3,2,1,6,5,4,8,7)
代码展示:(此题注意死循环,故使用r保存p的位置,防止断链或死循环)
void Reverse(LinkList &L,int k)
{
LinkList s = L;
LinkList p,q;
p = s->next;
while(p)
{
int i = k;
LinkList r = p;
s->next = NULL;
while(i!=0 && p!=NULL)
{
q = p->next;
p->next = s->next;
s->next = p;
p = q;
i--;
}
s = r;
}
}
题目:设list是带头结点有n个值为整数的单链表表头指针,设计算法,将单链表值大于x的结点都放在所有值小于x结点后面
代码展示:(此题注意p要申请空间,否则只是一个单纯的地址,没有next域,另外防止断链)
void Put(LinkList &L,int x)
{
LinkList s = L;
LinkList p,q;
p = (LinkList)malloc(sizeof(LinkNode));
p->next = NULL;
while(s->next!=NULL)
{
q = s->next;
if(q->data<x)
{
s = q;
}
else
{
s->next = q->next;
q->next = p->next;
p->next = q;
}
}
s->next = p->next;
}
题目:设有带头单链表list,每个结点的结构为(data,link,sort),link和sort为指针域,现在链表已经按link域连接起来,设计算法,利用sort域,将所有结点排序。
代码展示:
void sort(LinkList &L)
{
LinkList p,q,s;
p = L->next;
LinkList arr[100];
int i = 0;
while(p)
{
arr[i] = p;
p = p->next;
i++;
}
for(int m=0; m<i; m++)
{
for(int n=m+1; n<i; n++)
{
if(arr[m]->data > arr[n]->data)
{
LinkList temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
}
}
LinkList k = L->next;
i = 0;
while(k)
{
k->sort = arr[i++];
k = k->next;
}
}
题目:设有两个单链表,判断其中一个是否是另一个的子序列
代码展示:
int jude(LinkList A,LinkList B)//判断B是不是A的子序列
{
LinkList p,m,n;
p=A->next;
while(p)
{
m = p;
n = B->next;
while(m->data==n->data)
{
printf(" m=%d \n",m->data);
m = m->next;
n = n->next;
if(!n) return 1;
if(!m) return 0;
}
p = p->next;
}
return 0;
}
题目:设list是一个有n个结点带头结点单链表,A[m] (m<n)是一个整数有序数组,值在1到n之间,设计算法,从list中删除序号包含在A[m]中的结点。
代码展示:
void DeleteAllElems(LinkList &L,int *arr)
{
LinkList p = L;
int i = 0;
while(i<= sizeof(arr)/ sizeof(int))
{
while(p->next!=NULL)
{
if(p->next->data==arr[i])
{
LinkList k = p->next;
p->next = p->next->next;
free(k);
}
else
{
p = p->next;
}
}
i++;
p = L;
}
}
题目:编写程序,要求完成:
1.建立一个带头结点的线性表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。
2.在此链表下实现对二进制数加1的运算。
代码展示:
(1)
void Create(LinkList &L)
{
LinkList p = L;
int x;
while(1)
{
scanf("%d",&x);
if(x==-1)
{
break;
}
LinkList q = (LinkList)malloc(sizeof(LinkNode));
q->data = x;
q->next = p->next;
p->next = q;
}
}
(2)
void Add(LinkList &L)
{
//模拟二进制加1操作
LinkList p = L->next;
while(p)
{
if(p->data==0)
{
p->data++;
break;
}
else
{
p->data = 0;
if(p->next==NULL)
{
LinkList s = (LinkList)malloc(sizeof(LinkNode));
s->data = 1;
s->next = p->next;
p->next = s;
break;
}
p = p->next;
}
}
//逆置链表得到正确的值
LinkList p2 = L;
LinkList q = L->next;
p2->next = NULL;
while(q)
{
LinkList s = q->next;
q->next = p2->next;
p2->next = q;
q = s;
}
}

1783

被折叠的 条评论
为什么被折叠?



