备考期间尝试写了一些基本数据结构的C语言实现,现做以下记录(基本数据元以int型为例):
全局定义及依赖:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define END NULL
链表结点定义:
typedef struct Lnode
{
int data;
struct Lnode *next;
}Node,*linkedList;
链表初始化:
//初始化链表
linkedList initList()
{
Node *L;
L = (Node *)malloc(sizeof(Node));
if(L==NULL)
{
printf("Init error!");
}
L->next = NULL;
printf("Init OK!\n");
return L;
}
头插法生成链表 即在头结点后插入新元素 :
//头插法生成链表 即在头结点后插入新元素
linkedList createListH(int n)
{
int i = 0;
Node *L;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
int x;
while(i<n)
{
scanf("%d",&x);
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = L->next;
L->next = p;
i++;
}
return L;
}
尾插法生成链表 即在尾结点后插入新元素:
//尾插法生成链表 即在尾结点后插入新元素
linkedList createListT(int n)
{
int i = 0;
Node *T;
T = (Node *)malloc(sizeof(Node));
T->next = NULL;
Node *r;
r = T;
int x;
while(i<n)
{
scanf("%d",&x);
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
r->next = p;
r = p;
i++;
}
r->next = NULL;
return T;
}
计算链表长度:
//calculate the length
int calculateLength(linkedList L)
{
int length = 0;
Node *p = L;
while(p->next)
{
length++;
p = p->next;
}
return length;
}
在指定链表的指定索引处插入新值:
//insert element into index x
int insertElementIntoX(linkedList L,int index,int e)
{
Node *p = L;
int length = calculateLength(L);
if(index<1||index>length+1){return ERROR;}
else
{
for(int i = 1;i<index;i++)
{
p = p->next;
}
Node *q = (Node *)malloc(sizeof(Node));
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
}
通过索引删除指定链表中的元素:
//delete element by index
int deleteElementByIndex(linkedList L,int index)
{
int length = calculateLength(L);
if(index<1||index>length){return ERROR;}
else
{
Node *p = L;
for(int i = 1;i<index;i++)
{
p = p->next;
}
Node *q = p->next;
p->next = q->next;
free(q);
return OK;
}
}
遍历并打印链表中所有结点元素:
//遍历
void traversalList(linkedList L)
{
Node *p = L->next;
while(p!=END)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
对两个链表做非递减归并:
linkedList mergeDecline(linkedList La,linkedList Lb)
{
Node *a = La->next;
Node *b = Lb->next;
free(La);
free(Lb);
linkedList Lc = initList();
Node *temp = Lc;
while(a!=NULL&&b!=NULL)
{
if(a->data<=b->data)
{
temp->next = a;
a = a->next;
temp = temp->next;
}
else
{
temp->next = b;
b = b->next;
temp = temp->next;
}
}
temp->next == NULL;
if(a!=NULL){temp->next = a;}
if(b!=NULL){temp->next = b;}
return Lc;
}
删除给定链表中所有重复元素(对重复元素只保留其中一个):
//delete repeating node
void deleteRepeatingNode(linkedList L)
{
Node *p,*q,*r;
p = L->next;
if(p==NULL){return;}
while(p->next)
{
q = p;
while(q->next)
{
if(q->next->data==p->data)
{
r = q->next;
q->next=r->next;
free(r);
}
else
{
q = q->next;
}
}
p = p->next;
}
}
将链表中的元素按从小到大进行排序:
//sort from small to large
int sortFSL(linkedList L)
{
if(L->next==NULL){return ERROR;}
else
{
Node *r = L;
Node *p = r->next;
Node *q = p->next;
while(p->next)
{
while(q)
{
if(p->data>q->data)
{
int e = p->data;
p->data = q->data;
q->data = e;
q = q->next;
}
else
{
q = q->next;
}
}
r = r->next;
p = p->next;
q = p->next;
}
return OK;
}
}
删除链表中所有元素值大于x的结点:
int deleteAGTX(linkedList L,int x)
{
if(L->next==NULL){return ERROR;}
else{
Node *p = L;
while(p->next)
{
if(p->next->data>x)
{
Node *temp = p->next;
p->next = p->next->next;
free(temp);
}
else{
p = p->next;
}
}
return OK;
}
}
将链表中所有负数前置并排序:
//负数在前排序
int negativePriority(linkedList L)
{
if(L->next==NULL){return ERROR;}
else{
Node *p = L;
while(p->next)
{
if(p->next->data<0)
{
Node *temp = p->next;
p->next = temp->next;
temp->next = L->next;
L->next = temp;
}
else{p = p->next;}
}
return OK;
}
}
南京航空航天大学922部分真题:
//2014真题-数据结构6
int _2014_T6(linkedList L)
{
if(L->next==NULL){return ERROR; }
else{
Node *p = L;
Node *t = NULL;
Node *s = NULL;
int count = 1;
while(p->next)
{
if(count%2==0)
{
t = p->next;
p->next = p->next->next; //关键步骤
t->next = s;
s = t;
}
else{
p = p->next;
}
count++;
}
p->next = s;
return OK;
}
}
//2015真题数据结构6
int _2015_T6(linkedList L)
{
if(L->next==NULL){return ERROR; }
else{
Node *p = L->next;
Node *q = L->next;
Node *t = L;
Node *top = NULL;
while(p->next)
{
while(q->next)
{
if(q->next->data>p->data)
{
p = q->next;
t = q;
q = q->next;
}
else{
q = q->next;
}
}
t->next = t->next->next;
p->next = top;
top = p;
t = L;
p = q = L->next;
}
p->next = top;
return OK;
}
}
//2013真题数据结构6
int _2013_T6(linkedList La,linkedList Lb)
{
if(La->next==NULL){return ERROR;}
else{
Node *a = La;
Node *b = Lb;
int element;
while(a->next)
{
element = a->next->data;
while(b->next)
{
if(b->next->data==element){break;}
else{b = b->next;}
}
if(b->next==NULL)
{
Node *t = a->next;
a->next = a->next->next;
free(t);
}
else{a = a->next;}
b = Lb;
}
a = La;
while(a->next)
{
Node *p = La->next;
int e;
while(p->next)
{
if(p->next->data>a->next->data)
{
e = a->next->data;
a->next->data = p->next->data;
p->next->data = e;
}
p = p->next;
}
a = a->next;
}
return OK;
}
}
//2011真题-数据结构24
int _2011_T24(linkedList L)
{
if(L->next == NULL){return ERROR;}
else{
Node *p = L;
int element = p->next->data;
while(p->next)
{
if(element>p->next->data)
{
element = p->next->data;
}
p = p->next;
}
p = L;
while(p->next)
{
if(p->next->data==element)
{
Node *t = p->next;
p->next = p->next->next;
free(t);
break;
}
p = p->next;
}
return OK;
}
}
使用单链表实现数制转换(1-10进制):
//数制转换(1-10进制)
void transCodeR(int num,int r)
{
linkedList L = initList();
L->data = -1;
Node *top = NULL;
int i;
while(num>0)
{
i = num%r;
top = (Node *)malloc(sizeof(Node));
top->data = i;
top->next = L;
L = top;
num = num/r;
}
printf("The result is: ");
while(top->data!=-1)
{
printf("%d ",top->data);
top = top->next;
}
}
测试:
int main()
{
int n = 0;
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList La = createListT(n);
printf("Traversal the list a:\n");
traversalList(La);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lb = createListT(n);
printf("Traversal the list b:\n");
traversalList(Lb);
traversalList(mergeDecline(La,Lb)); //Merge
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Ld = createListT(n);
traversalList(Ld);
deleteRepeatingNode(Ld); //delete repeating node
traversalList(Ld);
int index,element;
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Le = createListT(n);
traversalList(Le);
printf("Please enter the index:\n");
scanf("%d",&index);
printf("Please enter the element:\n");
scanf("%d",&element);
insertElementIntoX(Le,index,element); //insert element into index x
traversalList(Le);
int index;
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lf = createListT(n);
traversalList(Lf);
printf("Please enter the index:\n");
scanf("%d",&index);
deleteElementByIndex(Lf,index); //delete element by index
traversalList(Lf);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lg = createListT(n);
traversalList(Lg);
sortFSL(Lg); //sort from small to large
traversalList(Lg);
int x;
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lh = createListT(n);
traversalList(Lh);
printf("Please enter the value:\n");
scanf("%d",&x);
deleteAGTX(Lh,x); //P3-3-2-3-1 删除所有元素值大于x的结点
traversalList(Lh);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Li = createListT(n);
traversalList(Li);
negativePriority(Li); //负数在前排序
traversalList(Li);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lj = createListT(n);
traversalList(Lj);
_2014_T6(Lj); //2014真题-数据结构6
traversalList(Lj);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lk = createListT(n);
traversalList(Lk);
_2015_T6(Lk); //2015真题-数据结构6
traversalList(Lk);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Ll = createListT(n);
traversalList(Ll);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Lm = createListT(n);
traversalList(Lm);
_2013_T6(Ll,Lm); //2013真题-数据结构6
traversalList(Ll);
printf("Please enter the length:\n");
scanf("%d",&n);
linkedList Ln = createListT(n);
traversalList(Ln);
_2011_T24(Ln);
traversalList(Ln); //2011真题-数据结构24
int num;
printf("Please enter the num:\n");
scanf("%d",&num);
printf("Please enter the r:\n");
scanf("%d",&n);
transCodeR(num,n);
return 0;
}