当前位置:首页 » 编程语言 » 双链表c语言代码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

双链表c语言代码

发布时间: 2022-10-11 13:33:29

c语言关于双向链表的问题:下面是代码

truct student* insert(struct student *head,struct student *stu)
{
struct student *p1,*p2;
p1=NUll; p2=head;
while(p2!=NULL&&stu->num>p2->num){
p1=p2;
p2=p2->next;
}
if(p1==NULL) head=stu;
else p1->next=stu;
stu->next=p2;
retuen head;
}

前两天作为作业,我也编了一个学生动态链表,供你参考。程序在VC++2005上编译、运行通过,链表部分使用的是标准算法。

//by 兔弟蛇哥

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define NL printf("\n");
#define CLS system("CLS");
#define PAUSE system("PAUSE");
#define EMPTYLINE while(getchar()!='\n');

#define MAX_STDUENT_NUM 50 //当前允许的最大学生数以及允许的最大学号

struct student{
int number;
char name[50];
float mark[4]; //分别表示语文、数学、英语、总分
struct student *next;
};
struct student *Head;
int StudentNum;
struct student *Head_Orderly[4];

void GO(int);
void PrintStu(struct student *);
struct student* Creat(struct student*);
void SearchOrderly(int,struct student *,struct student **,struct student**);
int SeachStdNum(int,struct student *);
float InputNum(char *,int,int,char *);
int InputYN(void);
struct student* SearchStuByName(char [],struct student *);
struct student* SearchStuByNum(int,struct student *);
int DeleteByNum(int,struct student **);
int DeleteByName(char [],struct student **);
struct student *BeOrdered(struct student *,int);

void main()
{
Head=NULL;
StudentNum=0; //已输入的学生总数
int k,choice;
for(k=0;k<4;k++)
Head_Orderly[k]=NULL;

while(1){
printf("**********学生成绩动态链表示意程序**********\n\n");
printf("当前设定的最大学生数:%d\n",MAX_STDUENT_NUM);
printf("当前设定的学号范围:1-%d\n",MAX_STDUENT_NUM);
printf("1 输入新的学生数据\n");
printf("2 删除指定学生数据\n");
printf("3 查询学生成绩信息\n");
printf("0 退出\n");
NL NL

choice=(int)InputNum("请选择:",0,3,"int");
GO(choice);
}
}

void GO(int choice){

struct student *T,*p;
int number,choice2,choice3;
char name[50];
switch(choice){
case 0: exit(EXIT_SUCCESS);
case 1:
case 2: {NL NL
if(Head==NULL){
printf("很遗憾,链表中没有学生!\n");
return;
}

printf("1 按姓名\n");
printf("2 按学号\n");
printf("3 返回\n");
NL NL
choice2=(int)InputNum("请选择:",1,3,"int");
switch(choice2){
case 3: return;
case 1: {printf("请输入要删除的学生姓名:");
scanf("%s",name);
DeleteByName(name,&Head);
break;
}
case 2: {
number=(int)InputNum("请输入要删除的学生学号:",1,MAX_STDUENT_NUM,"int");
DeleteByNum(number,&Head);
break;
}
}
break;
}
case 3: {NL NL
if(Head==NULL){
printf("很遗憾,链表中没有学生!\n");
return;
}

printf("1 查询全部\n");
printf("2 按姓名查询\n");
printf("3 按学号查询\n");
printf("4 按语文分数排序\n");
printf("5 按数学分数排序\n");
printf("6 按英语分数排序\n");
printf("7 按总分分数排序\n");
printf("8 返回\n");
NL NL
choice3=(int)InputNum("请选择:",1,8,"int");
if(choice3==8) return;
if(choice3==1)
if(choice3==2){printf("请输入要查询的学生姓名:");
scanf("%s",name);
p=SearchStuByName(name,Head);

if(p==NULL)
printf("无此学生!\n\n");
else{
T=(struct student*)malloc(sizeof(struct student));
*T=*p;
T->next=NULL;
PrintStu(T);
}
return;
}
if(choice3==3){
number=(int)InputNum("请输入要查询的学生学号:",1,MAX_STDUENT_NUM,"int");
p=SearchStuByNum(number,Head);
if(p==NULL)
printf("无此学生!\n\n");
else{
T=(struct student*)malloc(sizeof(struct student));
*T=*p;
T->next=NULL;
PrintStu(T);
}
return;
}
Head_Orderly[choice3-4]=BeOrdered(Head,choice3-4);
PrintStu(Head_Orderly[choice3-4]);
return;
}
}
}

