数据结构与C语言实现(一)——链表及两个实例

来源:互联网 发布:wix 建站系统源码下载 编辑:程序博客网 时间:2024/06/06 11:45
//用数组实现线性表/*#include <stdio.h>#include <stdlib.h>#define MAXSIZE 11structLNode {char data[MAXSIZE];int  last;}L;typedef struct LNode * PList;void List_Adress()//测试结构体及内部元素地址{PList PtrL = &L;printf("L的地址为 %x\n", &L);printf("data地址为 %x\n", &L.data);printf("data[10]的地址为 %x\n", &L.data[10]);printf("last地址为 %x\n", &L.last);printf("L的地址为 %x\n", PtrL);}PList MakeEmpty(){PList PtrL = (PList)malloc(sizeof(struct LNode));PtrL->last = -1;//长度为-1.说明不存在。return PtrL;}int Find(char c, PList PtrL)//结构体指针作为参数,方便,其实用const可能更好{int i = 0;while ((i <= PtrL->last) && (PtrL->data[i] != c)){i++;}//printf("%d\n", PtrL->last);if (i > PtrL->last) return -1;//没找到,errorelse return ++i;}void Insert(char x, int i, PList PtrL){int j;if (PtrL->last == MAXSIZE - 1)//表空间已经满了{printf("Error:Full of the List\n");return;}if (i<1 || i>PtrL->last + 2)//合法性检查{printf("Error:The Postion Is Illegal\n");return;}for (j = PtrL->last; j >= i - 1; j--)PtrL->data[j + 1] = PtrL->data[j];//PtrL是结构体指针,必须用->PtrL->data[i - 1] = x;PtrL->last += 1;return;}void Delete(int i, PList PtrL){int j;if (i<1 || i>PtrL->last + 1){printf("Error:The Element not exist\n");return;}for (j = i; j <= PtrL->last; j++){PtrL->data[j - 1] = PtrL->data[j];}PtrL->last--;return;}int main(){//List_Adress();//说明结构体的地址是顺序存放的。LNode New_List = { {'1','2','4','5','6'},4 };PList New_PtrL = &New_List;int ans = Find('4', New_PtrL);printf("Find the index = %d \n", ans);Insert('3', 6, New_PtrL);for (int i = 0; i <= New_List.last; i++)putchar(New_List.data[i]);putchar('\n');Delete(2, New_PtrL);for (int i = 0; i <= New_List.last; i++)putchar(New_List.data[i]);return 0;}*/


/*#include <stdio.h>#include <stdlib.h>struct LNode{int data;LNode *next;};typedef struct LNode * PList;typedef struct LNode List;//创建一个链表PList Create(int length){PList head = NULL;PList p1 = NULL;PList p2 = NULL;for (int i = 0; i < length; i++){p1 = (PList)malloc(sizeof(List));if (head == NULL)//如果表没有头的话{head = p1;p2 = p1;}else{p2->next = p1;//将前一项的下一项指定为当前项p2 = p1;//将p2指向目前p1所开辟的内存空间里}p2->next = NULL;}return head;}int Length(PList PtrL){PList p = PtrL;//p指向表的第一个节点int j = 0;while (p){p = p->next;j++;}return j;}//按序号查找PList FindKth(int K, PList PtrL){PList p = PtrL;int i = 1;while (p != NULL && i < K){p = p->next;i++;}if (i == K) return p;else return NULL;}//按值查找PList Find(int X, PList PtrL){PList p = PtrL;while (p->data != X && p != NULL){p = p->next;}if (p == NULL) return NULL;//破坏循环条件为p到了链表尾端,那么说明没找到else return p;}//插入PList Insert(int X, int i, PList PtrL){PList previous, insert_one;//新节点插入在表头if (i == 1){insert_one = (PList)malloc(sizeof(struct LNode));insert_one->data = X;insert_one->next = PtrL;return insert_one;}//插入链表中段previous = FindKth(i - 1, PtrL);//首先找到插入的前一个位置if (previous == NULL)//如果找不到前一个位置,那么说明不可插入{printf("Error:arguement is illegal!");return NULL;}else{insert_one = (PList)malloc(sizeof(struct LNode));//因为要插入,所以要先申请一块内存空间insert_one->next = previous->next;//将插入节点的next指向变为和前一个指针一样的指向previous->next = insert_one;//将前一个节点的指向变成插入节点insert_one->data = X;//将数据赋值return PtrL;//链表首地址未发生变化,因此原样}}//删除第i个节点,注意要释放被删除节点的内存空间PList Delete(int i, PList PtrL){PList previous, target_node;//删除首地址if (i == 1){target_node = PtrL;if (PtrL != NULL) PtrL = PtrL->next;//将后一个节点赋值给PtrL的首地址else return NULL;free(target_node);//释放一块内存空间return PtrL;}//删除中段地址previous = FindKth(i - 1, PtrL);if (previous == NULL){printf("Error:%d node is not exist", i - 1);return NULL;}else if (previous->next == NULL){printf("Error:%d node is not exist", i);return NULL;}else{target_node = previous->next;previous->next = target_node->next;free(target_node);return PtrL;}}int main(){PList new_list =  Create(1);int length = Length(new_list);printf("初始链表长度为 %d \n", length);Insert(1, 2, new_list);length = Length(new_list);printf("初始链表长度为 %d \n", length);return 0;}*/


