数据结构之链表
数据结构的第一章就是链表,链表是其他结构的基础,包括栈,树等等,链表由节点组成,其中在最前边有头指针和头结点组成其中,头指针是一个链表必要的元素,头结点可以使链表更为同一,但是头结点并非是一个链表的必要的元素。现在以一个结构体为一个节点,一个节点包含数据域,指针域两个部分,数据域用来存储需要存储的内容,指针域存储下一个结构体的地址。
typedef struct student
{
char name[20];
int age;
int number;
struct student *next;
}STU;
此时一个STU就是一个节点,其中存储一个学生的名字,年龄,学号,以及指向这个结构体类型的指针,绝不是指向自己的指针。
下面我将贴上以学生信息为节点,和以电影信息为结点的简单 单链表的建立,删除等操作已经附加了注释
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> typedef struct student /*以一个结构体为一个节点*/ { char name[20]; int age; int number; struct student *next; /*一个指向该结构体类型的指针*/ }STU; STU *start(STU *L,int n ) /*建立链表使用头插法(先来的在前)*/ { int i; STU *p; L=(STU *)malloc(sizeof(STU)); /*建立节点*/ (L)->next=NULL; for(i=0;i<n;i++) { p=(STU *)malloc(sizeof(STU)); printf("please enter a name and something "); scanf("%s %d %d",p->name,&p->age,&p->number); //printf("%s %d %d\n",p->name,p->age,p->number); p->next=(L->next); (L)->next=p; } return L; } void print(STU *L); void print(STU *L) /*输出链表*/ { //printf("********\n"); STU *temp; //printf("********\n"); temp=L->next; //printf("%p\n",temp); while(temp!=NULL) { //printf("********\n"); printf("%s %d %d ****\n",temp->name,temp->age,temp->number); temp=temp->next; } } int main() { int n; STU *L; printf("please enter a num"); scanf("%d",&n); L=start(L,n);/*注意函数返回值的机制,又返回值必须有一个接受的变量*/ //printf("%p\n",L); print(L); return 0; }
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> typedef struct film /*单链表的建立法2,尾插法*/ { /*以一个结构体为一个节点*/ char *name; //name=(char *)malloc(10*sizeof(char)); int num; struct film *next; }FILM; FILM *make(FILM *L,int n) /*建立单链表*/ { int i; FILM *p,*r; L=(FILM *)malloc(sizeof(FILM)); if(NULL==L) { return -1; } L->name=(char *)malloc(10*(sizeof(char))); r=L; /*使用R 来跟踪新建节点*/ for(i=0;i<n;i++) { p=(FILM *)malloc(sizeof(FILM)); p->name=(char *)malloc(10*(sizeof(char))); if(NULL==p) { return -1; } scanf("%s %d",p->name,&p->num); /*将节点放到表尾*/ r->next=p; r=p; } r->next=NULL; return L; } void print(FILM *L); void print(FILM *L) /*输出函数*/ { FILM *pTemp; pTemp=L->next; while(pTemp!=NULL) { printf("%s %d",pTemp->name,pTemp->num); pTemp=pTemp->next; printf("\n"); } } int main() { int n; FILM *L; printf("please enter some thing "); scanf("%d",&n); L=make(L,n); //clearList(L); print(L); return 0; } int clearList(FILM *L); /*删除一个链表*/ int clearList(FILM *L) { FILM *p,*q; p=L->next; while(p) { q=p->next; free(q); p=q; } L->next=NULL; return 0; } int getelem(FILM *L,int i); int getelem(FILM *L,int i) /*查找第i个节点的内容并显示*/ { int j; FILM *p; p=L->next; j=1; while(p && j<i) { p=p->next; ++j; } if(!q || j>i) { return -1; } else { printf("%s %d\n",p->name,p->num); } return 0; } int Listinsert(FILM *L,int i); /*给I处增加一个节点*/ int Listinsert(FILM *L,int i) { int j; FILM *p,*s; p=L; j=1; while(p && i<j) { p=p->next; ++j; } if(!p||j>i) { return -1; } else { s=(FILM *)malloc(sizeof(FILM)); scanf("%s %d",s->name,&s->num); s->next=p->next; p-next=s; } return 0; } int Listdel(FILM *L ,int i); /*删除一个节点*/ int Listdel(FILM *L ,int i) { int j; FILM *p,*q; p=*L; j=1; while(p->next && j<i) { p=p->next; ++j; } if(!(p->next) || j>i) { return -1; } else { q=p->next; p->next=q->next; free(q); } return 1; }
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> typedef struct film /*建立一个只有头结点的单链表*/ { char *name; int num; struct film *next; }FILM; FILM *make(FILM *L,int n) { int i; FILM *p,*r; L=(FILM *)malloc(sizeof(FILM)); r=L; for(i=0;i<n;i++) { p=(FILM *)malloc(sizeof(FILM)); p->name=(char *)malloc(10*sizeof(char)); scanf("%s %d",p->name,&p->num); r->next=p; r=p; } r->next=NULL; return L; } int main() { int n; FILM *L; printf("please enter some thing"); scanf("%d",&n); L=make(L,n); print(L); return 0; } int print(FILM *L); int print(FILM *L) { FILM *pTemp; pTemp=L->next; while(pTemp!=NULL) { printf("%s %d\n",pTemp->name,pTemp->num); pTemp=pTemp->next; } }
原文地址:http://blog.csdn.net/zmrlinux/article/details/45049501