Ⅰ 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;
}