『壹』 雙向鏈表字元串匹配查詢設計
#include <stdio.h>
#include <string.h> /*包含字元串比較的函數*/
typedef struct string
{
char *s; /*動態數組*/
int num; /*字元串的長度*/
struct string *next;
struct string *prior;
}
str;
int main(void)
{
char st[50];
int i , j = 0;
str *head,*ps,*lochead;
printf("請依次輸入鏈表中各個節點的字元串。\n");
head = (str *)malloc(sizeof(str));
printf("第%d個節點:",1);
scanf("%s",st);
head->num = strlen(st);
head->s = (char *)malloc( head->num * sizeof(char) );
strcpy( head->s , st);
lochead = head;
for( i = 2 ; i <= 20 ; i++)
{
ps = (str *)malloc(sizeof(str));
lochead->next = ps ;
ps->prior = lochead ;
printf("第%d個節點:",i);
scanf("%s",st);
ps->num = strlen(st);
ps->s = (char *)malloc( ps->num * sizeof(char) );
strcpy( ps->s , st);
lochead = ps;
}
head->prior = lochead ;
lochead->next = head ;
ps = head;
while(ps)
{
printf("請輸入要查找的字元串:(輸入exit退出)");
scanf("%s",st);
if(!strcmp("exit",st)) return 0;
for( i = 0 ; i < 20 ; i++)
if(strcmp(ps->s,st)) ps = ps->next; /*向後查詢*/
else break;
if(i == 20)
{
printf("沒有找到該字元串!\n");
}
else
{
printf("找到了該字元串,其地址為%x,本次查詢經過了%d個節點!\n",ps,i);
}
ps = head; /*這里可以不要,以後的查詢就從上次查詢到的那個位置開始*/
}
}
『貳』 雙向鏈表實現字元串條件表達式的求值
描述: 給定一個以字元串形式表示的算術表達式,計算該表達式的值。
表達式支持如下運算:「+、-、*、/」,其中「*」和「/」的優先順序要高於「+」和「-」;
不需要考慮括弧,且表達式之間沒有空格;
例如:對於表達式"3-2+15*2",該表達式值為31.
運行時間限制: 60 Sec
內存限制: 256 MByte
輸入: 加減乘除四則運算表達式,長度不超過1024位元組,運算式中不含有括弧和空格。
輸出: 表達式的運算結果。
樣例輸入: 3-2+15*2
樣例輸出: 31
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ListNode{
int m_nValue;
char m_nChar;
ListNode* m_pNext;
ListNode* m_pPrev;
};
ListNode* CreatNode(int m_nValue,int m_nChar,ListNode* m_pPrev,ListNode* m_pNext)
{
ListNode* m_pNode=new ListNode();
m_pNode->m_nChar=m_nChar;
m_pNode->m_nValue=m_nValue;
m_pNode->m_pNext=m_pNext;
m_pNode->m_pPrev=m_pPrev;
return m_pNode;
}
void DestroyList(ListNode* pHead)
{
ListNode* pNode=pHead;
while(pNode!=0){
pHead=pNode->m_pNext;
free(pNode);
pNode=pHead;
}
}
int StrCalculate(char* str)
{
if(str==NULL)
return -1;
int tmp=0;
int len;
int i,k=0;
ListNode* head=NULL;
ListNode* p=NULL;
ListNode* q=NULL;
p=q=head=(ListNode*)malloc(sizeof(ListNode));
len=strlen(str);
for(i=0;i<len;i++){
tmp=0;
while(str[i]>='0'&&str[i]<='9'){
tmp=tmp*10+str[i]-'0';
++i;
}
if(k==0){
head=CreatNode(tmp,'0',NULL,NULL);
p=head;
}
else{
q=CreatNode(tmp,'0',p,NULL);
p->m_pNext=q;
p=q;
k++;
}
if(i<len){
q=CreatNode(0,str[i],p,NULL);
p->m_pNext=q;
p=q;
k++;
}
else
break;
}
p=head;
while(p->m_pNext!=NULL){
if(p->m_nChar=='*'){
tmp=p->m_pPrev->m_nValue * p->m_pNext->m_nValue;
p->m_pPrev->m_nValue=tmp;
if(p->m_pNext->m_pNext!=NULL){
p->m_pPrev->m_pNext=p->m_pNext->m_pNext;
p->m_pNext->m_pNext->m_pPrev=p->m_pPrev;
}
else{
p=p->m_pPrev;
p->m_pNext=NULL;
break;
}
}
else if(p->m_nChar=='/'){
tmp=p->m_pPrev->m_nValue/p->m_pNext->m_nValue;
p->m_pPrev->m_nValue=tmp;
if(p->m_pNext->m_pNext!=NULL){
p->m_pPrev->m_pNext=p->m_pNext->m_pNext;
p->m_pNext->m_pNext->m_pPrev=p->m_pPrev;
}
else{
p=p->m_pPrev;
p->m_pNext=NULL;
break;
}
}
p=p->m_pNext;
}
p=head;
while(p->m_pNext!=NULL){
if(p->m_nChar=='+'){
tmp=p->m_pPrev->m_nValue+p->m_pNext->m_nValue;
p->m_pNext->m_nValue=tmp;
}
else if(p->m_nChar=='-'){
tmp=p->m_pPrev->m_nValue-p->m_pNext->m_nValue;
p->m_pNext->m_nValue=tmp;
}
p=p->m_pNext;
}
tmp=p->m_nValue;
printf("the result is : %d\n",tmp);
DestroyList(head);
return tmp;
}
int main()
{
char* m_str="2-3-12/2*4";
StrCalculate(m_str);
return 0;
}
『叄』 雙向鏈表問題
沒有全看完,只看到你出錯的地方,提幾點建議:
乘客姓名不要定義成char類型,應該是char []類型(字元數組),相關的函數參數等也要一並修改。你的錯誤很有可能就是這個原因造成的(未看完代碼,僅推測)。
創建了head和tail之後,應該把head->next鏈到tail上,tail->before鏈接到head上。關聯好了以後,再輸入新乘客。
『肆』 雙向鏈表的節點定義的問題,我是初學者,請幫忙看看,謝謝
1. 這個沒有先後順序,你可以試著將改成這樣:
typedef int DataType;//雙向鏈表中數據的類型
typedef struct DNode
{
DataType element;
struct DNode *prior,*next;
}*DoubleList,DNode;//定義雙向鏈表中一個節點
也是可以的,這個的意思就是,定義了一個DNode的結構體類型,和一個DoubleList的結構體指針類型,下次你在使用時,如果這樣申明一個變數:DNode node;就表示申明了一個結構體變數,而如果這樣:DoubleList douList;就表示申明了一個結構體指針變數。使用時,就將是node.element或douList->element。
2. 這個問題你看前面的typedef的定義,其實就是表示聲明自定義數據類型。此聲明定義了一個 int 的同義字,名字為 DataType。注意 typedef 並不創建新的類型。它僅僅為現有類型添加一個同義字。你可以在任何需要 int 的上下文中使用 DataType。
『伍』 雙向表鏈表
1.
h->name[0]='\0'; // '半形字元
查找函數有問題,找到前提下才輸出,
否則列印為找到。
以下是在你編寫的基礎上改正
2. 第2個你問的有些籠統
若2叉樹最簡單的辦法你建立好
二叉樹,然後對其遍歷(先,中,後)
最簡單的就是採用遞歸方式建立及遍歷
在遍歷過程中進行比對查找
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define N 5
typedef struct node
{
char name[20];
struct node *llink,*rlink;
}stud;
stud *creat(int n)
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("Can not allocate the memory!");
exit(0);
}
h->name[0]='\0';
h->llink=NULL;
h->rlink=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("Can not allocate the memory!");
exit(0);
}
p->rlink=s;
printf("Please input the No.%d name:",i+1);
scanf("%s",s->name);
s->llink=p;
s->rlink=NULL;
p=s;
}
h->llink=s;
p->rlink=h;
return(h);
}
stud *search(stud *h,char *x)
{
stud *p;
char *y;
p=h->rlink;
while(p!=h)
{
y=p->name;
if(strcmp(y,x)==0)
return(p);
else p=p->rlink;
}
return(NULL);
}
void print(stud *h)
{
int n;
stud *p;
p=h->rlink;
printf("The Data is:\n");
while(p!=h)
{
printf("%s ",&*(p->name));
p=p->rlink;
}
printf("\n");
}
int main()
{
int number;
char studname[20];
stud *head,*searchpoint;
number=N;
head=creat(number);
print(head);
printf("Please input the name you want to find:");
scanf("%s",studname);
searchpoint=search(head,studname);
if(searchpoint)
{
printf("what you want to find is :%s",*&searchpoint->name);
}
else
{
printf("Not Found!");
}
system("pause");
return(0);
}
『陸』 雙向鏈表流程圖
個人理解應該是1,000,000,000,000。每三個零一個逗號。構建一個雙向鏈表,每個鏈表的節點表示一個3位整數。從輸入的字元或字元串生成鏈表時,可以先把1作為頭節點加入,然後把000加入到下一節點,依次類推。兩個輸入的長整數分別用2個鏈表來表示。加法運算時,從尾部節點開始運算,兩個鏈表的同一個位置上兩個3位整數相加,如果需要進位就帶入下一節點。輸出可以新生成鏈表,輸出再從頭部輸出,每三位一個逗號。
『柒』 C語言單鏈表改成雙鏈表
#include "stdio.h"
#include <conio.h>
#include <stdlib.h>
struct node /*點鏈表的數據結構*/
{
char ch;
struct node *next;
struct node *front;
};
int main()
{
struct node *head, *rear; /*head是頭指針,指向點鏈表第一個節點*/
struct node *newnode; /*用於指向新申請的節點*/
struct node *oldnode; /*指向新節點的前一節點*/
char inputch;
int k=0;
while(1==1)
{
inputch=getch();
if(inputch==13)break;
newnode=(struct node*)malloc(sizeof(struct node));
newnode->ch=inputch;
if(k==0)
{
head=newnode;
oldnode=newnode;
head->next = NULL;
head->front = NULL;
}
else
{
oldnode->next=newnode;
newnode->front = oldnode;
}
oldnode=newnode; /*使當前的新節點變成下一次的前一節點*/
k++;
}
oldnode->next = NULL;
rear = oldnode;
newnode=head;
while(newnode!=NULL)
{
printf("%c",newnode->ch);
newnode=newnode->next;
}
printf("\n");
newnode=rear;
while(newnode!=NULL)
{
printf("%c",newnode->ch);
newnode=newnode->front;
}
}