void PrintStu(struct student *head)
{
struct student *p;
int i=0;
p=head;
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
while(p!=NULL){
printf("%d\t%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n",++i,p->number,&p->name,p->mark[0],p->mark[1],p->mark[2],p->mark[3]);
p=p->next;
}
NL NL
PAUSE
NL NL
return;
}

struct student* Creat(struct student *head) //新建或插入链表
{
struct student *p,*u,*v; //p:新建表元指针;v,u:查询时的当前表元和前驱表元的指针
p=u=v=NULL;

/*创建新表元*/
while(1){
if(StudentNum==MAX_STDUENT_NUM){
printf("学生已输满!\n\n");
return head;
}

p=(struct student*)malloc(sizeof(struct student));
while(1){
p->number=(int)InputNum("学号:",1,MAX_STDUENT_NUM,"int");
if(head==NULL||SeachStdNum(p->number,head)==0) break;//检查学号是否重复(允许不顺序输入学号)
printf("学号重复!请重输:");
}

printf("请输入姓名:");
scanf("%s",p->name);
p->mark[0]=InputNum("语文成绩:",0,100,"float");
p->mark[1]=InputNum("数学成绩:",0,100,"float");
p->mark[2]=InputNum("英语成绩:",0,100,"float");
p->mark[3]=p->mark[0]+p->mark[1]+p->mark[2];
p->next=NULL;

/*按学号顺序插入新表元*/
if(head==NULL) head=p;
else{
SearchOrderly(p->number,head,&v,&u);
if(v==NULL) head=p;
else v->next=p;
p->next=u;
}
StudentNum++;
printf("添加成功!现有学生:%d人。\n",StudentNum);
printf("是否继续(Y/N)?");
if(InputYN()==0) return head;
}
}

void SearchOrderly(int num,struct student *head,struct student **v,struct student **u)
{
struct student *u1,*v1;
v1=NULL;
u1=head;
while(u1!=NULL&&num>u1->number){
v1=u1;
u1=u1->next;
}
*v=v1;
*u=u1;
return;
}

int SeachStdNum(int num,struct student *head)
{
struct student *p;
p=head;
while(p!=NULL&&p->number!=num)
p=p->next;
if(p==NULL) return 0;
else return 1;
}

float InputNum(char *string,int range_min,int range_max,char *mode)
{
char temp[10];
int i;
int err;
char mode1[]="int";
union{
int a;
float b;
}input;
for(;;){
err=0;
printf("%s",string);
scanf("%10s",temp);
EMPTYLINE
if(strlen(temp)>4) continue;
for(i=0;temp[i]!='\0';i++)
if((isdigit(temp[i])==0&&temp[i]!='.')||(isdigit(temp[i])==0&&strcmp(mode1,mode)==0)) err=1;
if(err) continue;
if(strcmp(mode1,mode)==0){
input.a=atoi(temp);
if(input.a>=range_min&&input.a<=range_max)
return (float)input.a;
}
else{
input.b=atof(temp);
if(input.b>=(float)range_min&&input.b<=(float)range_max)
return input.b;

}
}
}

int InputYN() //检查输入。(N(n)或Y(y))
{
char t[3];
while(1){
scanf("%2s",&t);
EMPTYLINE
if(t[1]) printf("输入的字符过多!");
else if(t[0]=='Y'||t[0]=='y') return 1;
else if(t[0]=='N'||t[0]=='n') return 0;
else printf("输入有误!");
NL
printf("请重新输入:");
}
}

struct student* SearchStuByName(char name[],struct student *head)
{
struct student *p;
p=head;
while(p!=NULL){
if(strcmp(name,p->name)==0) return p;
p=p->next;
}
return NULL;
}

struct student* SearchStuByNum(int Num,struct student *head)
{
struct student *p;
p=head;
while(p!=NULL){
if(p->number==Num) return p;
p=p->next;
}
return NULL;
}