///*//一元多多项式的加法//1.先创建链表,存储多项式//2.输出多项式//3.两个多项式相加//4.输出多项式//*////*//1.链表头不存放数据,可以使得对链表的操作更加统一。(用pTail和pNew)//phead->next = NULL;//pTail = pHead;//pNew = NULL;////循环中//pNew = mall0c();//pTail->next=pNew;//pTail =pNew;//循环完//*///# include <stdio.h>//# include <malloc.h>////typedef struct dxs  //多项式节点//{//float coe;  //系数//int exp;   //指数//struct dxs * pNext;  //指针域////}DXS, *PDXS;////PDXS creat_dxs();   //创建多项式//void traverse(PDXS pHead);   //遍历多项式链表//PDXS add(PDXS Da, PDXS Db);  //多项式求和////int main(void)//{////用链表结构,创建两个多项式//PDXS Da = creat_dxs();//traverse(Da);////PDXS Db = creat_dxs();//traverse(Db);//////求两个多项式的加法//PDXS Dj = add(Da, Db);//traverse(Dj);////return 0;//}////PDXS creat_dxs()//{//PDXS pHead = (PDXS)malloc(sizeof(DXS)); //创建头结点//pHead->pNext = NULL;  //尾指针////PDXS pTail = pHead;//PDXS pNew = NULL;////int len;//float c;//int e;//int i;////printf("输入多项式的项数:len = ");//scanf("%d", &len);////for (i = 0; i < len; i++)//{//printf("分别输入第%d项的系数c、指数e:", i + 1);//scanf("%f%d", &c, &e);////pNew = (PDXS)malloc(sizeof(DXS));//////多项式项,系数、指数//pNew->coe = c;//pNew->exp = e;//pNew->pNext = NULL;////pTail->pNext = pNew;//pTail = pNew;//}////return pHead;//}//////遍历链表//void traverse(PDXS pHead)//历遍链表,然后输出用户输入的一组系数和指数//{//PDXS p = pHead->pNext;  //首节点。pHead里面应该没放任何数字////while (p != NULL)//{//printf("(%.2f %d), ", p->coe, p->exp);//p = p->pNext;//}//printf("\n");//}////////多项式相加//PDXS add(PDXS Da, PDXS Db)//{//PDXS Dj = (PDXS)malloc(sizeof(DXS));  //和的头结点//Dj->pNext = NULL;//PDXS pTail = Dj;  //和的尾节点////PDXS Dah = Da->pNext;  //指向多项式的首节点//PDXS Dbh = Db->pNext;//////循环遍历多项式A,B//while (Dah && Dbh)//{////比较当前两节点的指数////当前 A项节点指数 < B项节点指数//if (Dah->exp < Dbh->exp)//{//pTail->pNext = Dah;  //将此A项加入和链表中//pTail = Dah;////Dah = Dah->pNext;  //A多项式向后遍历//}//////当前 A项节点指数 < B项节点指数//else if (Dah->exp > Dbh->exp)//{//pTail->pNext = Dbh;  //将此B项加入和链表中//pTail = Dbh;////Dbh = Dbh->pNext;  // //B多项式向后遍历//}//////如果两节点的指数相等//else//{////当前指数的系数和不为0////A项中保存系数和,把此A项加入和链表中//if (0 != (Dah->coe + Dbh->coe))//{//Dah->coe = Dah->coe + Dbh->coe;//pTail->pNext = Dah;//pTail = Dah;//}//////A,B都向后遍历//Dah = Dah->pNext;//Dbh = Dbh->pNext;//}//}//////插入剩余段//if (Dah != NULL)//{//pTail->pNext = Dah;//}//if (Dbh != NULL)//{//pTail->pNext = Dbh;//}////return Dj;//}

