设为首页 加入收藏

TOP

C语言之双向链表
2015-02-02 14:26:48 来源: 作者: 【 】 浏览:6
Tags:语言 双向

1,双向链表简介。


双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。


2,例子要求:


完成双向链表的插入、删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存。


3,代码实现。


#include
#include
#include
#include



typedef struct Student{
? ? char name[20];
? ? int score;
? ? char phoneNum[14];
} str_student;



typedef struct Node{
? ? str_student data;
? ? struct Node *prior;? ? ? ? //指向前驱结点
? ? struct Node *next;? ? ? ? ? //指向后继结点
}Node, *DLinkList;



// 初始化一个学生链表
DLinkList initDouLinkList()
{
? ? Node *L,*p,*r;
? ? char name[20];
? ? char phone[14];
? ? int score;
? ? L = (Node *)malloc(sizeof(Node));
? ? L->next = NULL;
? ? r = L;
? ? r->next = NULL;



? ? while(1)
? ? {
? ? ? ? p = (Node *)malloc(sizeof(Node));
? ? ? ? printf("input name is out exit,input student name:\n");
? ? ? ? scanf("%s",name);
? ? ? ? if (strcmp(name,"out")==0)
? ? ? ? {
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? strcpy(p->data.name, name);
? ? ? ? printf("input student score:");
? ? ? ? scanf("%d",&score);
? ? ? ? p->data.score = score;
? ? ? ? printf("input student phone:");
? ? ? ? scanf("%s",phone);
? ? ? ? strcpy(p->data.phoneNum, phone);



? ? ? ? p->next = r->next;
? ? ? ? r->next = p;
? ? ? ? r = p;



? ? }
? ? r->next = NULL;
? ? return L;
}



//添加学生信息
DLinkList insertDouLinkListStuent(DLinkList L,int i,char *name, int score,char *phonenum)
{
? ? DLinkList p,s;
? ? p = L->next;
? ? int tempi;
? ? for(tempi = 1;tempi < i-1; tempi++)
? ? ? ? p = p->next;
? ? s = (Node *)malloc(sizeof(Node));
? ? s->data.score = score;
? ? strcpy(s->data.name,name);
? ? strcpy(s->data.phoneNum,phonenum);
? ? s->next = p->next;
? ? p->next->prior = s;
? ? s->prior = p;
? ? p->next = s;



? ? return L;
}



// 查找学生信息
int findDouLinkListStudent(DLinkList L,char *name)
{
? ? DLinkList p;
? ? p = L->next;
? ? int i = 1;



? ? while(p != NULL && (strcmp(p->data.name, name)!=0))
? ? {
? ? ? ? ++i;
? ? ? ? p = p->next;
? ? }
? ? if(p == NULL)
? ? ? ? return 0;
? ? else return i;
}



// 移除一个学生
DLinkList removeDouLinkListStudent(DLinkList L,char *name)
{
? ? int tempi = 1;
? ? DLinkList p;
? ? p = L->next;
? ? int i =findDouLinkListStudent(L,name);
? ? while((tempi++) != i && p != NULL)
? ? {
? ? ? ? p = p->next;
? ? }
? ? if(p == NULL)
? ? ? ? printf("no list \n");
? ? else if(p->next == NULL)
? ? {
? ? ? ? p->prior->next = NULL;
? ? ? ? free(p);
? ? }
? ? else
? ? {
? ? ? ? p->prior->next = p->next;
? ? ? ? p->next->prior = p->prior;
? ? ? ? free(p);
? ? }
? ? return L;
}



// 铺助打印信息
void printfInfo(DLinkList L)
{
? ? DLinkList p;
? ? p = L->next;
? ? while (p!=NULL)
? ? {
? ? ? ? printf("student name %s\n",p->data.name);
? ? ? ? printf("student name %d\n",p->data.score);
? ? ? ? printf("student name %s\n",p->data.phoneNum);
? ? ? ? p=p->next;
? ? }
}



void main ()
{
? ? char name2[20]="hanmeimei";
? ? char phone2[14]="13612345678";



? ? DLinkList L =initDouLinkList();
? ? // 2.1 初始化学生双向链表数据
? ? insertDouLinkListStuent(L,1,name2,99,phone2);
? ? printfInfo(L);



? ? // 2.2 查找学生zhangsan
? ? findDouLinkListStudent(L,'zhangsan');
? ? printfInfo(L);



? ? // 2.3 删除学生zhangsan
? ? removeDouLinkListStudent(L,'zhangsan');
? ? printfInfo(L);



? ? // 2.4 添加学生zengteng
? ? insertDouLinkListStuent(L,9,'zengteng',89,'13643345667');
? ? printfInfo(L);



}


?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言之单向链表 下一篇C语言之数组

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: