在vim中用C语言写一个单链表,C语言 链表-philip_cheng-ChinaUnix博客

单向链表

#include#include#include

#define len sizeof(struct student)

struct student

{

char name[10];

int age;

struct student *next;

};

struct student *creat(struct student *head)

{

int n,m;

struct student *p1,*p2;

printf("Enter number of note:");

scanf("%d",&n);

m=n;

do

{

p1=(struct student *)malloc(len);

printf("please enter one student's name and age:\n");

scanf("%s%d",p1->name,&p1->age);

if(m==n){

head->next=p1;

p2=p1;

}

else{

p2->next=p1;

p2=p1;

}

}while(--n);

p2->next=NULL;

return head;

}

struct student *print_list(struct student *head)

{

struct student *p1;

if(head->next==NULL){

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

p1=head->next;

while(p1!=NULL){

printf("%s %d\n",p1->name,p1->age);

p1=p1->next;

}

}

return head;

}

struct student *add_list(struct student *head)

{

struct student *new_note,*p1;

int x,n=0;

new_note=(struct student *)malloc(len);

printf("please enter one student's name and age:\n");

scanf("%s%d",new_note->name,&new_note->age);

p1=head->next;

while(p1!=NULL){

n++;

p1=p1->next;

}

printf("You have %d place to add a new note(1 to %d):",n+1,n+1);

scanf("%d",&x);

if(x<=0||x>(n+1)){

printf("enter error\n");

return head;

}

p1=head;

while((--x) && (p1=p1->next));

new_note->next=p1->next;

p1->next=new_note;

return head;

}

struct student *delete_list(struct student *head)

{

char name[20];

struct student *p1,*p2;

int flag;

if(head->next==NULL){

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

p1=head;

p2=head->next;

printf("Who you want to delete:\n");

scanf("%s",name);

while((p2!=NULL) && strcmp(name,p2->name)){

p2=p2->next;

p1=p1->next;

}

if(p2!=NULL){

p1->next=p2->next;

free(p2);

}

}

return head;

}

struct student *invert(struct student *head)

{

struct student *p1,*p2,*p3,*temp;

if(head->next==NULL)

{

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

temp=p1=head->next;

p2=p3=p1->next;

while(p3!=NULL){

p3=p3->next;

p2->next=p1;

p1=p2;

p2=p3;

}

temp->next=NULL;

head->next=p1;

}

return head;

}

struct student *clear(struct student *head)

{

struct student *p1,*p2;

if(head->next==NULL)

{

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

p1=p2=head->next;

while(p1!=NULL){

p1=p1->next;

free(p2);

p2=p1;

}

}

head->next=NULL;

return head;

}

int main()

{

struct student *head;

int choose;

head=(struct student *)malloc(len);

head->next=NULL;

while(1){

printf("1:Creat a new list\n");

printf("2:Print the list\n");

printf("3:Add a note to the list\n");

printf("4:Delete a note from the list\n");

printf("5:Invert the list\n");

printf("6:Clear the list\n");

printf("7:Exit\n");

printf("\nPlease choose one choice:");

scanf("%d",&choose);

switch(choose){

case 1:

printf("\n---------------creat a new list:-------------\n");

head=creat(head);

printf("\n");

break;

case 2:

printf("\n---------------print list:-------------------\n");

head=print_list(head);

printf("\n");

break;

case 3:

printf("\n---------------add a new note:-----------------\n");

head=add_list(head);

printf("\n");

break;

case 4:

printf("\n---------------delete a note:------------------\n");

head=delete_list(head);

printf("\n");

break;

case 5:

printf("\n---------------invert the list-----------------\n");

head=invert(head);

printf("\n");

break;

case 6:

printf("\n--------------clear the list-----------------\n");

head=clear(head);

printf("\n");

break;

case 7:

exit(0);

default:

printf("Enter error\n");

}

}

return 0;

}

双向链表

#include#include#include

#define len sizeof(struct student)

struct student

{

char name[10];

int age;

struct student *next;

struct student *pre;

};

struct student *creat(struct student *head)

