结构体(带头结点的单链表).docVIP

  • 11
  • 0
  • 约2.17千字
  • 约 3页
  • 2017-08-09 发布于重庆
  • 举报
结构体(带头结点的单链表).doc

//带头结点的单链表.cpp #define NULL 0 struct student {char sno[6]; //学号域5个字符 char name[9]; //姓名域4个汉字 struct student *next; //指针域 }; typedef struct student st; #include stdlib.h #include stdio.h #include string.h st *createlink() {//尾插法建立带头结点的动态单链表,返回头指针。 st *head,*p,*r; r=head=(st *)malloc(sizeof(st)); //生成头结点 p=(st *)malloc(sizeof(st)); //分配新结点 printf(学号:); gets(p-sno); printf(姓名:); gets(p-name); while (strcmp(p-sno,#)!=0)//当学号为字符串#时结束循环 {r-next=p; //新结点链入表尾 r=p; //表尾指针后移 p=(st *)malloc(sizeof(st)); //分配新结点 printf(学号:); gets(p-sno); printf(姓名:); gets(p-name); } r-next=NULL; //最后结点指针域为空 free(p); //释放最后输入学号为#的结点 return head; } void outlink(st *head) {//输出以head为头指针的单链表 st *p; if (!head-next) {printf(Empty LinkList.\n); exit(0);} p=head-next; while (p!=NULL) {printf(%s %s\n,p-sno,p-name); p=p-next; } } void insertNode(st *head, st *s) {//在以head为头指针且按学号升序排列的单链表中插入指针s所指向的结点仍按升序排列 //返回插入结点后新链表头指针 st *p1,*p2; p1=head-next; p2=head; while (p1!=NULLstrcmp(p1-sno,s-sno)0) {p2=p1; p1=p1-next;} //寻找插入位置 p2-next=s; s-next=p1; return; } void deleteNode(st *head,char *s) {//在以head为头指针的单链表中删除给定学号s所在的结点 st *p1,*p2; if (!head-next) {printf(Empty LinkList.\n); exit(0);} p1=head-next; p2=head; while (p1!=NULLstrcmp(p1-sno,s)!=0) {p2=p1; p1=p1-next;} //p1指向要删除的结点,p2指向要删结点的前一结点 if (p1==NULL) printf(链表中无所删结点!\n); else {p2-next=p1-next; free(p1); } //删除p1所指结点 } void main() {st *head,*s; char no[6]; char c; while (1) {printf(1.建立链表\n); printf(2.显示链表\n); printf(3.插入结点\n); printf(4.删除结点\n); printf(0.结 束\n); printf(请输入0--4:); c=getchar(); getchar(); switch (c) {case 0: return; case 1: head=createlink(); break; case 2: outlink(head); break; case 3: s=(st *)malloc(sizeof(st)); printf(输入要插入的节点:\n); printf(学号:); gets(s-sno); printf(姓名:); gets(s-name); insertNode(head,s); break; case 4: printf(输入要删除的学号:\n); printf(学号:);

文档评论(0)

1亿VIP精品文档

相关文档