int DeleteByNum(int Num,struct student **head)
{
struct student *v,*u;
u=v=NULL;
SearchOrderly(Num,*head,&v,&u);
if(u==NULL||u->number!=Num){
printf("找不到此学号的学生!删除失败。");
NL NL
return 1;
}
if(v==NULL) *head=u->next;
else v=u->next;
u->next=NULL;
free(u);
StudentNum--;
printf("删除成功!现在链表中共有%d位学生。",StudentNum);
NL NL
return 0;
}

int DeleteByName(char name[],struct student **head)
{
struct student *v,*u;
v=NULL;
u=*head;
while(u!=NULL&&strcmp(u->name,name)){
v=u;
u=u->next;
}
if(u==NULL){
printf("找不到此姓名的学生!删除失败。");
NL NL
return 1;
}
if(v==NULL) *head=u->next;
else v=u->next;
u->next=NULL;
free(u);
StudentNum--;
printf("删除成功!现在链表中共有%d位学生。",StudentNum);
NL NL
return 0;
}

struct student *BeOrdered(struct student *head,int mode)
{

struct student *newhead,*p,*newp,*u,*v,*u2;
int i;
p=head;
newhead=u=v=NULL;

while(p!=NULL){
newp=(struct student*)malloc(sizeof(struct student));
*newp=*p;
newp->next=NULL;

if(newhead==NULL) newhead=newp;
else{
v=NULL; u=newhead;
while(u!=NULL&&newp->mark[mode]<u->mark[mode]){
v=u;
u2=u;
u=u->next;
}
if(newp->mark[mode]==u2->mark[mode]){ //如果该科成绩相等,依次以语文、数学、英语的顺序排序
for(i=0;i<3;i++){
if(newp->mark[mode]>u->mark[mode]){
v=u;
u=u->next;
break;
}
}
}

if(v==NULL) newhead=newp;
else v->next=newp;
newp->next=u;
}
p=p->next;
}
return newhead;
}

Ⅱ C语言双向链表

#include "stdio.h"
#include "stdlib.h"
typedef int ElemType;//元素类型
typedef struct DuLNode
{//双向链表
ElemType data;
struct DuLNode *prior, *next;
}DuLNode,*DuLinkList;
int Create(DuLinkList &L)
{//建立双向链表
DuLinkList p,q;
ElemType n,i;
L = (DuLinkList) malloc (sizeof(DuLNode));
L->next = NULL;
q = L;
printf("输入数据个数:");
scanf("%d",&n);
printf("输入数据元素:");
for ( i = 0; i < n; i++)
{
p = (DuLinkList) malloc (sizeof(DuLNode));
scanf("%d",&p->data);//插入数据
p->prior = q;
q->next = p;
p->next = 0;
q = q->next;
}
return 1;
}
int Visit(DuLinkList &L)
{//遍历双向链表
DuLinkList p;
p = L->next;
printf("双向链表为:");
while (p)
{
printf("%4d",p->data);
p = p->next;
}
printf("\n");
return 1;
}
int Clear(DuLinkList &L)
{
DuLinkList p;
p = L->next;
while(p)
{
L->next = p->next;
free(p);
p = L->next;
}
return 1;
}
main()
{
int i,e,s,num;
char c='y';
DuLinkList L;
Create(L);
Visit(L);
while (c=='y')
{
printf("\n\n\n1.双向链表插入元素\n2.双向链表中删除元素\n");
printf("3.判断双向链表元素是否对称\n");
printf("4.双向链表中奇数排在偶数前面\n");
printf("5.建立递增链表并有序插入元素\n\n");
printf("选择需要的操作\n\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("输入插入元素位置以及元素:\n");
scanf("%d%d",&i,&e);
ListInsert(L, i, e);
Visit(L);
break;
case 2:
printf("输入删除元素位置:");
scanf("%d",&i);
Delete(L,i,s);
printf("删除的元素为:%d\n",s);
Visit(L);
break;
case 3:
if(Same(L)) printf("链表对称\n");
else printf("链表不对称\n");
break;
case 5:
printf("清空原链表,建立递增链表:\n");
XCreate(L);
Visit(L);
break;
case 4:
printf("奇数放在偶数前面:\n");
Jiou(L);
Visit(L);
break;
}
printf("继续操作(y/n):\n");
scanf("%s",&c);
}
}

