今天敲了一下数据结构中顺序表和链表的代码,发现C语言好久不用真的忘得差不多了。代码都是可以直接运行的(我的运行环境是Dev)。如果有写错的地方,欢迎大家留言一起讨论。
java 版的在这里:java实现链表
对这一部分概念的介绍可以参考这篇博客:数据结构中的顺序表
下来就直接看代码吧
#include
#define MAXSIZE 100
typedef struct{
int elem[MAXSIZE];
int length;
}SeqList;
//初始化
void Init_SeqList(SeqList &L){
printf("初始化函数\n");
// L.length = 5;
printf("请输入顺序表长度:\n");
scanf("%d", &L.length);
printf("请输入顺序表的元素:\n");
for(int k = 0; k <= L.length-1; k++){
scanf("%d", &L.elem[k]);
}
}
//插入
int Insert_SeqList(SeqList &L, int i, int x){
printf("插入函数\n");
int j;
if(L.length == MAXSIZE - 1){
printf("表满\n");
return 0;
}
if(i < 1 || i > L.length){
printf("插入位置错\n");
return 0;
}
for(j = L.length; j >= i; j--){
L.elem[j+1] = L.elem[j];
}
L.elem[i] = x;
L.length++;
return true;
}
//删除
int Delete_SeqList(SeqList &L, int i){
printf("删除函数\n");
int j;
if(i < 1 || i > L.length-1){
printf("不存在该元素\n");
return 0;
}
for(j = i; j <= L.length-1; j++){
L.elem[j] = L.elem[j+1];
}
L.length--;
return true;
}
//按值查找
int Location_SeqList(SeqList &L, int x){
printf("按值查找函数\n");
int j = 0;
while((j <= L.length-1) && L.elem[j] != x){
j++;
}
if(j >= L.length){
return 0;
}
else
return j;
}
//两个表合并
void Merge(SeqList &A, SeqList &B, SeqList &C){
printf("合并函数\n");
//先给A,B 分别赋值
int a[5] = {1, 2, 5, 3, 7};
int b[4] = {1, 6, 9, 4};
A.length = 5;
for(int k = 0; k <= 5-1; k++){
A.elem[k] = a[k];
}
B.length = 4;
for(int k = 0; k <= 4-1; k++){
B.elem[k] = a[k];
}
// 输出测试
printf("%d\n",A.length);
for(int k = 0; k <= A.length-1; k++){
printf("%d ",A.elem[k]);
}
printf("\n");
printf("%d\n",B.length);
for(int k = 0; k <= B.length-1; k++){
printf("%d ",B.elem[k]);
}
printf("\n");
int i, j, m;
i = 0;
j = 0;
m = 0;
while((i <= A.length-1) && (j <= B.length-1)){
if(A.elem[i] <= B.elem[j]){
C.elem[m++] = A.elem[i++];
}
else{
C.elem[m++] = B.elem[j++];
}
}
while(i <= A.length-1){
C.elem[m++] = A.elem[i++];
}
while(j <= B.length-1){
C.elem[m++] = B.elem[j++];
}
C.length = A.length + B.length;
for(int k = 0; k <= C.length-1; k++){
printf("%d ", C.elem[k]);
}
}
int main(){
SeqList L, A, B, C;
int i = 3; //插入、删除、查找位置
int x = 20; //插入、删除元素
int test; //返回结果测试
Init_SeqList(L);
// test = Insert_SeqList(L, i, x);
// for(int k = 0; k <= L.length-1; k++){
// printf("%d ", L.elem[k]);
// }
// printf("\n");
// test = Delete_SeqList(L, i);
// for(int k = 0; k <= L.length-1; k++){
// printf("%d ", L.elem[k]);
// }
// printf("\n");
// test = Location_SeqList(L, x);
// printf("该元素的位置为:%d\n", test);
// Merge(A, B, C);
}
注:main 函数中的注释部分,是对每个函数的调用,需要调用哪个函数 自己把注释去掉就好啦。
下面是用 c 语言实现的链表的代码:
#include
#include
typedef struct node{
int data;
struct node *next;
}LNode, *LinkList;
LinkList Creat_LinkList1(){
printf("头插法建立单链表函数\n");
LinkList H = (LinkList)malloc(sizeof(LNode)); //头结点
H->next = NULL; //空表
LNode *s;
int x;
printf("请输入链表元素值:\n");
scanf("%d", &x);
while(x != -1){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = H->next;
H->next = s;
scanf("%d", &x);
}
return H;
}
LinkList Creat_LinkList2(){
printf("尾插法建立单链表函数\n");
LinkList H = (LinkList)malloc(sizeof(LNode));
H->next = NULL;
LNode *s;
LNode *r = H;
int x;
printf("请输入链表元素值:\n");
scanf("%d", &x);
while(x != -1){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = r->next;
r->next = s;
r = s;
scanf("%d", &x);
}
return H;
}
int Length_LinkList(LinkList L){
printf("求链表长度函数\n");
LNode *p = L;
int count = 0;
while(p->next != NULL){
p = p->next;
count++;
}
return count;
}
LinkList Get_LinkList(LinkList L, int k){
printf("按位置查找函数\n");
LNode *p = L;
int count = 0;
while(p->next != NULL && count < k){
p = p->next;
count++;
}
if(count == k){
return p;
}
else{
printf("没有第%d个元素\n", k);
return NULL;
}
}
int Locate_LinkList(LinkList L, int x){
printf("按值查找函数\n");
LNode *p = L;
// p = L->next;
int index = 0;
while(p != NULL && p->data != x){
p = p->next;
index++;
}
printf("测试----%d\n", Length_LinkList(L));
if(index-1 == Length_LinkList(L)){
return 0;
}
else{
return index;
}
}
void Print(LinkList L){
printf("输出链表函数\n");
while(L->next != NULL){
printf("%d ", L->next->data);
L = L->next;
}
printf("\n");
}
int Insert_LinkList(LinkList L, int i, int x){
printf("插入元素函数\n");
LNode *p;
LNode *s;
p = Get_LinkList(L, i-1);
if(p == NULL){
printf("插入位置%d错误\n", i);
return 0;
}
else{
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;
p->next = s;
return true;
}
}
int Delete_LinkList(LinkList L, int i){
printf("删除元素函数\n");
LNode *p;
LNode *q;
p = Get_LinkList(L, i-1);
if(p == NULL){
printf("第%d个节点不存在\n", i);
return 0;
}
else{
if(p->next == NULL){
printf("第%d个节点不存在\n", i);
return 0;
}
else{
q = p->next;
p->next = q->next;
free(q);
return true;
}
}
}
void Reverse(LinkList L){
printf("单链表的倒置函数\n");
LNode *p;
LNode *q;
p = L->next;
L->next = NULL; //将原链表置为空
while(p){
q = p;
p = p->next;
q->next = L->next;
L->next = q;
}
}
void DeleteRepeat_LinkList(LinkList L){
printf("删除重复节点函数\n");
LNode *p;
LNode *q;
LNode *r;
p = L->next; //p指向第一个结点
if(p != NULL){
while(p->next){
q = p;
while(q->next){ //从*p的后继开始查找重复节点
if(q->next->data == p->data){
r = q->next;
q->next = r->next;
free(r);
}
else{
q = q->next;
}
}
p = p->next;
}
}
}
int main(){
LinkList L = NULL;
LNode *p;
int length;
int k = 3;
int x = 5;
int i = 6;
int index;
// L = Creat_LinkList1();
L = Creat_LinkList2();
// length = Length_LinkList(L);
// printf("单链表的长度为:%d\n", length);
// p = Get_LinkList(L, k);
// printf("按位置查找--第%d个位置的元素为:%d\n", k, p->data);
// index = Locate_LinkList(L, x);
// printf("按值查找--值为%d的元素的位置为:%d\n", x, index);
// Insert_LinkList(L, i, x);
// Delete_LinkList(L, i);
// Reverse(L);
DeleteRepeat_LinkList(L);
Print(L);
}