双向链表代码:
head.h
#ifndef __HEAD3_H__
#define __HEAD3_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct double_list {
union {
int len;
int data;
};
struct double_list *next;
struct double_list *prev;
}*double_list_t;
void menue();
double_list_t get_space(int flag);
int insert_head(double_list_t L,int n);
int output(double_list_t L);
int delete_pos(double_list_t L,int pos);
int modify_pos(double_list_t L,int pos);
int find_pos(double_list_t L,int pos);
#endif
head.c
#include "head3.h"
//创建菜单
void menue(){
puts("1,头插");
puts("2,输出");
puts("3,按位置删除");
puts("4,按位置修改");
puts("5,按位置查找");
}
//创建结点
double_list_t get_space(int flag){
double_list_t L=(double_list_t)malloc(sizeof(struct double_list));
if(NULL==L){
return NULL;
}
if(1==flag){
L->len=0;
L->next=NULL;
L->prev=NULL;
}else if(0==flag){
L->next=NULL;
L->prev=NULL;
}
return L;
}
//头插
int insert_head(double_list_t L,int n){
if(NULL==L){
printf("表不存在\n");
return -1;
}
int i;
for(i=0;i<n;i++){
double_list_t new=get_space(0);
new->next=L->next;
new->prev=L;
if(L->next!=NULL){
L->next->prev=new;
}
L->next=new;
int value;
printf("请输入插入的值:");
scanf("%d", &value);
new->data=value;
L->len++;
}
printf("插入完成\n");
return 0;
}
//输出
int output(double_list_t L){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==NULL){
printf("表为空\n");
return -1;
}
double_list_t temp=L;
while(temp->next!=NULL){
temp=temp->next;
printf("%d\t", temp->data);
}
puts("");
return 0;
}
//按位置删除
int delete_pos(double_list_t L,int pos){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==NULL){
printf("表为空\n");
return -1;
}
if(pos<1||pos>L->len+1){
printf("位置输入错误\n");
return -1;
}
double_list_t temp=L;
int i;
for(i=0;i<pos-1;i++){
temp=temp->next;
}
double_list_t temp1=temp->next;
temp->next=temp1->next;
if(temp1->next!=NULL){
temp1->next->prev=temp;
}
free(temp1);
temp1=NULL;
L->len--;
return 0;
}
//按位置修改
int modify_pos(double_list_t L,int pos){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==NULL){
printf("表为空\n");
return -1;
}
if(pos<1||pos>L->len){
printf("位置输入错误\n");
return -1;
}
double_list_t temp=L;
int i;
for(i=0;i<pos;i++){
temp=temp->next;
}
int value;
printf("请输入修改的值:");
scanf("%d", &value);
temp->data=value;
printf("修改成功\n");
return 0;
}
//按位置查找
int find_pos(double_list_t L,int pos){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==NULL){
printf("表为空\n");
return -1;
}
if(pos<1||pos>L->len){
printf("位置输入错误\n");
return -1;
}
double_list_t temp=L;
int i;
for(i=0;i<pos;i++){
temp=temp->next;
}
printf("查找的值为:%d\n", temp->data);
return 0;
}
main.c
#include "head3.h"
int main(int argc, const char *argv[])
{
menue();
//创建头结点
double_list_t L=get_space(1);
int number;
while(1){
printf("请输入选项:");
scanf("%d", &number);
switch(number){
case 1://头插
{
int n;
printf("请输入插入的个数:");
scanf("%d", &n);
insert_head(L,n);
}break;
case 2://输出
{
output(L);
}break;
case 3:
{
int pos;
printf("请输入删除的位置:");
scanf("%d", &pos);
delete_pos(L,pos);
}break;
case 4:
{
int pos;
printf("请输入修改的位置:");
scanf("%d", &pos);
modify_pos(L,pos);
}break;
case 5:
{
int pos;
printf("请输入查找的位置:");
scanf("%d", &pos);
find_pos(L,pos);
}break;
default:printf("输入错误,请重新输入\n");break;
case 0:printf("退出程序\n");exit(0);
}
}
return 0;
}
双向循环链表代码:
head.h
#ifndef __HEAD2_H__
#define __HEAD2_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct doublerun_list {
union {
int len;
int data;
};
struct doublerun_list *next;
struct doublerun_list *prev;
}*doublerun_list_t;
void menue();
doublerun_list_t get_space(int flag);
int insert_head(doublerun_list_t L,int n);
int output(doublerun_list_t L);
int delete_head(doublerun_list_t L);
int insert_rear(doublerun_list_t L,int n);
int delete_rear(doublerun_list_t L);
#endif
head.c
#include "head2.h"
//创建菜单
void menue(){
puts("1,头插");
puts("2,输出");
puts("3,头删");
puts("4,尾插");
puts("5,尾删");
}
//创建结点
doublerun_list_t get_space(int flag){
doublerun_list_t L=(doublerun_list_t)malloc(sizeof(struct doublerun_list));
if(NULL==L){
return NULL;
}
if(1==flag){
L->len=0;
L->next=L;
L->prev=L;
}else if(0==flag){
L->next=NULL;
L->prev=NULL;
}
return L;
}
//头插
int insert_head(doublerun_list_t L,int n){
if(NULL==L){
printf("表不存在\n");
return -1;
}
int i;
for(i=0;i<n;i++){
doublerun_list_t new=get_space(0);
if(NULL==new){
printf("创建结点失败\n");
return -1;
}
new->next=L->next;
new->prev=L;
if(L->next!=L){
L->next->prev=new;
}
L->next=new;
int value;
printf("请输入插入的值:");
scanf("%d", &value);
new->data=value;
L->len++;
}
printf("插入完成\n");
return 0;
}
//输出
int output(doublerun_list_t L){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==L){
printf("表为空\n");
return -1;
}
doublerun_list_t temp=L;
while(temp->next!=L){
temp=temp->next;
printf("%d\t", temp->data);
}
puts("");
return 0;
}
//头删
int delete_head(doublerun_list_t L){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==L){
printf("表为空\n");
return -1;
}
doublerun_list_t temp=L->next;
L->next=temp->next;
temp->next->prev=L;
L->len--;
return 0;
}
//尾插
int insert_rear(doublerun_list_t L,int n){
if(NULL==L){
printf("表不存在\n");
return -1;
}
doublerun_list_t temp=L;
int i;
for(i=0;i<n;i++){
while(temp->next!=L){
temp=temp->next;
}
doublerun_list_t new=get_space(0);
new->next=L;
new->prev=temp;
temp->next=new;
L->prev=new;
int value;
printf("请输入插入的值:");
scanf("%d", &value);
new->data=value;
L->len++;
}
return 0;
}
//尾删
int delete_rear(doublerun_list_t L){
if(NULL==L){
printf("表不存在\n");
return -1;
}
if(L->next==L){
printf("表为空\n");
return -1;
}
doublerun_list_t temp=L;
while(temp->next->next!=L){
temp=temp->next;
}
doublerun_list_t temp1=temp->next;
temp->next=L;
L->prev=temp;
free(temp1);
temp1=NULL;
L->len--;
printf("删除成功\n");
return 0;
}
main.c
int main(int argc, const char *argv[])
{
//创建头结点
doublerun_list_t L=get_space(1);
menue();
int number;
while(1){
printf("请输入选项:");
scanf("%d", &number);
switch(number){
case 1://头插
{
int n;
printf("请输入插入的个数:");
scanf("%d", &n);
insert_head(L,n);
}break;
case 2:
{//输出
output(L);
}break;
case 3:
{//头删
int n,i;
printf("请输入删除的个数:");
scanf("%d", &n);
for(i=0;i<n;i++){
delete_head(L);
}
printf("删除成功\n");
}break;
case 4://尾插
{
int n;
printf("请输入插入的个数");
scanf("%d", &n);
insert_rear(L,n);
}break;
case 5:
{
delete_rear(L);
}break;
default:printf("输入错误,请重新输入\n");break;
case 0:printf("退出程序\n");exit(0);
}
}
return 0;
}