//#include <stdio.h>//#include <stdlib.h>//#include <string.h>//#define N 10////typedef struct node//{//char name[20];//struct node *link;//}stud;////stud * creat(int n)//{//stud *p, *h, *s;//int i;//if ((h = (stud *)malloc(sizeof(stud))) == NULL)//{//printf("不能分配内存空间!");//exit(0);//}//h->name[0] = '\0';//h->link = NULL;//p = h;//for (i = 0; i<n; i++)//{//if ((s = (stud *)malloc(sizeof(stud))) == NULL)//{//printf("不能分配内存空间!");//exit(0);//}//p->link = s;//printf("请输入第%d个人的姓名", i + 1);//scanf("%s", s->name);//s->link = NULL;//p = s;//}//return(h);//}////stud * search(stud *h, char *x)//找这一个//{//stud *p;//char *y;//p = h->link;//while (p != NULL)//{//y = p->name;//if (strcmp(y, x) == 0)//return(p);//else p = p->link;//}//if (p == NULL)//printf("没有查找到该数据!");//}////stud * search2(stud *h, char *x)//找前一个//{//stud *p, *s;//char *y;//p = h->link;//s = h;//while (p != NULL)//{//y = p->name;//if (strcmp(y, x) == 0)//return(s);//else//{//p = p->link;//s = s->link;//}//}//if (p == NULL)//printf("没有查找到该数据!");//}////void insert(stud *p)//{//char stuname[20];//stud *s;//if ((s = (stud *)malloc(sizeof(stud))) == NULL)//{//printf("不能分配内存空间!");//exit(0);//}//printf("\n请输入你要插入的人的姓名:");//scanf("%s", stuname);//strcpy(s->name, stuname);//s->link = p->link;//p->link = s;//}////void del(stud *x, stud *y)//x是前一个节点,y是后一个节点//{//stud *s;//s = y;//x->link = y->link;//free(s);//}////void print(stud *h)//{//stud *p;//p = h->link;//printf("数据信息为:\n");//while (p != NULL)//{//printf("%s ", &*(p->name));//p = p->link;//}//}////void quit()//{//exit(0);//}////void menu(void)//{//system("cls");//printf("\t\t\t单链表C语言实现实例\n");//printf("\t\t|————————————————|\n");//printf("\t\t| |\n");//printf("\t\t| [1] 建 立 新 表 |\n");//printf("\t\t| [2] 查 找 数 据 |\n");//printf("\t\t| [3] 插 入 数 据 |\n");//printf("\t\t| [4] 删 除 数 据 |\n");//printf("\t\t| [5] 打 印 数 据 |\n");//printf("\t\t| [6] 退 出 |\n");//printf("\t\t| |\n");//printf("\t\t| 如未建立新表,请先建立! |\n");//printf("\t\t| |\n");//printf("\t\t|————————————————|\n");//printf("\t\t 请输入你的选项(1-6):");//}////int main()//{//int choose;//stud *head, *searchpoint, *forepoint;//char fullname[20];//////while (1)//{//menu();//scanf("%d", &choose);//switch (choose)//{//case 1:head = creat(N);//break;//case 2:printf("输入你所要查找的人的姓名:");//scanf("%s", fullname);//searchpoint = search(head, fullname);//printf("你所查找的人的姓名为:%s", *&searchpoint->name);//printf("\n按回车键回到主菜单。");//getchar(); getchar();//break;//case 3: printf("输入你要在哪个人后面插入:");//scanf("%s", fullname);//searchpoint = search(head, fullname);//printf("你所查找的人的姓名为:%s", *&searchpoint->name);//insert(searchpoint);//print(head);//printf("\n按回车键回到主菜单。");//getchar(); getchar();//break;//case 4:print(head);//printf("\n输入你所要删除的人的姓名:");//scanf("%s", fullname);//searchpoint = search(head, fullname);//forepoint = search2(head, fullname);//del(forepoint, searchpoint);//break;//case 5:print(head);//printf("\n按回车键回到主菜单。");//getchar(); getchar();//break;//case 6:quit();//break;//default:printf("你输入了非法字符!按回车键回到主菜单。");//system("cls");//menu();//getchar();//}//}//return 0;//}



阅读全文
0 0