C语言-单链表和双向链表
一、单链表
单链表的存储结构:
typedef struct LNode{
int data;
struct LNode *next;//指向下一个节点
}LNode,*LinkList;
定义的函数:
void createList(LinkList &T);//初始化
void addList(LinkList &T,int key);//添加
void deleteList(LinkList &T,int loc);//删除
void insertList(LinkList &T,int loc,int key);//插入
void reverseList(LinkList &T);//倒置
void printList(LinkList &T);//打印
以下是具体代码:
void createList(LinkList &T){//初始化
T = (LNode *)malloc(sizeof(LNode));
T->next = NULL;
}
void addList(LinkList &T,int key){//插入
LNode *p,*s;
p = T;
while(p->next!=NULL){
p = p->next;
}
s = (LNode *)malloc(sizeof(LNode));
s->data = key;
p->next = s;
s->next = NULL;
}
void deleteList(LinkList &T,int loc){//删除
LNode *p;
p = T;
for(int i = 1;i < loc;i++){
p = p->next;
}
p->next = p->next->next;
}
void insertList(LinkList &T,int loc,int key){//插入
LNode *p,*s;
p = T;
for(int i = 1;i < loc;i++){
p = p->next;
}
s = (LNode *)malloc(sizeof(LNode));
s->data = key;
s->next = p->next;
p->next = s;
}
void reverseList(LinkList &T){//倒置
LNode *p,*re,*s;
re = (LNode *)malloc(sizeof(LNode));
re->next = NULL;
p = T->next;
while(p!=NULL){
s = (LNode *)malloc(sizeof(LNode));
s->data = p->data;
s->next = re->next;
re->next = s;
p = p->next;
}
T = re;
}
void printList(LinkList &T){//打印
LNode *p;
p = T->next;
printf("\n当前单链表为:");
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
以下是完整代码:
#include<stdlib.h>
#include<stdio.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void createList(LinkList &T);
void addList(LinkList &T,int key);
void deleteList(LinkList &T,int loc);
void insertList(LinkList &T,int loc,int key);
void reverseList(LinkList &T);
void printList(LinkList &T);
void createList(LinkList &T){
T = (LNode *)malloc(sizeof(LNode));
T->next = NULL;
}
void addList(LinkList &T,int key){
LNode *p,*s;
p = T;
while(p->next!=NULL){
p = p->next;
}
s = (LNode *)malloc(sizeof(LNode));
s->data = key;
p->next = s;
s->next = NULL;
}
void deleteList(LinkList &T,int loc){
LNode *p;
p = T;
for(int i = 1;i < loc;i++){
p = p->next;
}
p->next = p->next->next;
}
void insertList(LinkList &T,int loc,int key){
LNode *p,*s;
p = T;
for(int i = 1;i < loc;i++){
p = p->next;
}
s = (LNode *)malloc(sizeof(LNode));
s->data = key;
s->next = p->next;
p->next = s;
}
void reverseList(LinkList &T){
LNode *p,*re,*s;
re = (LNode *)malloc(sizeof(LNode));
re->next = NULL;
p = T->next;
while(p!=NULL){
s = (LNode *)malloc(sizeof(LNode));
s->data = p->data;
s->next = re->next;
re->next = s;
p = p->next;
}
T = re;
}
void printList(LinkList &T){
LNode *p;
p = T->next;
printf("\n当前单链表为:");
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
int main(){
LinkList T;
createList(T);
int num,i,key,loc;
printf("请输入插入个数:");
scanf("%d",&num);
for(i = 1;i <= num;i++){
printf("第%d个:",i);
scanf("%d",&key);
addList(T,key);
}
printList(T);
printf("\n请输入删除位置:");
scanf("%d",&loc);
deleteList(T,loc);
printList(T);
printf("\n请输入插入位置和元素:");
scanf("%d %d",&loc,&key);
insertList(T,loc,key);
printList(T);
reverseList(T);
printf("\n转置");
printList(T);
return 0;
}
二、双链表
双链表的存储结构:
typedef struct DulNode{
int data;
struct DulNode *prior,*next;//两个分别指向前结点和后结点的指针
}DulNode,*DulList;
定义的函数:
void createDul(DulList &T);//初始化
void addDul(DulList &T,int key);//添加
void deleteDul(DulList &T,int loc);//删除
void exchangeDul(DulList &T,int loc1,int loc2);//交换
void insertDul(DulList &T,int loc,int key);//插入
void printDul(DulList &T);//打印
int eqhuiwen(DulList &T);//判断是否为回文
以下是具体代码:
void createDul(DulList &T){
T = (DulNode*)malloc(sizeof(DulNode));
T->next = NULL;
T->prior = NULL;
}
void addDul(DulList &T,int key){
DulNode *p,*s;
s = (DulNode *)malloc(sizeof(DulNode));
s->data = key;
for(p = T;p->next!=NULL;p=p->next){
}
p->next = s;
s->prior = p;
s->next = NULL;
}
void deleteDul(DulList &T,int loc){
DulNode *p;
int i;
p = T;
for(i = 1;i <= loc;i++){
p = p->next;
}
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
void exchangeDul(DulList &T,int loc1,int loc2){
DulNode *p1,*p2;
int i,temp;
p1 = p2 = T;
for(i = 1;i <= loc1 || i <= loc2;i++){
if(i <= loc1){
p1 = p1->next;
}
if(i <= loc2){
p2 = p2->next;
}
}
temp = p1->data;
p1->data = p2->data;
p2->data = temp;
}
void insertDul(DulList &T,int loc,int key){
DulNode *p,*s;
int i;
p = T;
for(i = 1;i < loc;i++){
p = p->next;
}
s = (DulNode *)malloc(sizeof(DulNode));
s->data = key;
s->next = p->next;
p->next->prior = s;
p->next = s;
s->prior = p;
}
void printDul(DulList &T){
DulNode *p;
printf("\n当前双链表为:");
for(p = T->next;p!=NULL;p = p->next){
printf("%d ",p->data);
}
}
int eqhuiwen(DulList &T){
DulNode *p1,*p2;
p1 = T->next;
p2 = T;
while(p2->next!=NULL){
p2 = p2->next;
}
while(p2->prior!=p1){
if(p1->data!=p2->data){
return 0;
}
p1 = p1->next;
p2 = p2->prior;
}
return 1;
}
以下为完整代码:
#include<stdlib.h>
#include<stdio.h>
typedef struct DulNode{
int data;
struct DulNode *prior,*next;
}DulNode,*DulList;
void createDul(DulList &T);
void addDul(DulList &T,int key);
void deleteDul(DulList &T,int loc);
void exchangeDul(DulList &T,int loc1,int loc2);
void insertDul(DulList &T,int loc,int key);
void printDul(DulList &T);
int eqhuiwen(DulList &T);
void createDul(DulList &T){
T = (DulNode*)malloc(sizeof(DulNode));
T->next = NULL;
T->prior = NULL;
}
void addDul(DulList &T,int key){
DulNode *p,*s;
s = (DulNode *)malloc(sizeof(DulNode));
s->data = key;
for(p = T;p->next!=NULL;p=p->next){
}
p->next = s;
s->prior = p;
s->next = NULL;
}
void deleteDul(DulList &T,int loc){
DulNode *p;
int i;
p = T;
for(i = 1;i <= loc;i++){
p = p->next;
}
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
void exchangeDul(DulList &T,int loc1,int loc2){
DulNode *p1,*p2;
int i,temp;
p1 = p2 = T;
for(i = 1;i <= loc1 || i <= loc2;i++){
if(i <= loc1){
p1 = p1->next;
}
if(i <= loc2){
p2 = p2->next;
}
}
temp = p1->data;
p1->data = p2->data;
p2->data = temp;
}
void insertDul(DulList &T,int loc,int key){
DulNode *p,*s;
int i;
p = T;
for(i = 1;i < loc;i++){
p = p->next;
}
s = (DulNode *)malloc(sizeof(DulNode));
s->data = key;
s->next = p->next;
p->next->prior = s;
p->next = s;
s->prior = p;
}
void printDul(DulList &T){
DulNode *p;
printf("\n当前双链表为:");
for(p = T->next;p!=NULL;p = p->next){
printf("%d ",p->data);
}
}
int eqhuiwen(DulList &T){
DulNode *p1,*p2;
p1 = T->next;
p2 = T;
while(p2->next!=NULL){
p2 = p2->next;
}
while(p2->prior!=p1){
if(p1->data!=p2->data){
return 0;
}
p1 = p1->next;
p2 = p2->prior;
}
return 1;
}
int main(){
DulList T;
int num,i,key,loc,loc1;
createDul(T);
printf("请输入插入个数:");
scanf("%d",&num);
for(i = 1;i <= num;i++){
printf("第%d个:",i);
scanf("%d",&key);
addDul(T,key);
}
printDul(T);
printf("\n请输入要删除的数位置:");
scanf("%d",&loc);
deleteDul(T,loc);
printDul(T);
printf("\n请输入要交换的数位置:");
scanf("%d %d",&loc,&loc1);
exchangeDul(T,loc,loc1);
printDul(T);
printf("\n请输入要插入的位置和元素:");
scanf("%d %d",&loc,&key);
insertDul(T,loc,key);
printDul(T);
printf("\n是否为回文?");
if(eqhuiwen(T)){
printf("是");
}
else{
printf("否");
}
return 0;
}