Ⅲ 使用C语言实现双向链表的建立、删除和插入

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct list{
int data;
struct list *next;
struct list *pre;
};
typedef struct list node;
typedef node *link;
link front=NULL,rear,ptr,head=NULL;

link push(int item){
link newnode=(link)malloc(sizeof(node));
newnode->data=item;
if(head==NULL)
{
head=newnode;
head->next=NULL;
head->pre=NULL;
rear=head;
}
else
{
rear->next=newnode;
newnode->pre=rear;
newnode->next=NULL;
rear=newnode;
}
return head;
}

void makenull(){
front=NULL;
rear=NULL;
}

empty(){
if(front==NULL)
return 1;
else
return 0;
}

int tops(){
if(empty())
return NULL;
else
return rear->data;
}

void pop(){
if(empty())
printf("stack is empty!\n");
else
rear=rear->pre;
}

void display(link l){
link p;
p=l;
while(p!=NULL){
printf("%d->",p->data);
p=p->next;
}
}

void main(){
int n,i;
printf("input your first data!\n");
scanf("%d",&n);
front=push(n);
/*another data*/
for(i=0;i<3;i++)
{
printf("input:\n");
scanf("%d",&n);
push(n);
}
ptr=front;
display(ptr);
printf("\n Please enter any key to pop");
pop();
ptr=front;
display(ptr);

}

Ⅳ C语言求双链表操作

如果会单链表的话这个应该很简单的啊!就是在加上一些指针,
创建:void Insertl(Dulinklist P, int x)
{
s=new Dulnode;(c++方法来分配空间,如果是C的话改malloc)
s->data=x;
s->next=p->previous;p->previous->next=s;
s->next=p;p->previous=s;

}
删除:void Dell(Dulinklist p);
{
p->previous->next=p->next;
p->next->previous=p->previous;
free(p);
}
基本的算法就是这样的
剩下的你可以自己想想,
如果有问题的话可以把你写的发上来大家帮你改!

Ⅳ 谁能给我C语言双链表的源码

双链表??是带前向指针和后向指针的链表,还是十字链表?
下面是十字链表的代码

#include <stdio.h>
struct node{int row,col,val;
struct node *right,*down;
};
typedef struct node NODE;
NODE *a,*b,*c;

NODE *create_null_mat(m,n)
int m,n;
{NODE *h,*p,*q;
int k;
h=(NODE*)malloc(sizeof(NODE));
h->row=m;
h->col=n;
h->val=0;
h->right=h;
h->down=h;
p=h;
for(k=0;k<m;k++)
{q=(NODE*)malloc(sizeof(NODE));
q->col=1000;
q->right=q;
q->down=p->down;
p->down=q;
p=q;
}
p=h;
for(k=0;k<n;k++)
{q=(NODE*)malloc(sizeof(NODE));
q->row=1000;
q->down=q;
q->right=p->right;
p->right=q;
p=q;
}
return(h);
}

NODE *search_row_last(a,i)
NODE *a;
int i;
{ NODE *p, *h;
int k;
p=a ;
for (k=0; k<=i; k ++) p=p->down;
h=p;
while (p->right!=h) p=p->right;
return (p);
}

NODE *search_col_last(a,j)
NODE *a;
int j;
{ NODE *p, *h;
int k;
p=a;
for (k=0; k<=j; k++) p=p->right;
h=p;
while (p->down !=h) p=p->down;
return (p);
}

void insert_node(a,row,col,value)
NODE *a;
int row,col,value;
{ NODE * p, * q, * r;
p=search_row_last (a, row );
q=search_col_last(a,col);
r=(NODE * )malloc(sizeof(NODE));
r->row=row;
r->col=col;
r->val=value;
r->right=p->right;
p->right=r;
r->down=q->down;
q->down=r;
a->val++;
}