{

int n,m;

struct student *p1,*p2;

printf("Enter number of note:");

scanf("%d",&n);

m=n;

do

{

p1=(struct student *)malloc(len);

printf("please enter one student's name and age:\n");

scanf("%s%d",p1->name,&p1->age);

if(m==n){

head->next=p1;

p1->pre=head;

p2=p1;

}

else{

p2->next=p1;

p1->pre=p2;

p2=p1;

}

}while(--n);

p2->next=NULL;

return head;

}

struct student *print_list(struct student *head)

{

struct student *p1,*p2;

if(head->next==NULL){

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

p2=head;

p1=head->next;

printf("Positive print the list\n");

while(p1!=NULL){

printf("%s %d\n",p1->name,p1->age);

p1=p1->next;

p2=p2->next;

}

printf("Reverse print the list\n");

while(p2!=head){

printf("%s %d\n",p2->name,p2->age);

p2=p2->pre;

}

}

return head;

}

struct student *add_list(struct student *head)

{

struct student *new_note,*p1;

int x,n=0;

new_note=(struct student *)malloc(len);

printf("please enter one student's name and age:\n");

scanf("%s%d",new_note->name,&new_note->age);

p1=head->next;

while(p1!=NULL){

n++;

p1=p1->next;

}

printf("You have %d place to add a new note(1 to %d):",n+1,n+1);

scanf("%d",&x);

p1=head;

if(x==(n+1)){

while((p1->next!=NULL) && (p1=p1->next));

p1->next=new_note;

new_note->pre=p1;

new_note->next=NULL;

}

else{

while((--x) && (p1!=NULL) && (p1=p1->next));

new_note->next=p1->next;

p1->next->pre=new_note;

p1->next=new_note;

new_note->pre=p1;

}

return head;

}

struct student *delete_list(struct student *head)

{

char name[20];

struct student *p1,*p2;

int flag;

if(head->next==NULL){

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

p1=head;

p2=head->next;

printf("Who you want to delete:\n");

scanf("%s",name);

while((p2!=NULL) && strcmp(name,p2->name)){

p2=p2->next;

p1=p1->next;

}

if(p2!=NULL && p2->next!=NULL){

p2->next->pre=p1;

p1->next=p2->next;

}

if(p2!=NULL && p2->next==NULL){

p1->next=NULL;

}

free(p2);

}

return head;

}

struct student *invert(struct student *head)

{

struct student *p1,*p2,*p3,*temp;

if(head->next==NULL)

{

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

temp=p1=head->next;

p2=p3=p1->next;

while(p3!=NULL){

p3=p3->next;

p2->next=p1;

p1->pre=p2;

p1=p2;

p2=p3;

}

temp->next=NULL;

head->next=p1;

p1->pre=head;

}

return head;

}

struct student *clear(struct student *head)

{

struct student *p1,*p2;

if(head->next==NULL)

{

printf("you have not creat a list!!!!!!!!!!!!!!!\n");

}

else{

p1=p2=head->next;

while(p1!=NULL){

p1=p1->next;

free(p2);

p2=p1;

}

}

head->next=NULL;

return head;

}

int main()

{

struct student *head;

int choose;

head=(struct student *)malloc(len);

head->next=NULL;

head->pre=NULL;

while(1){

printf("1:Creat a new list\n");

printf("2:Print the list\n");

printf("3:Add a note to the list\n");

printf("4:Delete a note from the list\n");

printf("5:Invert the list\n");

printf("6:Clear the list\n");

printf("7:Exit\n");

printf("\nPlease choose one choice:");

scanf("%d",&choose);

switch(choose){

case 1:

printf("\n---------------creat a new list:-------------\n");

head=creat(head);

printf("\n");

break;

case 2:

printf("\n---------------print list:-------------------\n");

head=print_list(head);

printf("\n");

break;

case 3:

printf("\n---------------add a new note:-----------------\n");

head=add_list(head);

printf("\n");

break;

case 4:

printf("\n---------------delete a note:------------------\n");

head=delete_list(head);

printf("\n");

break;

case 5:

printf("\n---------------invert the list-----------------\n");

head=invert(head);

printf("\n");

break;

case 6:

printf("\n--------------clear the list-----------------\n");

head=clear(head);

printf("\n");

break;

case 7:

exit(0);

default:

printf("Enter error\n");

}

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值