实现一个顺序存储的线性表
#include <stdio.h>
#include <stdlib.h>
#include "Seqlist.h"
SeqList* SL_Create(int maxlen)
// 创建一个顺序表
// 与SqLst_Free()配对
{
SeqList* slist=(SeqList*)malloc(sizeof(SeqList));
slist->data = (T*)malloc(sizeof(T)*maxlen);
slist->max=maxlen;
slist->len=0;
return slist;
}
void SL_Free(SeqList* slist)
// 释放/删除 顺序表
// 与SqLst_Create()配对
{
free(slist->data);
free(slist);
}
void SL_MakeEmpty(SeqList* slist)
// 置为空表
{
slist->len=0;
}
int SL_Length(SeqList* slist)
// 获取长度
{
return slist->len;
}
bool SL_IsEmpty(SeqList* slist)
// 判断顺序表是否空
{
return 0==slist->len;
}
bool SL_IsFull(SeqList* slist)
// 判断顺序表是否满
{
return slist->len==slist->max;
}
T SL_GetAt(SeqList* slist, int i)
// 获取顺序表slist的第i号结点数据
// 返回第i号结点的值
{
if(i<0||i>=slist->len) {
printf("errot!\n");
SL_Free(slist);
exit(0);
}
else
return slist->data[i];
}
void SL_SetAt(SeqList* slist, int i, T x)
// 设置第i号结点的值(对第i号结点的数据进行写)
{
if(i<0||i>=slist->len) {
printf("errot!\n");
SL_Free(slist);
exit(0);
}
else
slist->data[i]=x;
}
bool SL_InsAt(SeqList* slist, int i, T x)
// 在顺序表的位置i插入结点x, 插入d[i]之前
// i的有效范围[0,plist->len]
{
if (i<0 || i>slist->len || slist->len==slist->max)
{
printf("errot!");
return false;
}
for (int j=slist->len; j>=i+1; j--)
{
slist->data[j]=slist->data[j-1];
}
slist->data[i]=x;
slist->len++;
return true;
/********** End **********/
}
T SL_DelAt(SeqList* slist, int i)
// 删除顺序表plist的第i号结点
// i的有效范围应在[0,plist->len)内,否则会产生异常或错误。
// 返回被删除的数据元素的值。
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int j;
if (i<0 || i>=slist->len)
{
printf(" error!\n");
}
T r=slist->data[i];
for (j=i; j<slist->len-1; j++)
{
slist->data[j] = slist->data[j+1];
}
slist->len--;
return true;
/********** End **********/
}
int SL_FindValue(SeqList* slist, T x)
// 在顺序表表中查找第一个值为x的结点,返回结点的编号
// 返回值大于等于0时表示找到值为x的结点的编号,-1表示没有找到
{
int i=0;
while(i<slist->len && slist->data[i]!=x) i++;
if (i<slist->len) return i;
else return -1;
}
int SL_DelValue(SeqList* slist, T x)
// 删除第一个值为x的结点,
// 存在值为x的结点则返回结点编号, 未找到返回-1
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int i;
i=SL_FindValue(slist, x);
if (i>=0)
{
SL_DelAt(slist, i);
}
return i;
/********** End **********/
}
void SL_Print(SeqList* slist)
// 打印整个顺序表
{
if (slist->len==0) {
printf("The slist is empty.\n");
return;
}
//printf("The slist contains: ");
for (int i=0; i<slist->len; i++) {
printf("%d ", slist->data[i]);
}
printf("\n");
}
实现一个链接存储的线性表
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
LinkList* LL_Create()
{
LinkList* llist=(LinkList*)malloc(sizeof(LinkList));
llist->front=NULL;
llist->rear=NULL;
llist->pre=NULL;
llist->curr=NULL;
llist->position=0;
llist->len=0;
return llist;
}
void LL_Free(LinkList* llist)
{
LinkNode* node=llist->front;
LinkNode* nextnode;
while(node){
nextnode=node->next;
free(node);
node=nextnode;
}
free(llist);
}
void LL_MakeEmpty(LinkList* llist)
{
LinkNode* node=llist->front;
LinkNode* nextnode;
while(node){
nextnode=node->next;
free(node);
node=nextnode;
}
llist->front=NULL;
llist->rear=NULL;
llist->pre=NULL;
llist->curr=NULL;
llist->position=0;
llist->len=0;
}
int LL_Length(LinkList* llist)
{
return llist->len;
}
bool LL_IsEmpty(LinkList* llist)
{
return llist->len==0;
}
bool LL_SetPosition(LinkList* llist, int i)
{
int k;
if (llist->len==0) return false;
if( i < 0 || i > llist->len)
{ printf("LL_SetPosition(): position error");
return false;
}
llist->curr = llist->front;
llist->pre = NULL;
llist->position = 0;
for ( k = 0; k < i; k++) {
llist->position++;
llist->pre = llist->curr;
llist->curr = (llist->curr)->next;
}
return true;
}
int LL_GetPosition(LinkList* llist)
{
return llist->position;
}
bool LL_NextPosition(LinkList* llist)
{
if (llist->position >= 0 && llist->position < llist->len)
{
llist->position++;
llist->pre = llist->curr;
llist->curr = llist->curr->next;
return true;
}
else
return false;
}
T LL_GetAt(LinkList* llist)
{
if(llist->curr==NULL)
{
printf("LL_GetAt(): Empty list, or End of the List.\n");
LL_Free(llist);
exit(1);
}
return llist->curr->data;
}
void LL_SetAt(LinkList* llist, T x)
{
if(llist->curr==NULL)
{
printf("LL_SetAt(): Empty list, or End of the List.\n");
LL_Free(llist);
exit(1);
}
llist->curr->data=x;
}
bool LL_InsAt(LinkList* llist, T x)
{
LinkNode *newNode=(LinkNode*)malloc(sizeof(LinkNode));
if (newNode==NULL) return false;
newNode->data=x;
if (llist->len==0){
newNode->next=NULL;
llist->front = llist->rear = newNode;
}
else if (llist->pre==NULL)
{
newNode->next = llist->front;
llist->front = newNode;
}
else {
newNode->next = llist->curr;
llist->pre->next=newNode;
}
if (llist->pre==llist->rear)
llist->rear=newNode;
llist->len++;
llist->curr = newNode;
return true;
}
bool LL_InsAfter(LinkList* llist, T x)
{
LinkNode *newNode=(LinkNode*)malloc(sizeof(LinkNode));
if(newNode==NULL) return false;
newNode->data=x;
if(llist->len==0)
{
newNode->next=NULL;
llist->front = llist->rear = newNode;
llist->len ++;
}
else if (llist->curr == llist->rear || llist->curr ==NULL)
{
newNode->next = NULL;
llist->rear->next=newNode;
llist->pre=llist->rear;
llist->rear=newNode;
llist->position=llist->len;
llist->len ++;
}
else
{
newNode->next = llist->curr->next;
llist->curr->next=newNode;
llist->pre=llist->curr;
llist->position ++;
llist->len ++;
}
llist->curr = newNode;
return true;
}
bool LL_DelAt(LinkList* llist)
{
LinkNode *oldNode;
if (llist->curr==NULL)
{
printf("LL_DelAt(): delete a node that does not exist.\n");
return false;
}
oldNode=llist->curr;
if (llist->pre==NULL)
{
llist->front = oldNode->next;
}
else if(llist->curr!=NULL){
llist->pre->next = oldNode->next;
}
if (oldNode == llist->rear) {
llist->rear = llist->pre;
}
llist->curr = oldNode->next;
free(oldNode);
llist->len --;
return true;
}
bool LL_DelAfter(LinkList* llist)
{
LinkNode *oldNode;
if (llist->curr==NULL || llist->curr== llist->rear)
{
printf("LL_DelAfter(): delete a node that does not exist.\n");
return false;
}
oldNode = llist->curr->next;
llist->curr->next=oldNode->next;
if (oldNode == llist->rear)
llist->rear = llist->curr;
free(oldNode);
llist->len --;
return true;
}
int LL_FindValue(LinkList* llist, T x)
{
LinkNode* p=llist->front;
int idx=0;
while(p!=NULL && p->data!=x) {
idx++;
p = p->next;
}
if (idx>=llist->len) return -1;
else return idx;
}
int LL_DelValue(LinkList* llist, T x)
{
int idx=LL_FindValue(llist, x);
if (idx<0) return -1;
LL_SetPosition(llist, idx);
LL_DelAt(llist);
return idx;
}
void LL_Print(LinkList* llist)
{
LinkNode* node=llist->front;
while (node) {
printf("%d ", node->data);
node=node->next;
}
printf("\n");
}
就地归并两个有序表
#include<stdio.h>
#include<malloc.h>
typedef struct list {
int data;
struct list * next;
}list;
struct list * L=NULL;
struct list * head=NULL;
struct list * p=NULL;
struct list * L1=NULL;
struct list * head1=NULL;
struct list * p1=NULL;
struct list * L2=NULL;
struct list * q=NULL;
struct list * q1=NULL;
int main(){
int i=0,length;
printf("请输入链表的长度\n");
scanf("%d",&length);
head=(struct list *)malloc(sizeof(struct list));
L=head;
printf("请依次输入链表的内容\n");
for(i;i<length;i++){
p = (struct list *)malloc(sizeof(struct list));
scanf("%d",&p->data);
p->next=NULL;
head->next=p;
head=p;
}
int i1=0,length1;
printf("请输入链表的长度\n");
scanf("%d",&length1);
head1=(struct list *)malloc(sizeof(struct list));
L1=head1;
printf("请依次输入链表的内容\n");
for(i1;i1<length1;i1++){
p1= (struct list *)malloc(sizeof(struct list));
scanf("%d",&p1->data);
p1->next=NULL;
head1->next=p1;
head1=p1;
}
L2=(struct list *)malloc(sizeof(struct list));
q=L2;
p=L->next;
p1=L1->next;
while(p&&p1){
if(p->data<p1->data){
L2->next=p;
L2=p;
p=p->next;
}else if(p->data==p1->data){
L2->next=p;
L2=p;
p=p->next;
q1=p1->next;
free(p1);
p1=q1;
}else if(p->data>p1->data){
L2->next=p1;
L2=p1;
p1=p1->next;
}
}
L2->next=p?p:p1;
free(L1);
printf("合并后链表的内容\n");
p=q->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
}
约瑟夫环问题
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int number;
int cipher;
}DataType;
typedef struct node
{
DataType data;
struct node *next;
}SCLNode;
void SCLLInitiate(SCLNode **head)
{
if((*head=(SCLNode*)malloc(sizeof(SCLNode)))==NULL)
exit(1);
(*head)->next=*head;
}
int SCLLInsert(SCLNode *head,int i,DataType x)
{
SCLNode *p,*q;
int j;
p=head->next;
j=1;
while(p!=head&&j<i-1)
{
p=p->next;
j++;
}
if(j!=i-1&&i!=1)
{
printf("插入位置参数错!");
return 0;
}
if((q=(SCLNode*)malloc(sizeof(SCLNode)))==NULL)
exit(1);
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
int SCLLDelete(SCLNode *head,int i,DataType *x)
{
SCLNode *p,*q;
int j;
p=head;
j=0;
while(p->next!=head&&j<i-1)
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("删除位置参数错!");
return 0;
}
q=p->next;
p->next=p->next->next;
*x=q->data;
free(q);
return 1;
}
int SCLLGet(SCLNode *head,int i,DataType *x)
{
SCLNode *p;
int l;
p=head;
l=0;
while(p->next!=head&&l<i)
{
p=p->next;
l++;
}
if(l!=i)
{
printf("取元素位置参数错!");
return 0;
}
*x=p->data;
return 1;
}
int SCLLNotEmpty(SCLNode *head)
{
if(head->next==head)
return 0;
else
return 1;
}
void SCLLDeleteAfter(SCLNode *p)
{
SCLNode *q=p->next;
p->next=p->next->next;
free(q);
}
void JesephRing(SCLNode *head,int m)
{
SCLNode *pre,*curr;
int i;
pre=head;
curr=head->next;
while(SCLLNotEmpty(head)==1)
{
for(i=1;i<m;i++)
{
pre=curr;
curr=curr->next;
if(curr==head)
{
pre=curr;
curr=curr->next;
}
}
printf("%d ",curr->data.number);
m=curr->data.cipher;
curr=curr->next;
if(curr==head)
curr=curr->next;
SCLLDeleteAfter(pre);
}
}
int main()
{
DataType test[7]={{1,3},{2,1},{3,7},{4,2},{5,4},{6,8},{7,4}};
int N=7,M=20,i;
SCLNode *head;
SCLLInitiate(&head);
for(i=1;i<=N;i++)
SCLLInsert(head,i,test[i-1]);
JesephRing(head,M);
return 0;
}