NODE *create_mat()
{ int m,n,t,i,j,k,v;
NODE *h;
printf ("Input 3 --tuples:\n");
printf("%3d:",0);
scanf("%d,%d,%d",&m,&n,&t);
h=create_null_mat(m,n);
for (k=1;k<=t;k++ )
{ printf("%3d:",k);
scanf("%d,%d,%d",&i,&j,&v);
insert_node(h,i,j,v);
}
return (h);
}

NODE *mat_add(a,b)
NODE *a,*b;
{ NODE *c,*p,*q,*u,*v;
c=create_null_mat(a->row,a->col);
p=a->down;
u=b->down;while (p!=a)
{ q=p->right;
v=u->right;
while (q!=p||v!=u)
{ if (q->col==v->col)
{ if(q->val+v->val!=0)
insert_node(c,q->row,q->col,q->val+v->val);
q=q->right;
v=v->right;
}
else
if (q->col<v->col)
{ insert_node(c,q->row,q->col,q->val );
q=q->right;
}
else
{ insert_node(c,v->row,v->col,v->val );
v=v->right;
}
}
p=p->down;
u=u->down;
}
return(c);
}

#include<stdio.h>
#include<malloc.h>
#define smax 45
typedef int datatype;
typedef struct lnode //结构体和共用体的定义
{
int i,j;
struct lnode *cptr,*rptr;
union
{
struct lnode *next;
datatype v;
}uval;
}link;
int flag=0;
//建立稀疏矩阵的函数,返回十字链表头指针
link *creatlinkmat()
{
link *p,*q,*head,*cp[smax];
int i,j,k,m,n,t,s;
datatype v;
printf("输入行、列,非零元素个数(m,n,t数字间用逗号分隔)");
scanf("%d,%d,%d",&m,&n,&t);//输入行、列,非零元素个数
if(m>n)s=m; else s=n;
head=(link *)malloc(sizeof(link)); //建立十字链表头结点
head->i=m;head->j=n;
cp[0]=head; //cp[]是指针数组,分别指向头结点和行、列表头结点
for(i=1;i<=s;i++) //建立头结点循环链表
{
p=(link *)malloc(sizeof(link));
p->i=0;p->j=0;
p->rptr=p;p->cptr=p;
cp[i]=p; cp[i-1]->uval.next=p;
}
cp[s]->uval.next=head;
for(k=1;k<=t;k++)
{
printf("\t 第%d个元素(行号i 列号j 值v,数字间用空格分隔):",k);
scanf("%d%d%d",&i,&j,&v);
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j<j))
q=q->rptr;
p->rptr=q->rptr;
q->rptr=p;
q=cp[j];
while((q->cptr!=cp[j])&&(q->cptr->i<i))
q=q->cptr;
p->cptr=q->cptr;
q->cptr=p;
}
return head;
}
//插入结点函数
void insert(int i,int j,int v,link *cp[])
{
link *p,*q;
p=(link *)malloc(sizeof(link));
p->i=i;p->j=j;p->uval.v=v;
//以下是经*p结点插入第i行链表中
q=cp[i];
while((q->rptr!=cp[i])&&(q->rptr->j<j))
q=q->rptr;//在第i行中找第一个列号大于j的结点*(q->rptr)
//找不到时,*q是该行表上的尾结点
p->rptr=q->rptr;
q->rptr=p;//*p插入在*q之后
//以下是将结点插入第j列链表中
q=cp[j];//取第j列表头结点
while((q->cptr!=cp[j])&&(q->cptr->i<i))
q=q->cptr ;//在第j行中找第一个列号大于i的结点*(q->cptr)
//找不到时,*q是该行表上的尾结点
p->cptr=q->cptr;
q->cptr=p;//*p插入在*q之后
}
//输出十字链表的函数
void print(link *a)
{
link *p,*q,*r;//p是控制行q是控制列r是控制输出的格式
int k,col,t,row;
col=a->j;//矩阵a的列数
printf("矩阵为:\n");
p=a->uval.next;//p指向第一个结点(不是头结点)
while(p!=a)
{
q=p->rptr;//p指向这以一行的一个值
if(q==a->cptr)break;//如果行或列处理完了,跳出
r=p;//r指向这一行的头结点
while(q!=p)
{
for(k=1;k<q->j-(r->j);k++)//输出同一行上两非零数据间的零
printf(" 0");
printf("%3d",q->uval.v);//输出那个非零值
q=q->rptr;//q指向这一行的下一个元素
r=r->rptr;//r指向q前面的一个非零元素
}
k=r->j;//k的值是某一行的最后一个非零元的列数
for(t=k;t<col;t++)//输出一行上最后一个非零元后面的零
printf(" 0");
printf("\n");
p=p->uval.next;//p指向下一行
}
}
link *add(link *a,link *b)
{
link *p,*q,*u,*v,*r,*cp[smax],*c;//p,q控制十字链a的行列,u,v控制十字链b的行列
int s,i;
if(a->i!=b->i||a->j!=b->j)

//建立c的表头环链
c=(link *)malloc(sizeof(link));
c->i=a->i;c->j=a->j;
if(c->i>c->j)s=c->i; else s=c->j;
cp[0]=c;
for(i=1;i<=s;i++)
{
r=(link *)malloc(sizeof(link));
r->i=0;r->j=0;
r->rptr=r;r->cptr=r;
cp[i]=r;
cp[i-1]->uval.next=r;
}
cp[s]->uval.next =c;
//矩阵相加
p=a->uval.next;u=b->uval.next;
while(p!=a&&u!=b)
{
q=p->rptr;v=u->rptr;
if(q==p&&v!=u)//矩阵a中第p行为空,矩阵b的第u行不为空
while(v!=u)//将b的行的都复制到和矩阵中

else if(v==u&&q!=p)//矩阵a中第p行不为空,矩阵b的第u行为空
while(q!=p)

else if(q!=p&&v!=u)//矩阵b的第u行和矩阵a的第p行都不为空
{
while(q!=p&&v!=u)
{
if(q->j<v->j)//如果a中有元素的列数小于b的,将a中的所有小于b的值都插到c中

else if(q->j>v->j)//如果b中有元素的列数小于a的,将a中的所有小于b的值都插到c中

else//a、b当前是在同一个位置,判断加的和是否为零,不为零才做加法运算
{if(q->uval.v+v->uval.v!=0)insert(q->i,q->j,(q->uval.v+v->uval.v),cp);
q=q->rptr;v=v->rptr;
}
}
if(q==p&&v!=u)//如果b未处理完,将b中未处理的值都插入到和矩阵中
while(v!=u)

else if(v==u&&q!=p)//如果a未处理完,将a中未处理的值都插入到和矩阵中
while(q!=p)

else; //都处理完了,什么都不做
}
else ; //矩阵b的第u行和矩阵a的第p行都为空,什么都不做

p=p->uval.next;u=u->uval.next;//a、b都指向下一行
}
return c;
}
//
void main()
{
link *a,*b,*c;
a=creatlinkmat();print(a);
b=creatlinkmat();print(b);
c=add(a,b);
if(flag==1)printf("矩阵a、b不能相加!!");
else printf("和矩阵c为:\n");print(c);
}

