2.设计一个算法,求一个带头结点的单链表中的结点个数
#include<stdio.h>
#include<stdlib.h>
#define flag -1
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}LNode, * LinkList;
void CreateLinkList(LinkList L)
{
LNode* r, * s;
DataType x;
printf("请输入结点的数据域");
scanf("%d", &x);
r = L;
while (x != flag)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入结点的数据域");
scanf("%d", &x);
}
r->next = NULL;
}
int Length(LinkList L)
{
LNode* p;
int length = 1;
for (p = L->next; p->next != NULL; p = p->next)
length++; //计算链长
return length;
}
int main()
{
int Length_L,Length_l;
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
CreateLinkList(L);
Length_L = Length(L);
Length_l=Length_L+1; //加上头结点
printf("单链表的节点个数为:%d", Length_l);
}
4.设计一个算法,判断一个顺序表中的各个结点值是否有序
#include<stdio.h>
#include<stdlib.h>
#define flag -1
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}LNode, * LinkList;
void CreateLinkList(LinkList L)
{
LNode* r, * s;
DataType x;
printf("请输入结点的数据域");
scanf("%d", &x);
r = L;
while (x != flag)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入结点的数据域");
scanf("%d", &x);
}
r->next = NULL;
}
void isSort(LinkList L)
{
LNode *p;
p=L->next;
int a=0,b=0;
while(p->next!=NULL)
{
if(p->data<=p->next->data) //若前一个结点值一直小于后一个 {
a=1;
p=p->next;
}
else //存在前一个结点值大于后一个
{
a=0;
break;
}
}
while(p->next!=NULL)
{
if(p->data>=p->next->data) //若前一个结点值一直大于后一个
{
b=1;
p=p->next;
}
else //存在前一个结点值小于后一个
{
b=0;
break;
}
}
if(a==1||b==1) //递增或递减时,有序
printf("有序");
else
printf("无序");
}
int main()
{
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
CreateLinkList(L);
isSort(L);
}
6.设计一个算法,将一个结点值为自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表
#include<stdio.h>
#include<stdlib.h>
#define flag -1
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}LNode, * LinkList;
void CreateLinkList(LinkList L)
{
LNode* r, * s;
DataType x;
printf("请输入结点的数据域");
scanf("%d", &x);
r = L;
while (x != flag)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入结点的数据域");
scanf("%d", &x);
}
r->next = NULL;
}
void PrintList(LinkList L)
{
void PrintList(LinkList L);
LinkList p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
LinkList split(LinkList L)
{
LinkList p,q,r;
LinkList La; //奇数链表
La = (LinkList)malloc(sizeof(LNode));
p = L;
q = La;
r = L;
p = p->next;
while(p)
{
if(p->data % 2 != 0)
{
q->next = p;
p = p->next;
r->next = p; //通过地址域的改变,实现原链表结点奇数值删除
q = q->next;
}
else
{
p=p->next;
r=r->next;
}
}
q->next=NULL;
return La;
}
int main()
{
LinkList L,La;
L = (LinkList)malloc(sizeof(LNode));
CreateLinkList(L);
printf("原链表为:");
PrintList(L);
La=split(L);
printf("偶数链为:\n");
PrintList(L);
printf("奇数链为:\n");
PrintList(La);
}
10.设计一个算法,对单链表按结点值从小到大对结点进行排序
#include<stdio.h>
#include<stdlib.h>
#define flag -1
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}LNode, * LinkList;
void CreateLinkList(LinkList L)
{
LNode* r, * s;
DataType x;
printf("请输入结点的数据域");
scanf("%d", &x);
r = L;
while (x != flag)
{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
printf("请输入结点的数据域");
scanf("%d", &x);
}
r->next = NULL;
}
void PrintList(LinkList L)
{
void PrintList(LinkList L);
LinkList p = L->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
LinkList sort(LinkList L)
{
LNode *p, *q;
int temp; //临时变量temp
p = L->next;
while(p!=NULL)
{
q = p->next; //便于数据之间的比较
while (q != NULL)
{
if (p->data > q->data)
{
temp= p->data; //临时存储指针的数据,便于数据交换
p->data = q->data;
q->data = temp;
}
q = q->next;
}
p = p->next;
}
return L;
}
int main()
{
LinkList L,La;
L = (LinkList)malloc(sizeof(LNode));
CreateLinkList(L);
printf("原链表为:");
PrintList(L);
L=sort(L);
printf("排序后链表为:\n");
PrintList(L);
}
13.设计一个算法,在双链表中值为y的结点前面插入一个值为x的新结点,即使值为x的新结点成为y的结点的前驱结点。
#include <stdio.h>
#include <stdlib.h>
typedef struct DNode
{
int data;
struct DNode *prior,*next;
}DLNode,*DLinkList;
DLinkList init()
{
return NULL;
}
void PrintDList(DLinkList L)
{
DLNode *p;
p=L;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return ;
}
DLinkList CreateDList(DLinkList L)
{
int x;
DLNode *p,*q;
printf("请输入结点值:");
scanf("%d",&x);
while(x!=-1)
{
p=(DLinkList)malloc(sizeof(DLNode));
p->data=x;
if(!L)
{
p->prior=NULL;
p->next=NULL;
L=p;
q=p;
}
else
{
q->next=p;
p->prior=q;
q=p;
p->next=NULL;
}
printf("请输入结点值:");
scanf("%d",&x);
}
return L;
}
DLinkList insert(DLinkList L,int y,int x)//在值为y的结点前插入x
{
DLNode *p,*q;
q=(DLinkList)malloc(sizeof(DLNode));
q->data=x;
if(L->data==y)
{
q->next=L;
q->prior=NULL;
L->prior=q;
L=q;
return L;
}
else if(L->data!=y && L->next==NULL)
{
free(q);
return L;
}
p=L;
while(p && p->data!=y)
{
p=p->next;
}
if(!p)
{
printf("insert y not exsit\n");
free(q);
return L;
}
q->next=p;
q->prior=p->prior;
p->prior->next=q;
p->prior=q;
return L;
}
int main()
{
int x,i,y;
DLinkList L;
L=(DLinkList)malloc(sizeof(DLNode));
L=init();
CreateDList(L);
PrintDList(L);
printf("请输入y,x的值:\n");
scanf("%d,%d",&y,&x);
L=insert(L,y,x);
PrintDList(L);
}