测试用例:

输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,4
第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 1
第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 1
第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 1
第4个元素(行号i 列号j 值v,数字间用空格分隔):2 2 1
矩阵为:
1 1
1 1
输入行、列,非零元素个数(m,n,t数字间用逗号分隔)2,2,3
第1个元素(行号i 列号j 值v,数字间用空格分隔):1 1 5
第2个元素(行号i 列号j 值v,数字间用空格分隔):1 2 5
第3个元素(行号i 列号j 值v,数字间用空格分隔):2 1 5
矩阵为:
5 5
5 0
和矩阵c为:
矩阵为:
6 6
6 1
请按任意键继续. . .

Ⅵ 怎样用c语言实现一个双向链表

双向链表的相关操作
实现功能:
1.
创建一个新链表。
2.
插入节点。
3.
删除节点。
4.
选择法排序链表(从小到大)。
5.
显示当前链表。
6.
退出程序
详细代码见参考资料

Ⅶ C语言、双向链表

#include <stdio.h>
#include <string.h>
struct person
{
char name[10];
int number;
person *next;
person *last;
};person *p,*q,*start=NULL,*end;void insert(int num,char nam[10])//插入函数,按姓名的首字母顺序插入链表中的。
{
q=new person;
if (start==NULL) //判断start是否为空 若空则新建
{
start=q;
end=q;
p=q;
start->last=NULL;
end->next=NULL;
}
else
{

if(strcmp(nam,start->name)<=0)//插入链表头
{
start->last=q;
q->next=start;
q->last=NULL;
start=q;
}
else if (strcmp(nam,end->name)>0) //插入表尾部
{
end->next=q;
q->last=end;
end=q;
q->next=NULL;
}
else if (strcmp(nam,end->name)<0&&strcmp(nam,start->name)>0)//插入链表中
{
for (p=start;strcmp(nam,p->name)>0;p=p->next);
q->next=p;
p->last=q;
for (p=start;p->next!=q->next;p=p->next);
p->next=q;
q->last=p;
}

}
strcpy(q->name,nam);
q->number=num;

}
void find(int num) //按编号查找
{
if(start==NULL)
{
printf("无记录\n");
}
else
{
for(p=start;p!=NULL&&p->number!=num;p=p->next);
if(p==NULL)
{
printf("不存在的编号!\n");

}
else if (p->number==num)
{
printf("您查找的编号是:%d\n",num);
printf("该生的姓名为:%s",p->name);
}

}
} void del(int num) //按编号删除
{
for(p=start;p->number!=num;p=p->next);
if (p->number==num)
{
if (p->next==NULL)
{
if(p->last==NULL)
{
start=NULL;

}
else
{
(p->last)->next=NULL;
}
delete p;
}
else if (p->last==NULL)
{
(p->next)->last=NULL;
start = p->next;
delete p;
}
else if(p->last!=NULL&&p->next!=NULL)
{
(p->last)->next=p->next;
(p->next)->last=p->last;
delete p;
}
}

else
{
printf("不存在的编号!\n");
}

}void show()
{
printf("学号\t姓名\n");
for (p=start;;p=p->next)
{
printf("%d\t%s\n",p->number,p->name);
if (p->next==NULL)
break;
}
}void main()
{
int i,num;
char nam[10];
printf("输入三位学生信息(学号,姓名):");
for(i=0;i<3;i++)
{
scanf("%d%s",&num,nam);
insert(num,nam);
}
show();

printf("输入要删除的学生的学号:");
scanf("%d",&num);
del(num);
show();
printf("输入要查找的学生的学号:");
scanf("%d",&num);
find(num);
//show();
}

Ⅷ 数据结构双向循环链表的C语言实现(插入,查询,删除),代码如下:

#include<stdio.h>
#include<malloc.h>

typedefintElemtype;

typedefstructdNode{
Elemtypedata;/*数据域*/
structdNode*prior;/*指向前驱结点的指针域*/
structdNode*next;/*指向后继结点的指针域*/
}*pDLink,*DLinkList;

DLinkListGetEmptyDLink(){//初始化
DLinkListhead=(pDLink)malloc(sizeof(structdNode));
head->data=0;
head->prior=head;
head->next=head;
returnhead;
}

voidDLink_create(DLinkListhead,intn){/*双向循环链表建立函数*/
inti;
pDLinkp,r;
p=r=head;
for(i=0;i<n;i++){
p->next=(pDLink)malloc(sizeof(structdNode));/*为一个新结点分配空间*/
scanf("%d",&p->next->data);/*从键盘输入值,并保存在新结点数据域中*/
p=p->next;//p指向新结点
p->prior=r;//新结点的prior指向上一个结点
r=r->next;//上一个结点前进到新结点
}
p->next=head;//指向头结点
head->prior=p;//head的prior指向最后的结点
}

voidShow(DLinkListhead){//正向显示链表数据
pDLinkp=head->next;
while(p!=head){
printf("%d",p->data);
p=p->next;
}
printf(" ");
}

voidShowR(DLinkListhead){//反向显示数据
pDLinkp=head->prior;
while(p!=head){
printf("%d",p->data);
p=p->prior;
}
printf(" ");
}

intmain(){
DLinkListhead=GetEmptyDLink();
DLink_create(head,10);
printf("正向显示: ");
Show(head);
printf("反向显示: ");
ShowR(head);
return0;
}